Delen via


Visuele stijlen gebruiken met aangepaste en Owner-Drawn besturingselementen

In dit onderwerp wordt beschreven hoe u de API voor visuele stijlen gebruikt om visuele stijlen toe te passen op aangepaste besturingselementen of door de eigenaar getekende besturingselementen.

Besturingselementen tekenen met visuele stijlen

Visuele stijlen worden ondersteund door ComCtrl32.dll versie 6 en hoger. Als uw toepassing is geconfigureerd voor gebruik van ComCtrl32.dll versie 6 en hoger en als die versie beschikbaar is op het systeem, worden de huidige visuele stijlen automatisch toegepast op alle algemene besturingselementen in uw toepassing. De huidige visuele stijlen worden echter niet automatisch toegepast op aangepaste besturingselementen of door de eigenaar getekende besturingselementen. Uw toepassing moet code bevatten waarmee wordt gecontroleerd of visuele stijlen beschikbaar zijn en, als dat het zo is, de API voor visuele stijlen wordt gebruikt om de geselecteerde visuele stijlen toe te passen op uw aangepaste en door de eigenaar getekende besturingselementen.

Als u wilt controleren of visuele stijlen beschikbaar zijn, roept u de functie IsAppThemed aan. Als visuele stijlen niet beschikbaar zijn, gebruik dan alternatieve code om het besturingselement te tekenen.

Als er visuele stijlen beschikbaar zijn, kunt u functies voor visuele stijlen gebruiken, zoals DrawThemeText om uw controle-element weer te geven. Houd er rekening mee dat DrawThemeTextEx u in staat stelt om het uiterlijk van tekst aan te passen, waarbij bepaalde eigenschappen van het themalettertype behouden blijven terwijl u andere wijzigt.

Een besturingselement tekenen in de huidige visuele stijl

  1. Roep OpenThemeData-aan en geef de hwnd door van het besturingselement waarop u visuele stijlen wilt toepassen en een klassenlijst waarin het type van het besturingselement wordt beschreven. De klassen worden gedefinieerd in Vssym32.h. OpenThemeData retourneert een HTHEME-ingang, maar als de manager voor visuele stijlen is uitgeschakeld of als de huidige visuele stijl geen specifieke informatie levert voor een bepaald besturingselement, retourneert de functie NULL-. Als de retourwaarde NULLis, gebruik tekenfuncties voor niet-visuele stijlen.
  2. Als u de achtergrond van het besturingselement wilt tekenen, roept u DrawThemeBackground of DrawThemeBackgroundExaan.
  3. Als u de locatie van de inhoudsrechthoek wilt bepalen, roept u GetThemeBackgroundContentRect-aan.
  4. Als u tekst wilt weergeven, gebruikt u DrawThemeText of DrawThemeTextEx, waarbij de coördinaten worden gebaseerd op de rechthoek die wordt geretourneerd door GetThemeBackgroundContentRect. Met deze functies kan tekst worden weergegeven in het lettertype van het thema voor een opgegeven besturingsonderdeel en status, of in het lettertype dat momenteel is geselecteerd in de apparaatcontext (DC).
  5. Wanneer uw besturingselement een WM_DESTROY bericht krijgt, roept u CloseThemeData aan om de themahandle vrij te geven die is geretourneerd toen u OpenThemeDataaanriep.

In de volgende voorbeeldcode ziet u een manier om een knop te tekenen in de huidige visuele stijl.

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.
    }
}

De volgende voorbeeldcode bevindt zich in de WM_PAINT berichthandler voor een besturingselement met subklassen. De tekst voor het besturingselement wordt weergegeven in het lettertype voor visuele stijlen, maar de kleur is applicatiegedefinieerd, afhankelijk van de staat van het besturingselement.

// 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.
}

U kunt onderdelen van andere besturingselementen gebruiken en elk onderdeel afzonderlijk weergeven. Voor een agenda-besturingselement dat uit een raster bestaat, kunt u bijvoorbeeld elk vierkant dat door het raster wordt gevormd als een werkbalkknop behandelen door de themagreep als volgt te verkrijgen:

OpenThemeData(hwnd, L"Toolbar");

U kunt besturingsonderdelen combineren en vergelijken door OpenThemeData meerdere keren aan te roepen voor een bepaald besturingselement en de juiste themagreep te gebruiken om verschillende onderdelen te tekenen. In sommige visuele stijlen zijn bepaalde onderdelen echter mogelijk niet compatibel met andere onderdelen.

Een andere benadering voor het weergeven van besturingselementen in de actieve visuele stijl is het gebruik van de systeemkleuren. U kunt bijvoorbeeld systeemkleuren gebruiken om de tekstkleur in te stellen bij het aanroepen van de functie DrawThemeTextEx. De meeste systeemkleuren worden ingesteld wanneer een visueel stijlbestand wordt toegepast.

Reageren op themawijzigingen

Wanneer uw controlelement een WM_THEMECHANGED bericht ontvangt en een globale handle voor het thema vasthoudt, moet het het volgende doen:

  • Roep CloseThemeData aan om de bestaande themahandle te sluiten.
  • Roep OpenThemeData op om de themabehandeling op te halen voor de zojuist geladen visuele stijl.

Het volgende voorbeeld toont de twee aanroepen.

case WM_THEMECHANGED:
     CloseThemeData (g_hTheme);
     g_hTheme = OpenThemeData (hwnd, L"MyClassName");

Visuele stijlen inschakelen

visuele stijlen