Delen via


TN031: Besturingsbalken

Opmerking

De volgende technische opmerking is niet bijgewerkt sinds deze voor het eerst is opgenomen in de onlinedocumentatie. Als gevolg hiervan zijn sommige procedures en onderwerpen mogelijk verouderd of onjuist. Voor de meest recente informatie is het raadzaam om te zoeken naar het onderwerp waarin u geïnteresseerd bent in de onlinedocumentatie-index.

In deze opmerking worden de besturingsbalkklassen in MFC beschreven: de algemene CControlBar, CStatusBar, CToolBar, CDialogBar en CDockBar.

CControlBar

A ControlBar is een CWnd-afgeleide klasse die:

  • Is uitgelijnd op de boven- of onderkant van een framevenster.

  • Kan onderliggende items bevatten die ofwel op HWND gebaseerde besturingselementen zijn (bijvoorbeeld CDialogBar) of items die niet op HWND gebaseerd zijn (bijvoorbeeld CToolBar, CStatusBar).

Besturingsbalken ondersteunen de aanvullende stijlen:

  • CBRS_TOP (de standaardinstelling) bevestigt de besturingsbalk bovenaan.

  • CBRS_BOTTOM de besturingsbalk aan de onderkant vastzetten.

  • CBRS_NOALIGN De besturingsbalk niet verplaatsen wanneer de oudergrootte wordt aangepast.

Klassen die zijn afgeleid van CControlBar bieden interessantere implementaties:

  • CStatusBar Een statusbalk, items zijn statusbalkvensters met tekst.

  • CToolBar Een werkbalk bevat bitmapknoppen die in een rij zijn uitgelijnd.

  • CDialogBar Een werkbalkachtig frame met standaardbesturingselementen voor vensters (gemaakt vanuit een dialoogvenstersjabloonresource).

  • CDockBar Een gegeneraliseerde dockingruimte voor andere CControlBar afgeleide objecten. De specifieke lidfuncties en -variabelen die beschikbaar zijn in deze klasse, zullen waarschijnlijk veranderen in toekomstige releases.

Alle besturingsbalkobjecten en vensters zijn onderliggende vensters van een hoofdframevenster. Ze worden meestal toegevoegd als een gelijkwaardige component aan het clientgebied van het frame (bijvoorbeeld een MDI-Client of schermweergave). De ID van het kindvenster van een besturingsbalk is belangrijk. De standaardindeling van de besturingsbalk werkt alleen voor besturingsbalken met id's in het bereik van AFX_IDW_CONTROLBAR_FIRST tot AFX_IDW_CONTROLBAR_LAST. Hoewel er een bereik van 256 besturingsbalk-id's is, zijn de eerste 32 van deze besturingsbalk-id's speciaal omdat ze rechtstreeks worden ondersteund door de afdrukvoorbeeldarchitectuur.

De CControlBar klasse biedt standaard implementatie voor:

  • De besturingsbalk uitlijnen op de boven-, onder- of zijkant van het frame.

  • Control-itemarrays toewijzen.

  • Ondersteuning voor de implementatie van afgeleide klassen.

C++ besturingsbalkobjecten worden meestal ingebed als leden van een CFrameWnd afgeleide klasse en worden opgeruimd wanneer het bovenliggende HWND object en het object worden vernietigd. Als u een besturingsbalkobject wilt toewijzen aan de heap, kunt u het m_bAutoDestruct lid eenvoudig instellen op TRUE om de besturingsbalk aan te roepen delete this; wanneer de HWND balk wordt vernietigd.

Opmerking

Als u uw eigen CControlBar-afgeleide klasse maakt in plaats van een van de afgeleide klassen van MFC te gebruiken, zoals CStatusBar, CToolBarof CDialogBar, moet u het m_dwStyle gegevenslid instellen. Dit kan worden gedaan in het overschrijven van Create:

// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create(CWnd* pParentWnd,
    DWORD dwStyle,
    UINT nID)
{
    m_dwStyle = dwStyle;

.
.
.
}

Indelingsalgoritme voor de besturingsbalk

Het algoritme voor de indeling van de besturingsbalk is heel eenvoudig. Het framevenster verzendt een bericht WM_SIZEPARENT naar alle kinderen in het bereik van de besturingsbalk. Samen met dit bericht wordt een pointer naar de clientrechthoek van de ouder doorgegeven. Dit bericht wordt verzonden naar kinderen in Z-volgorde. De kinderen van de besturingsbalk gebruiken deze informatie om zichzelf te positioneren en om de grootte van het clientgebied van de ouder te verkleinen. De uiteindelijke rechthoek die overblijft voor het normale clientgebied (minder besturingsbalken) wordt gebruikt om het hoofdclientvenster (meestal een MDI-client, weergave- of splitsvenster) te plaatsen.

Zie CWnd::RepositionBars en CFrameWnd::RecalcLayout voor meer informatie.

Persoonlijke MFC Windows-berichten, waaronder WM_SIZEPARENT, worden beschreven in Technical Note 24.

CStatusBar

Een statusbalk is een besturingsbalk met een rij tekstuitvoervensters. Er zijn twee veelvoorkomende manieren om tekstuitvoervensters te gebruiken:

  • Als berichtregel

    (bijvoorbeeld de standaard help-berichtregel voor menu's). Deze worden meestal benaderd met een 0-gebaseerde index.

  • Als statusindicatoren

    (bijvoorbeeld de CAP-, NUM- en SCRL-indicatoren). Deze worden meestal benaderd met behulp van tekenreeks-/opdracht-id.

Het lettertype voor de statusbalk is 10-punts MS Sans Serif (gedicteerd door de Windows Interface Application Design Guide of de lettertype mappers die het beste overeenkomen met een 10-punts Swiss proportioneel lettertype). In bepaalde versies van Windows, zoals de Japanse editie, zijn de geselecteerde lettertypen verschillend.

De kleuren die in de statusbalk worden gebruikt, zijn ook consistent met de aanbeveling van de Windows Interface Application Design Guide. Deze kleuren zijn niet in code vastgelegd en worden dynamisch gewijzigd als reactie op het aanpassen van gebruikers in het Configuratiescherm.

Artikel Windows COLOR-waarde Standaard RGB
Achtergrond van statusbalk COLOR_BTNFACE RGB(192, 192, 192)
Tekst van statusbalk KLEUR_KNOPTEKST RGB(000, 000, 000)
Statusbalk boven- / linkerranden KLEUR_BTNHIGHLIGHT RGB(255, 255, 255)
Statusbalk onder-/rechterranden COLOR_BTNSHADOW RGB(128, 128, 128)

CCmdUI-ondersteuning voor CStatusBar

De manier waarop indicatoren meestal worden bijgewerkt, is via het ON_UPDATE_COMMAND_UI mechanisme. Bij niet-actieve tijd roept de statusbalk de ON_UPDATE_COMMAND_UI handler aan met de tekenreeks-id van het indicatorvenster.

De ON_UPDATE_COMMAND_UI handler kan aanroepen:

  • Enable: Om het deelvenster in of uit te schakelen. Een uitgeschakeld deelvenster ziet er precies uit als een ingeschakeld deelvenster, maar de tekst is onzichtbaar (dat wil zeggen, schakelt de tekstindicator uit).

  • SetText: Als u de tekst wilt wijzigen. Wees voorzichtig als u dit gebruikt, omdat het deelvenster het formaat niet automatisch wijzigt.

Raadpleeg klasse CStatusBar in de klassebibliotheekverwijzing voor meer informatie over CStatusBar het maken en aanpassen van API's. De meeste aanpassingen van statusbalken moeten worden uitgevoerd voordat de statusbalk in eerste instantie zichtbaar wordt gemaakt.

De statusbalk ondersteunt maar één uitrekbaar deelvenster, meestal het eerste deelvenster. De afmetingen van dat venster zijn echt minimaal. Als de statusbalk groter is dan de minimale grootte van alle deelvensters, wordt de extra breedte gegeven aan het uitrekbare deelvenster. De standaardtoepassing met een statusbalk heeft rechts uitgelijnde indicatoren voor CAP, NUM en SCRL omdat het eerste subvenster uitrekbaar is.

CToolBar

Een werkbalk is een besturingsbalk met een rij bitmapknoppen die scheidingstekens kunnen bevatten. Er worden twee stijlen met knoppen ondersteund: drukknoppen en selectievakjeknoppen. De functionaliteit van radiogroepen kan worden gebouwd met selectievakjeknoppen en ON_UPDATE_COMMAND_UI.

Alle bitmapknoppen op de werkbalk zijn afkomstig van één bitmap. Deze bitmap moet één afbeelding of symbool voor elke knop bevatten. Normaal gesproken is de volgorde van de afbeeldingen/glyphs in de bitmap dezelfde volgorde als ze op het scherm worden getekend. (Dit kan worden gewijzigd met behulp van de aanpassings-API's.)

Elke knop moet dezelfde grootte hebben. De standaardwaarde is de standaard 24x22 pixels. Elke afbeelding/glyph moet dezelfde grootte hebben en moet naast elkaar in de bitmap staan. De standaardgrootte van de afbeelding/glyph is 16x15 pixels. Daarom hebt u voor een werkbalk met 10 knoppen (met standaardgrootten) een bitmap nodig die 160 pixels breed en 15 pixels hoog is.

Elke knop heeft één en slechts één afbeelding/symbool. De verschillende knopstatussen en -stijlen (bijvoorbeeld ingedrukt, omhoog, omlaag, uitgeschakeld, uitgeschakeld omlaag, onbepaald) zijn algoritmisch gegenereerd van die ene afbeelding/glyph. Elke kleur bitmap of DIB kan in theorie worden gebruikt. Het algoritme voor het genereren van de verschillende knopstatussen werkt het beste als de oorspronkelijke afbeelding grijstinten is. Bekijk de standaardwerkbalkknoppen en de werkbalkknop clipart in MFC Algemeen voorbeeld CLIPART voor voorbeelden.

De kleuren die in de werkbalk worden gebruikt, zijn ook consistent met de aanbeveling van de Windows Interface Application Design Guide. Deze kleuren zijn niet in code vastgelegd en worden dynamisch gewijzigd als reactie op het aanpassen van gebruikers in het Configuratiescherm.

Artikel Windows COLOR-waarde Standaard RGB
Achtergrond van de werkbalk COLOR_BTNFACE RGB(192.192.192)
Boven- en linkerranden van knoppen op de werkbalk COLOR_BTNHIGHLIGHT RGB(255.255.255)
Knoppen van de werkbalk onder- en rechterranden COLOR_BTNSHADOW RGB(128.128.128)

Daarnaast worden de bitmapknoppen van de werkbalk opnieuw ingekleurd alsof ze standaard Windows-knopbesturingselementen zijn. Deze kleurwijziging treedt op wanneer de bitmap vanuit de resource wordt geladen en als reactie op een wijziging in systeemkleuren als reactie op aanpassingen van gebruikers in het Configuratiescherm. De volgende kleuren in een werkbalk bitmap worden automatisch aangepast zodat ze voorzichtig moeten worden gebruikt. Als u geen deel van de bitmapkleur wilt wijzigen, gebruikt u een kleur die een van de toegewezen RGB-waarden nauw benadert. De toewijzing wordt uitgevoerd op basis van exacte RGB-waarden.

RGB-waarde Dynamisch toegewezen COLOR-waarde
RGB(000, 000, 000) KLEUR_KNOPTEKST
RGB(128, 128, 128) COLOR_BTNSHADOW
RGB(192, 192, 192) COLOR_BTNFACE
RGB(255, 255, 255) COLOR_BTNHIGHLIGHT

Raadpleeg klasse CToolBar de verwijzing naar de klassebibliotheek voor meer informatie over het CToolBar maken en aanpassen van API's. De meeste aanpassingen van werkbalken moeten worden uitgevoerd voordat de werkbalk in eerste instantie zichtbaar wordt gemaakt.

De API's voor aanpassingen kunnen worden gebruikt om de knop-ID's, stijlen, tussenruimte en welke afbeelding/glyph voor welke knop wordt gebruikt aan te passen. Standaard hoeft u deze API's niet te gebruiken.

CCmdUI-ondersteuning voor CToolBar

De manier waarop werkbalkknoppen altijd worden bijgewerkt, is via het ON_UPDATE_COMMAND_UI mechanisme. Op niet-actieve tijd roept de werkbalk de ON_UPDATE_COMMAND_UI handler aan met de opdracht-id van die knop. ON_UPDATE_COMMAND_UI wordt niet aangeroepen voor scheidingstekens, maar wel voor drukknoppen en selectievakjes.

De ON_UPDATE_COMMAND_UI handler kan aanroepen:

  • Enable: Als u de knop wilt in- of uitschakelen. Dit werkt ook voor drukknoppen en selectievakjeknoppen.

  • SetCheck: De controlestatus van een knop instellen. Als u deze werkbalkknop aanroept, wordt deze omgezet in een checkboxknop. SetCheck gebruikt een parameter die kan worden 0 (niet gecontroleerd), 1 (gecontroleerd) of 2 (onbepaald)

  • SetRadio: Afkorting voor SetCheck.

Selectievakjeknoppen zijn 'AUTO'-selectievakjeknoppen; Dat wil gezegd, wanneer de gebruiker erop drukt, wordt de status onmiddellijk gewijzigd. Ingeschakeld is de status Down of Gedeprimeerd. Er is geen ingebouwde gebruikersinterface manier om een knop te wijzigen in de status 'onbepaald'; dat moet worden gedaan via code.

Met de aanpassings-API's kunt u de status van een bepaalde werkbalkknop wijzigen, bij voorkeur moet u deze statussen wijzigen in de ON_UPDATE_COMMAND_UI handler voor de opdracht die de werkbalkknop vertegenwoordigt. Vergeet niet dat de niet-actieve verwerking de status van werkbalkknoppen wijzigt met de ON_UPDATE_COMMAND_UI handler, zodat wijzigingen in deze statussen die via SetButtonStyle zijn aangebracht, verloren kunnen gaan na de volgende inactiviteit.

Werkbalkknoppen verzenden WM_COMMAND berichten zoals normale knoppen of menu-items en worden normaal gesproken verwerkt door een ON_COMMAND handler in dezelfde klasse die de ON_UPDATE_COMMAND_UI handler biedt.

Er zijn vier werkbalkknopstijlen (TBBS_ waarden) die worden gebruikt voor weergavestatussen:

  • TBBS_CHECKED: selectievakje is momenteel aangevinkt.

  • TBBS_INDETERMINATE: Het selectievakje is momenteel onbepaald.

  • TBBS_DISABLED: de knop is momenteel uitgeschakeld.

  • TBBS_PRESSED: De knop wordt momenteel ingedrukt.

De zes officiële knopstijlen voor windows-interfacetoepassingen worden vertegenwoordigd door de volgende TBBS-waarden:

  • Omhoog = 0

  • Muis omlaag = TBBS_PRESSED (| een andere stijl)

  • Uitgeschakeld = TBBS_DISABLED

  • Omlaag = TBBS_CHECKED

  • Uitgeschakeld = TBBS_CHECKED | TBBS_DISABLED

  • Onbepaald = TBBS_INDETERMINATE

CDialogBar

Een dialoogvensterbalk is een besturingsbalk die standaardbesturingselementen voor Windows bevat. Het fungeert als een dialoogvenster doordat het de bedieningsmogelijkheden bevat en het schakelen tussen deze mogelijkheden ondersteunt. Het fungeert ook als een dialoogvenster waarin een dialoogvenstersjabloon wordt gebruikt om de balk weer te geven.

Een CDialogBar wordt gebruikt voor de werkbalk afdrukvoorbeeld, die standaard drukknopbesturingselementen bevat.

Het gebruik van een CDialogBar is als het gebruik van een CFormView. U moet een dialoogvenstersjabloon voor de dialoogvensterbalk definiëren en alle stijlen verwijderen, behalve WS_CHILD. Het dialoogvenster mag niet zichtbaar zijn.

De bedieningsmeldingen voor een CDialogBar worden verzonden naar de ouder van de bedieningsbalk (net als gereedschapsbalkknoppen).

CCmdUI-ondersteuning voor CDialogBar

Knoppen in de dialoogvensterbalk moeten worden bijgewerkt via het ON_UPDATE_COMMAND_UI handlermechanisme. Tijdens inactiviteit roept de dialoogvensterbalk de ON_UPDATE_COMMAND_UI handler aan met de opdracht-id van alle knoppen met een id >= 0x8000 (dat wil gezegd, in het bereik van opdracht-id's).

De ON_UPDATE_COMMAND_UI handler kan aanroepen:

  • Inschakelen: de knop in- of uitschakelen.

  • SetText: de tekst van de knop wijzigen.

Aanpassingen kunnen worden uitgevoerd via standaard window manager-API's.

Zie ook

Technische notities per nummer
Technische Aantekeningen Per Categorie