Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a témakör azt ismerteti, hogyan alkalmazhat vizuális stílusokat egyéni vezérlőkre vagy tulajdonos által rajzolt vezérlőkre a visual styles API használatával.
Rajzoló vezérlők vizuális stílusokkal
A vizuális stílusokat ComCtrl32.dll 6-os és újabb verziói támogatják. Ha az alkalmazás úgy van konfigurálva, hogy ComCtrl32.dll 6-os vagy újabb verziót használjon, és ha ez a verzió elérhető a rendszeren, a rendszer automatikusan alkalmazza az aktuális vizuális stílusokat az alkalmazás összes gyakori vezérlőjén. Az aktuális vizualizációstílusok azonban nem lesznek automatikusan alkalmazva az egyéni vezérlőkre vagy a tulajdonos által rajzolt vezérlőkre. Az alkalmazásnak olyan kódot kell tartalmaznia, amely ellenőrzi, hogy elérhetők-e a vizuális stílusok, és ha igen, a visual styles API használatával alkalmazza az aktuálisan kiválasztott vizuális stílusokat az egyéni és a tulajdonos által rajzolt vezérlőkre.
Ha ellenőrizni szeretné, hogy elérhetők-e vizuális stílusok, hívja meg az IsAppThemed függvényt. Ha a vizuális stílusok nem érhetők el, használja a tartalék kódot a vezérlő rajzolásához.
Ha elérhetők a vizuális stílusok, akkor a vezérlő megjelenítéséhez olyan vizuális stílusfüggvényeket használhat, mint például a DrawThemeText. Vegye figyelembe, hogy DrawThemeTextEx lehetővé teszi a szöveg megjelenésének testreszabását, megtartva a téma betűtípusának bizonyos tulajdonságait, miközben másokat módosít.
Vezérlőelem rajzolása az aktuális vizualizációs stílusban
- Hívja meg OpenThemeData, átadva a vezérlő hwnd, amelyhez vizuális stílusokat szeretne alkalmazni, valamint egy osztálylistát, amely leírja a vezérlő típusát. Az osztályok a Vssym32.h-ban vannak definiálva. OpenThemeData egy HTHEME-leírót ad vissza, de ha a vizualizációstílus-kezelő le van tiltva, vagy az aktuális vizualizációs stílus nem ad meg konkrét információkat egy adott vezérlőelemhez, a függvény NULLad vissza. Ha a visszatérési érték NULL, használjon nem vizuális stílusú rajzolási függvényeket.
- A vezérlőháttér rajzolásához hívja meg DrawThemeBackground vagy DrawThemeBackgroundEx.
- A tartalom téglalap helyének meghatározásához hívja meg GetThemeBackgroundContentRect.
- A szöveg megjelenítéséhez használja a DrawThemeText vagy DrawThemeTextEx, és a GetThemeBackgroundContentRectáltal visszaadott téglalapra alapozza a koordinátákat. Ezek a függvények képesek megjeleníteni a szöveget akár a téma betűtípusában egy meghatározott vezérlőrészhez és állapothoz tartozóan, vagy az eszközkörnyezet (DC) jelenleg kiválasztott betűtípusában.
- Amikor a vezérlő egy WM_DESTROY üzenetet kap, hívja meg a CloseThemeData függvényt, hogy felengedje a OpenThemeDatahívásakor visszaadott témafogantyút.
Az alábbi példakód bemutatja, hogyan rajzolhat gombvezérlőt az aktuális vizualizációs stílusban.
HTHEME hTheme = NULL;
hTheme = OpenThemeData(hwndButton, L"Button");
// ...
DrawMyControl(hDC, hwndButton, hTheme, iState);
// ...
if (hTheme)
{
CloseThemeData(hTheme);
}
void DrawMyControl(HDC hDC, HWND hwndButton, HTHEME hTheme, int iState)
{
RECT rc, rcContent;
TCHAR szButtonText[255];
HRESULT hr;
size_t cch;
GetWindowRect(hwndButton, &rc);
GetWindowText(hwndButton, szButtonText,
(sizeof(szButtonText) / sizeof(szButtonText[0])+1));
hr = StringCchLength(szButtonText,
(sizeof(szButtonText) / sizeof(szButtonText[0])), &cch);
if (hTheme)
{
hr = DrawThemeBackground(hTheme, hDC, BP_PUSHBUTTON, iState, &rc, 0);
if (SUCCEEDED(hr))
{
hr = GetThemeBackgroundContentRect(hTheme, hDC, BP_PUSHBUTTON,
iState, &rc, &rcContent);
}
if (SUCCEEDED(hr))
{
hr = DrawThemeText(hTheme, hDC, BP_PUSHBUTTON, iState,
szButtonText, cch,
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
0, &rcContent);
}
}
else
{
// Draw the control without using visual styles.
}
}
Az alábbi példakód egy alosztályozott gombvezérlő WM_PAINT üzenetkezelőjében található. A vezérlőelem szövegét a vizualizációstílusok betűtípusa rajzolja meg, a szín azonban a vezérlőelem állapotától függően alkalmazásalapú.
// textColor is a COLORREF whose value has been set according to whether the button is "hot".
// paint is the PAINTSTRUCT whose members are filled in by BeginPaint.
HTHEME theme = OpenThemeData(hWnd, L"button");
if (theme)
{
DTTOPTS opts = { 0 };
opts.dwSize = sizeof(opts);
opts.crText = textColor;
opts.dwFlags |= DTT_TEXTCOLOR;
WCHAR caption[255];
size_t cch;
GetWindowText(hWnd, caption, 255);
StringCchLength(caption, 255, &cch);
DrawThemeTextEx(theme, paint.hdc, BP_PUSHBUTTON, CBS_UNCHECKEDNORMAL,
caption, cch, DT_CENTER | DT_VCENTER | DT_SINGLELINE,
&paint.rcPaint, &opts);
CloseThemeData(theme);
}
else
{
// Draw the control without using visual styles.
}
Más vezérlők részeit is használhatja, és külön renderelheti az egyes részeket. Például egy rácsból álló naptárvezérlőnél a rács által alkotott négyzeteket úgy kezelheti, mint eszköztárgombokat, ha a témafogantyút az alábbiak szerint szerzi be:
OpenThemeData(hwnd, L"Toolbar");
A vezérlőrészek keveréséhez és egyeztetéséhez meghívhatja OpenThemeData többször egy adott vezérlőhöz, és a megfelelő témafogóponttal különböző részeket rajzolhat. Bizonyos vizuális stílusokban azonban előfordulhat, hogy egyes részek nem kompatibilisek más részekkel.
Az aktív vizualizációs stílusban a vezérlők megjelenítésének másik módszere a rendszerszínek használata. Rendszerszínekkel például beállíthatja a szövegszínt a DrawThemeTextEx függvény meghívásakor. A legtöbb rendszerszín vizuális stílusfájl alkalmazásakor van beállítva.
Válasz a témamódosításokra
Amikor a vezérlő egy WM_THEMECHANGED üzenetet kap, és egy globális hivatkozást tart a témára, a következőt kell tennie:
- A meglévő témaleíró bezárásához hívja meg CloseThemeData.
- Hívja meg OpenThemeData, hogy lekérje a téma kezelőt az újonnan betöltött vizuális stílushoz.
Az alábbi példa a két hívást szemlélteti.
case WM_THEMECHANGED:
CloseThemeData (g_hTheme);
g_hTheme = OpenThemeData (hwnd, L"MyClassName");
Kapcsolódó témakörök