|
|
ShowMessage, MessageBox ablakának igazítása tetszőleges helyre
|
|
Példaprogram letöltése
5601 bájt
|
Ha a ShowMessage vagy a MessageBox függvénnyel egy üzenetet jelenítünk meg, akkor a dialógus ablak minden esetben a képernyő közepén jelenik meg. Mellékelt példában bemutatjuk, hogy miként pozícionálhatjuk e két ablakot tetszőleges helyre.
Először is kell hozzá egy függvény, ami a következőképpen néz ki:
function WinProc1(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
A függvény neve természetesen bármi lehet, de a deklarációnak meg kell egyeznie ezzel. A feladat megoldásához az ún. Hook technikát használjuk, vagyis ezt a függvényt regisztráljuk a SetWindowsHookEx függvény segítségével. Ennek eredménye az lesz, hogy amikor a bevezetőben említett két függvény valamelyikét meghívjuk, akkor az üzenet ablak megjelenése előtt lefut a saját függvényünk, amiben beállíthatjuk az ablak jellemzőit.
Most nézzük meg a Hook regisztrálását, ami a Button1 OnClick eseményének bekövetkeztekor történik meg:
procedure TForm1.Button1Click(Sender: TObject);
var
hInst: longint;
Thread: longint;
begin
hInst := GetWindowLong(Handle, GWL_HINSTANCE);
Thread := GetCurrentThreadId;
hHook := SetWindowsHookEx(WH_CBT, WinProc1, hInst, Thread);
ShowMessage('Ez a Message Box a képernyő bal-felső sarkába van igazítva!');
end;
Ezzel eddig csak azt értük el, hogy az üzenet ablak megjelenése előtt meghívódik a WinProc1 nevű függvényünk. Az ablak pozicionálását ebben végezzük el:
function WinProc2(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
var
dRect:TRect;
x, y:integer;
begin
Csak akkor hajtjuk végre a módosítást, ha a code paraméter értéke HCBT_ACTIVATE.
if code = HCBT_ACTIVATE then begin
A GetWindowRect függvénnyel lekérdezzük az ablak koordinátáit, majd kiszámoljuk az új koordinátákat.
GetWindowRect(wParam, dRect);
x:=Form1.Left + (Form1.Width div 2) - ((dRect.Right-dRect.Left) div 2);
y:=Form1.Top + (Form1.Height div 2) - ((dRect.Bottom-dRect.Top) div 2);
A SetWindowPos függvénnyel beállítjuk az új koordinátákat, és az ablak egyéb jellemzőit.
SetWindowPos(wParam, 0, x, y, 0, 0, SWP_NOSIZE+SWP_NOZORDER+SWP_NOACTIVATE);
Megszüntetjük a Hook-ot, vagyis visszaállítjuk az eredeti állapotot. Ezután az üzenet ablakok megnyitása előtt már nem fut le ez a függvény.
UnhookWindowsHookEx(hHook);
end;
result:=0;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 307. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|