11. GyIK (FAQ)
2014.06.08. 20:24
Példa: dlg_three
Ez egy rövidke fejezet lesz, a sokszor előforduló gondokkal.
Szín megváltoztatása
Érdemes kerülni a szöveg színezését, mert csak bántja a szemet. Mindazonáltal néha valóban hasznos dolog, például ha egy URL link működését szeretnénk szimulálni.
Képesek vagyunk megváltoztatni a színeket, hiszen ezek is a windóz üzenetei. Például a DialogBox színe a WM_CTLCOLORDLG segítségével módosítható.
Először létrehozunk egy ecsetet a háttér festésére, és tároljuk későbbre.
HBRUSH g_hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
case WM_CTLCOLORDLG:
return (LONG)g_hbrBackground;
case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC)wParam;
SetTextColor(hdcStatic, RGB(255, 255, 255));
SetBkMode(hdcStatic, TRANSPARENT);
return (LONG)g_hbrBackground;
}
break;
Figyeljük meg azt a sort, ami a hátteret beállítja átlátszóra! Ha elhagyjuk ezt a sort, akkor az ecset kifesti a megadott színnel a hátteret. Ekkor viszont ha a szöveget rajzolja, akkor felülírja az alap háttérszínnel. Állítsuk a szöveg rajzoló módot átlátszóra, hogy megoldjuk ezt a problémát!
A hagyományos vezérlőknek nagyon sok színe megváltoztatható, ezek listáját megtaláljuk ha megnézzük a Win32 referenciát (pl MSDN). Egyszerűen keressünk rá a WM_CTLCOLOR* kulcsszóra! A vezérlő kétféle választ adhat. Vagy WM_CTLCOLOREDIT ha megáltoztatható, vagy WM_CTLCOLORSTATIC ha nem. Ha több STATIC vezérlőnk is van, amiknek eltér a színe, akkor az ID alapján tudjuk őket megkülönböztetni. A HWND-t kell nézni az lParam-ban, és a GetDlgCtlrID() segítségével kapjuk meg az ID-t. Ne feledjük, hogy a szerkesztő minden STATIC vezérlőnek IDC_STATIC (-1) értéket ad, tehát ha meg akarjuk őket különböztetni egymástól, akkor külön ID-t kell nekik adnunk.
Az ikon beállítása
Ez viszonylag egyszerű feladat, csak ki kell adnunk a WM_SETICON üzenetet a párbeszéd ablaknak. Ezt kétszer kell megtennünk, egyszer a kis ikonnak az ablak sarkában, egyszer pedig a nagy ikonnak ha Alt+Tab-ot nyomna a user. Ha csak egy méretű ikonunk van, akkor elég ugyanazt a handlert elküldeni mindkét esetben.
Az alábbi kóddal beállíthatjuk az alkalmazás alapértelmezett ikonját:
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION))); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)));
Amikor saját ikonnal helyettesítjük a default ikont, nem szabad elfelejteni lecserélni a LoadIcon() HINSTANCE paraméterét az alkalmazásunk példányára (ha nincs eltárolva a WinMain()-ban, akkor a GetModuleHandle(NULL) segítségével kideríthetjük).
Miért nem működik a ComboBox-om?
Sokszor előforduló hiba, hogy létrehozunk egy kombinált listát, de az nem jelenik meg a program futásakor. Amikor megadjuk a magasságát, akkor az egész vezérlő magasságát adjuk meg, beleértve a legördülő lista méretét is! Ha például 100 pixelnek adjuk meg, akkor ebből 30 pixel (legyen ez most az alapértelmezett) a nyíl amire rákattintunk, és marad még 70 pixel a legördülő résznek. Ha VC++ erőforrás szerkesztőt használunk, akkor a függőleges méretet nem is adhatjuk meg. Rá kell bökni a nyílra, és a legördülő részt méretezhetjük tetszés szerint.
Referenciák
Érdemes a továbbiak ügyében szétnézni a Microsoft MSDN oldalán itt.
A kulcsszavak ezek: User Interface Services, Windows Controls, néha a Platform SDK.
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.