4. Most már az ablakunk is csináljon valamit (handling_messages)!
2014.06.02. 20:29
Példa: window_click
Az rendben, hogy van egy ablakunk, de a default dolgokon kívül (átméretezés, bezárás, stb) semmit sem csinál. Nagyon izgi. :(
Ebben a példában elővesszük az előző programunkat (vagy megnyitjuk a window_click projektet), és ezen példán keresztül megnézzük, hogy miként működik az üzenetkezelés. Programunk megmondja, hogy mi a neve. Haszna semmi, de közben ismerkedünk a WndProc()-cal.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
Ez ugye ismerős? Tud bezárni, visszajelezni, és továbbadni az üzenetet. Tegyük fel, hogy szeretnénk egerészni is!
Ha megnyomjuk az egér bal gombját, akkor történjen valami. Ehhez hozzá kell adnunk az eseménykezelőhöz a WM_LBUTTONDOWN üzenetet (vagy WM_RBUTTONDOWN, WM_MBUTTONDOWN értelemszerűen a jobb, illetve középső gombhoz).
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: // <- // <- ide jön a te cuccod break; // <- case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
Általában mindegy az üzenetek sorrendje, csak azt ne felejtsük el, hogy tegyük ki mindig a break kulcsszót! Ellenkező esetben összetorlódnak, mi meg kereshetjük a hibát! Láthatjuk, hogy hozzáadtunk egy új sort a switch() szerkezethez! Most belepakoljuk azt a kódot, ami megmutatja a program nevét.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: // BEGIN NEW CODE { char szFileName[MAX_PATH]; HINSTANCE hInstance = GetModuleHandle(NULL); GetModuleFileName(hInstance, szFileName, MAX_PATH); MessageBox(hwnd, szFileName, "This program is:", MB_OK | MB_ICONINFORMATION); } // END NEW CODE break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
A GetModuleHandle() mondja meg, hogy melyik programról kérjük az információt, és a GetModuleFileName() adja meg végülis a választ. TODO: Ezt a GetModuleHandle() dolgot nem teljesen értem.
A GetModuleFileName() második paramétere LPTSTR (vagy LPSTR a régi hivatkozások szerint), ami nem más, mint char *, amit karakter tömbként definiálunk:
char szFileName[MAX_PATH];
MAX_PATH egy makró a window.h fejléc állományból, ami definiálja a fájlnév tárolásához szükséges puffer méretét a Win32 alatt.
Harmadik paraméter a MAX_PATH (újra előkerült). A GetModuleFileName() számára közli a pufferméretet.
A GetModuleFileName() meghívását követően szFileName feltöltődik egy nulla lezárású sztringgel, ami a .exe fájl nevét tartalmazza. Ezt egyszerűen átadjuk a MessageBox() függvénynek. Ez a felhasználóval való kapcsolattartás legegyszerűbb módja.
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.