HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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;


Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |