Megosztás:


Vizuális stílusok használata egyéni és Owner-Drawn vezérlőkkel

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

  1. 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.
  2. A vezérlőháttér rajzolásához hívja meg DrawThemeBackground vagy DrawThemeBackgroundEx.
  3. A tartalom téglalap helyének meghatározásához hívja meg GetThemeBackgroundContentRect.
  4. 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.
  5. 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");

Vizuális stílusok engedélyezése

vizuális stílusok