Példa: app_one
A következőkben készítünk egy szövegszerkesztő programot, ami képes fájl megnyitására, szerkesztésére és mentésére. Lehetne a kész programot is vizsgálgatni, de sok értelme nem lenne. Ezért menet közben fogjuk felépíteni, kezdve a csupasz váztól, majd egyre több hasznos dologgal vértezzük fel, míg végül elkészül.
Első lépésként létrehozunk egy ablakot egy EDIT vezérlővel. Ez lesz a programunk gerince. A vázat a Simple Window alkalmazás jelenti, amihez hozzáadunk egy #define sort az új vezérlőnek és két új üzenet kezelőt.
#define IDC_MAIN_EDIT 101
case WM_CREATE: { HFONT hfDefault; HWND hEdit; hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL); if(hEdit == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hfDefault = GetStockObject(DEFAULT_GUI_FONT); SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0)); } break; case WM_SIZE: { HWND hEdit; RECT rcClient; GetClientRect(hwnd, &rcClient); hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT); SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER); } break;
Vezérlő létrehozása
A vezérlők létrehozása mint minden más ablaknál a CreateWindowEx() API hívással történik. Átadjuk az előre regisztrált osztályt amire szükségünk van (jelen esetben ez az EDIT), és máris van egy hagyományos szerkesztő vezérlőnk. Írunk egy listát hogy milyen vezérlőket szeretnénk az ablakunkban látni, és a CreateWindowEx() az erőforrásban leírtak szerint szépen elkészíti.
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL); if(hEdit == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);
Láthatjuk, hogy jó pár stílust megadtunk. Az elején még egyértelmű hogy mik ezek: Gyermekobjektum legyen, látható, scrollbar-okkal. A többi már nem egyértelmű. Legyen a vezérlő több soros, és a scroll-ok automatikusan gördüljenek a végére gépelés közben. A szabályos-, és bővített stílusok (WS_*, WS_EX_*) listáját megnézhetjük az MSDN-en, és vezérlőspecifikusan is (itt ES_*).
hEdit néven elmentjük a szerkesztő vezérlőnk handlerét, hogy később tudjunk rá hivatkozni. A méretét most nem adjuk meg, hanem később a WM_SIZE parancssal az ablak mindenkori méretéhez igazítjuk.
A vezérlő méretének dinamikus beállítása
Általában ha az ablakunk méretezhető, akkor gondoskodnunk kell arról, hogy a vezérlők is rendben átméreteződjenek, és a pozíciójuk megfelelő legyen.
GetClientRect(hwnd, &rcClient); hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT); SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
Mivel most csak egy vezérlőnk van, viszonylag egyszerű a dolgunk. A GetClientRect() megadja nekünk az ablak "kliens területének" méretét, vagyis azt a téglalapot, ahol a vezérlőnk megjelenhet. Ezen értékek közül a bal felső sarok koordinátái mindig (0,0) ezért ezzel nem kell foglalkozni. Fontosabb a jobb alsó, mert ez adja meg a téglalap méretét.
A GetDlgItem() megadja a vezérlő handlerét, aminek segítségével már átmérezezhetjük a vezérlőt. Ezt a SetWindowPos() fogja nekünk megtenni. Beállítja a vezérlő bal felső sarkát az ablak bal felső sarkába, és átméretezi, hogy pontosan akkora legyen mint az ablak általunk használható hasznos területe. Természetesen megtehetjük, hogy csak az ablak felét töltse ki, és a fennmaradó részre tehetünk további vezérlőket.
Más vezérlők létrehozása futásidőben
Na ez az, amit most kihagyunk, mert különben átmegyünk unalmasba! :) Az MSDN-en meg lehet mindet találni, ugyanaz mint fentebb. Ráadásul a következőkben úgyis előkerülnek, szóval nagyon fogjuk tudni.
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.