Delen via


Aangepaste bedieningselementen

Deze sectie bevat informatie over toepassingsgedefinieerde of aangepaste besturingselementen.

De volgende onderwerpen worden besproken.

Besturingselementen voor Owner-Drawn maken

Knoppen, menu's, statische tekstbedieningselementen, keuzelijsten en vervolgkeuzelijsten kunnen worden gemaakt met een eigenaar-getekende stijl. Wanneer een besturingselement de door de eigenaar getekende stijl heeft, verwerkt het systeem de interactie van de gebruiker met het besturingselement zoals gebruikelijk, waarbij taken worden uitgevoerd zoals detecteren wanneer een gebruiker een knop heeft gekozen en de eigenaar van de knop van de gebeurtenis op de hoogte stelt. Omdat het besturingselement door de eigenaar getekend is, is het bovenliggende venster verantwoordelijk voor de visuele verschijning van het besturingselement. Het oudervenster ontvangt een bericht wanneer het besturingselement moet worden weergegeven.

Voor knoppen en besturingselementen voor statische tekst heeft de door de eigenaar getekende stijl invloed op de manier waarop het systeem het hele besturingselement tekent. Voor keuzelijsten en keuzelijsten met vervolgkeuzelijst tekent het bovenliggende venster de items in het besturingselement en tekent het besturingselement zijn eigen omtrek. Een toepassing kan bijvoorbeeld een keuzelijst aanpassen, zodat er een kleine bitmap naast elk item in de lijst wordt weergegeven.

In de volgende voorbeeldcode ziet u hoe u een door de eigenaar getekend statisch tekstbesturingselement maakt. Stel dat Unicode is gedefinieerd.

// g_myStatic is a global HWND variable.
g_myStatic = CreateWindowEx(0, L"STATIC", L"Some static text", 
            WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 
            25, 125, 150, 20, hDlg, 0, 0, 0);

In het volgende voorbeeld, vanuit de vensterprocedure voor het dialoogvenster dat het besturingselement bevat dat in het vorige voorbeeld is gemaakt, wordt het WM_DRAWITEM bericht verwerkt door de tekst in een aangepaste kleur weer te geven, met behulp van het standaardlettertype. Houd er rekening mee dat u BeginPaint- en EndPaint- niet hoeft aan te roepen bij het afhandelen van WM_DRAWITEM.

case WM_DRAWITEM:
{
    LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
    if (pDIS->hwndItem == g_myStatic)
    {
        SetTextColor(pDIS->hDC, RGB(100, 0, 100));
        WCHAR staticText[99];
        int len = SendMessage(myStatic, WM_GETTEXT, 
            ARRAYSIZE(staticText), (LPARAM)staticText);
        TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, staticText, len);
    }
    return TRUE;
}

Zie Een door de eigenaar getekende lijst maken en door de eigenaar getekende combinatielijstenvoor meer informatie over door de eigenaar getekende besturingselementen.

Het subklassen van de Window Class van een bestaand besturingselement

Het subklasseren van een bestaand besturingselement is een andere manier om een aangepast besturingselement te maken. De subklasseprocedure kan het geselecteerde gedrag van het besturingselement wijzigen door deze berichten te verwerken die van invloed zijn op het geselecteerde gedrag. Alle andere berichten worden doorgegeven aan de oorspronkelijke vensterprocedure voor de controle. Een toepassing kan bijvoorbeeld een kleine bitmap naast de tekst weergeven in een alleen-lezen, enkelregelig bewerkingselement door het besturingselement te subklassen en het WM_PAINT-bericht te verwerken. Zie Over vensterprocedures en Besturingselementen voor subklassenvoor meer informatie.

Een Application-Defined-vensterklasse implementeren

Als u een besturingselement wilt maken dat niet expliciet is gebaseerd op een bestaand besturingselement, moet de toepassing een vensterklasse maken en registreren. Het proces voor het registreren van een door de applicatie gedefinieerde vensterklasse voor een aangepast besturingselement is hetzelfde als het registreren van een klasse voor een gewoon venster. Als u een aangepast controle wilt maken, geeft u de naam van de vensterklasse op in de functie CreateWindowEx of in een dialoogvenstersjabloon. Elke klasse moet een unieke naam, een bijbehorende vensterprocedure en andere informatie hebben.

Met de vensterprocedure wordt het besturingselement minimaal gemaakt. Als een toepassing het besturingselement gebruikt om de gebruiker informatie te laten typen, verwerkt de vensterprocedure ook invoerberichten van het toetsenbord en de muis en verzendt meldingsberichten naar het bovenliggende venster. Als het besturingselement daarnaast controleberichten ondersteunt, verwerkt de vensterprocedure berichten die door het bovenliggende venster of andere vensters worden verzonden. Besturingselementen verwerken bijvoorbeeld vaak het WM_GETDLGCODE bericht dat door dialoogvensters wordt verzonden om een dialoogvenster om te leiden om toetsenbordinvoer op een bepaalde manier te verwerken.

De vensterprocedure voor een toepassingsgedefinieerd besturingselement moet elk vooraf gedefinieerd besturingselement in de volgende tabel verwerken als het bericht van invloed is op de werking van het besturingselement.

Bericht Aanbeveling
WM_GETDLGCODE Proces als het besturingselement gebruikmaakt van enter, ESC, TAB of pijltoetsen. De functie IsDialogMessage verzendt dit bericht naar besturingselementen in een dialoogvenster om te bepalen of de sleutels moeten worden verwerkt of doorgegeven aan het besturingselement.
WM_GETFONT Verwerken als het WM_SETFONT bericht ook wordt verwerkt.
WM_GETTEXT Verwerk indien de besturingstekst niet overeenkomt met de titel die is opgegeven door de functie CreateWindowEx.
WM_GETTEXTLENGTH Proces indien de besturingstekst niet hetzelfde is als de titel die is opgegeven door de functie CreateWindowEx.
WM_KILLFOCUS Verwerk indien het besturingselement een caret, een focusrechthoek of een ander item weergeeft om aan te geven dat het de invoerfocus heeft.
WM_SETFOCUS Verwerk indien het besturingselement een caret, een focusrechthoek of een ander item weergeeft om aan te geven dat het de invoerfocus heeft.
WM_SETTEXT Verwerk als de controltekst niet dezelfde is als de titel die wordt opgegeven door de functie CreateWindowEx.
WM_SETFONT Verwerken als het besturingselement tekst toont. Het systeem verzendt dit bericht bij het maken van een dialoogvenster met de stijl DS_SETFONT.

 

Toepassingsgedefinieerde besturingsberichten zijn specifiek voor het opgegeven besturingselement en moeten expliciet naar het besturingselement worden verzonden met behulp van een SendMessage- of SendDlgItemMessage-functie. De numerieke waarde voor elk bericht moet uniek zijn en mag niet conflicteren met de waarden van andere vensterberichten. Om ervoor te zorgen dat door de toepassing gedefinieerde berichtwaarden niet conflicteren, moet een toepassing elke waarde maken door een uniek getal toe te voegen aan de WM_USER waarde.

Meldingen verzenden vanuit een besturingselement

Aangepaste besturingselementen zijn mogelijk vereist voor het verzenden van meldingen van gebeurtenissen naar het bovenliggende venster, zodat de hosttoepassing op deze gebeurtenissen kan reageren. Een aangepaste lijstweergave kan bijvoorbeeld een melding verzenden wanneer de gebruiker een item selecteert en een andere melding wanneer er op een item wordt gedubbelklikt.

Meldingen worden verzonden als WM_COMMAND of WM_NOTIFY berichten. WM_NOTIFY berichten meer informatie bevatten dan WM_COMMAND berichten.

De besturingselement-id is een uniek nummer dat door de toepassing wordt gebruikt om het besturingselement te identificeren dat het bericht verzendt. De applicatie stelt de identificator voor een besturingselement in wanneer het besturingselement wordt gecreƫerd. De toepassing geeft de id op in de parameter hMenu van de functie CreateWindowEx of in de -id lid van de DLGITEMTEMPLATEEX- structuur.

Omdat het besturingselement zelf de besturingselement-id niet instelt, moet het besturingselement de id ophalen voordat meldingen kunnen worden verzonden. Een besturingselement moet de GetDlgCtrlID functie gebruiken om een eigen controle-id op te halen. Hoewel de besturingselement-id wordt opgegeven als de menugreep wanneer het besturingselement wordt gemaakt, kan de functie GetMenu niet worden gebruikt om de id op te halen. Een besturingselement kan ook de id ophalen uit het hMenu lid in de CREATESTRUCT- structuur tijdens het verwerken van het WM_CREATE bericht.

In de volgende voorbeelden, waarbij hwndControl de greep van het besturingselementvenster is en CN_VALUECHANGED een aangepaste meldingsdefinitie is, ziet u de twee manieren om een specifieke melding voor besturingselementen te verzenden.

 // Send as WM_COMMAND.
SendMessage(GetParent(hwndControl), 
    WM_COMMAND,
    MAKEWPARAM(GetDlgCtrlID(hwndControl), CN_VALUECHANGED),
    (LPARAM)hwndControl);

// Send as WM_NOTIFY.           
NMHDR nmh;
nmh.code = CN_VALUECHANGED;
nmh.idFrom = GetDlgCtrlID(hwndControl);
nmh.hwndFrom = hwndControl;
SendMessage(GetParent(hwndControl), 
    WM_NOTIFY, 
    (WPARAM)hwndControl, 
    (LPARAM)&nmh);

Houd er rekening mee dat de NMHDR- structuur deel kan uitmaken van een grotere, door controle gedefinieerde structuur die aanvullende informatie bevat. In het voorbeeld zijn de oude en nieuwe waarden van het besturingselement mogelijk opgenomen in deze structuur. (Dergelijke uitgebreide structuren worden gebruikt met veel standaardmeldingen; zie bijvoorbeeld LVN_INSERTITEM, die gebruikmaakt van de NMLISTVIEW- structuur.)

Toegankelijkheid

Alle algemene besturingselementen ondersteunen Microsoft Active Accessibility (MSAA), waarmee programmatische toegang mogelijk is door toepassingen met toegankelijke technologie, zoals schermlezers. MSAA stelt UI Automation, een nieuwere technologie, ook in staat om te communiceren met besturingselementen.

Aangepaste bedieningselementen moeten de IAccessible-interface (ter ondersteuning van MSAA) of de UI Automation-interfaces, of beide implementeren. Anders kunnen producten van toegankelijke technologie slechts zeer beperkte informatie verkrijgen over het besturingsvenster, geen toegang hebben tot de eigenschappen van het besturingselement en kunnen gebeurtenissen in het besturingselement niet worden geactiveerd.

Zie Windows Automation API-voor meer informatie over het toegankelijk maken van uw beheer.

conceptuele

Referentie voor algemeen beheer

Het uiterlijk van een controle aanpassen met Custom Draw

Controleberichten

Visuele stijlen gebruiken met Owner-Drawn Besturingselementen