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:

https://win32learning.blog.hu/api/trackback/id/tr106260222

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.

Nincsenek hozzászólások.
süti beállítások módosítása