Delen via


Bureaubladwerkbalken van toepassingen gebruiken

Een bureaubladwerkbalk van de toepassing (ook wel een appbalk genoemd) is een venster dat vergelijkbaar is met de Windows-taakbalk. Het is verankerd aan een rand van het scherm en bevat meestal knoppen waarmee de gebruiker snel toegang heeft tot andere toepassingen en vensters. Het systeem voorkomt dat andere toepassingen het bureaubladgebied gebruiken dat wordt gebruikt door een appbar. Er kunnen op elk gewenst moment een willekeurig aantal appbalken op het bureaublad aanwezig zijn.

Dit onderwerp bevat de volgende secties.

Over toepassingsbureaubladwerkbalken

Windows biedt een API waarmee u kunt profiteren van appbar-services die door het systeem worden geleverd. De services helpen ervoor te zorgen dat toepassingsgedefinieerde appbars soepel met elkaar en met de taakbalk werken. Het systeem onderhoudt informatie over elke appbar en verzendt de appbars-berichten om hen op de hoogte te stellen van gebeurtenissen die van invloed kunnen zijn op hun grootte, positie en uiterlijk.

Het verzenden van berichten

Een toepassing maakt gebruik van een speciale set berichten, appbar-berichten genoemd, om een appbar toe te voegen of te verwijderen, de grootte en positie van een app-balk in te stellen en informatie op te halen over de grootte, positie en status van de taakbalk. Als u een appbalkbericht wilt verzenden, moet een toepassing de functie SHAppBarMessage gebruiken. De parameters van de functie bevatten een bericht-id, zoals ABM_NEW, en het adres van een APPBARDATA structuur. De structuurleden bevatten informatie die het systeem nodig heeft om het opgegeven bericht te verwerken.

Voor een bepaald appbar-bericht gebruikt het systeem enkele leden van de APPBARDATA structuur en negeert het de andere. Het systeem gebruikt echter altijd de cbSize- en hWnd velden, dus een applicatie moet deze velden invullen voor elke appbarmelding. De cbSize lid geeft de grootte van de structuur aan en het hWnd lid is de ingang voor het venster van de appbar.

Sommige appbar-berichten vragen informatie van het systeem aan. Bij het verwerken van deze berichten kopieert het systeem de gevraagde informatie naar de APPBARDATA structuur.

Registratie

Het systeem bewaart een interne lijst met appbars en onderhoudt informatie over elke balk in de lijst. Het systeem gebruikt de informatie voor het beheren van appbars, het uitvoeren van services voor hen en het verzenden van meldingen.

Een toepassing moet een app-balk registreren (oftewel, het toevoegen aan de interne lijst) voordat het de app-balkdiensten van het systeem kan ontvangen. Een toepassing verzendt het ABM_NEW bericht om een app-balk te registreren. De bijbehorende APPBARDATA structuur bevat de ingang voor het venster van de appbar en een door de toepassing gedefinieerde bericht-id. Het systeem gebruikt de bericht-id om meldingsberichten te verzenden naar de vensterprocedure van het appbalkvenster. Zie Appbar Notification Messages voor meer informatie.

Een toepassing verwijdert de registratie van een app-balk door het ABM_REMOVE bericht te verzenden. Als u de registratie van een app-balk ongedaan maakt, wordt deze verwijderd uit de interne lijst met app-balken van het systeem. Het systeem verzendt geen meldingsberichten meer naar de appbalk of voorkomt dat andere toepassingen het schermgebied gebruiken dat door de appbalk wordt gebruikt. Een toepassing moet altijd ABM_REMOVE verzenden voordat een appbar wordt vernietigd.

Grootte en positie van app-balk

Een toepassing moet de grootte en positie van een app-balk instellen, zodat deze geen invloed heeft op andere appbalken of de taakbalk. Elke appbar moet worden verankerd aan een bepaalde rand van het scherm en meerdere appbars kunnen worden verankerd aan een rand. Als een appbar echter is verankerd aan dezelfde rand als de taakbalk, zorgt het systeem ervoor dat de taakbalk zich altijd op de buitenste rand bevindt.

Als u de grootte en positie van een appbalk wilt instellen, stelt een toepassing eerst een schermrand en begrenzingsrechthoek voor de appbalk voor door het ABM_QUERYPOS bericht te verzenden. Het systeem bepaalt of een deel van het schermgebied binnen de voorgestelde rechthoek wordt gebruikt door de taakbalk of een andere appbar, de rechthoek aanpast (indien nodig) en de aangepaste rechthoek retourneert aan de toepassing.

Vervolgens verzendt de toepassing het ABM_SETPOS bericht om de nieuwe begrenzingsrechthoek voor de appbalk in te stellen. Ook hier kan het systeem de rechthoek aanpassen voordat deze naar de toepassing wordt geretourneerd. Daarom moet de toepassing de aangepaste rechthoek gebruiken die door ABM_SETPOS wordt geretourneerd om de uiteindelijke grootte en positie in te stellen. De toepassing kan de functie MoveWindow gebruiken om de appbalk in positie te plaatsen.

Door een proces in twee stappen te gebruiken om de grootte en positie in te stellen, kan de toepassing tijdens de verplaatsingsbewerking tussenliggende feedback geven aan de gebruiker. Als de gebruiker bijvoorbeeld een appbar sleept, kan de toepassing een gearceerde rechthoek weergeven die de nieuwe positie aangeeft voordat de appbalk daadwerkelijk wordt verplaatst.

Een toepassing moet de grootte en positie van de appbalk instellen nadat deze is geregistreerd en wanneer de appbalk het meldingsbericht ABN_POSCHANGED ontvangt. Een appbar ontvangt dit meldingsbericht wanneer er een wijziging plaatsvindt in de grootte, positie of zichtbaarheidsstatus van de taakbalk en wanneer een andere appbalk aan dezelfde zijde van het scherm wordt gewijzigd, toegevoegd of verwijderd.

Wanneer een appbar het WM_ACTIVATE bericht ontvangt, moet het ABM_ACTIVATE bericht worden verzonden. Als een appbar een WM_WINDOWPOSCHANGED bericht ontvangt, moet deze ook ABM_WINDOWPOSCHANGEDaanroepen. Als u deze berichten verzendt, zorgt u ervoor dat het systeem de z-volgorde van alle autohide-appbars op dezelfde rand instelt.

Werkbalken van bureaubladtoepassingen automatisch verbergen

Een autohide appbar is een appbar die normaal verborgen is, maar zichtbaar wordt wanneer de gebruiker de muiscursor verplaatst naar de schermrand waaraan de appbar is gekoppeld. De appbalk verbergt zich opnieuw wanneer de gebruiker de muisaanwijzer buiten de begrenzingsrechthoek van de balk verplaatst.

Hoewel het systeem op elk gewenst moment een aantal verschillende appbars toestaat, staat het slechts één automatisch verbergende appbalk tegelijk toe voor elke schermrand op basis van wie het eerst komt, het eerst maalt. Het systeem onderhoudt automatisch de z-volgorde van een autohide-appbar (alleen binnen de z-ordergroep).

Een toepassing gebruikt het ABM_SETAUTOHIDEBAR bericht om een autoverbergende app-balk te registreren of af te melden. Het bericht geeft de rand voor de appbar aan en een vlag die aangeeft of de app-balk moet worden geregistreerd of niet geregistreerd. De melding mislukt als er een automatisch verbergende appbalk wordt geregistreerd, maar er al eentje is gekoppeld aan de opgegeven rand. Een toepassing kan het handvat ophalen van de automatisch verbergende app-balk die is gekoppeld aan een rand door het ABM_GETAUTOHIDEBAR bericht te verzenden.

Een automatisch verbergende app-balk hoeft zich niet te registreren als een normale app-balk; dat wil zeggen dat het niet hoeft te worden geregistreerd door het ABM_NEW bericht te verzenden. Een appbar die niet is geregistreerd door ABM_NEW overlapt alle appbars die zijn verankerd aan dezelfde rand van het scherm.

Meldingen van de appbalk

Het systeem verzendt berichten om een appbar op de hoogte te stellen van gebeurtenissen die van invloed kunnen zijn op de positie en het uiterlijk. De berichten worden verzonden in de context van een toepassingsgedefinieerde bericht. De toepassing geeft de id van het bericht op wanneer het ABM_NEW bericht wordt verzonden om de appbalk te registreren. De meldingscode bevindt zich in de parameter wParam wParam van het door de toepassing gedefinieerde bericht.

Een appbar ontvangt het meldingsbericht ABN_POSCHANGED wanneer de grootte, positie of zichtbaarheidsstatus van de taakbalk wordt gewijzigd, wanneer een andere app-balk wordt toegevoegd aan dezelfde rand van het scherm, of wanneer een andere appbalk aan dezelfde rand van het scherm wordt gewijzigd of verwijderd. Een appbar moet reageren op dit meldingsbericht door ABM_QUERYPOS en ABM_SETPOS berichten te verzenden. Als de positie van een appbalk is gewijzigd, moet deze de functie MoveWindow aanroepen om zichzelf naar de nieuwe positie te verplaatsen.

Het systeem verzendt het ABN_STATECHANGE meldingsbericht wanneer de status automatisch verbergen of altijd bovenaan van de taakbalk is gewijzigd. Dat wil zeggen dat wanneer de gebruiker het selectievakje Altijd bovenaan of Automatisch verbergen op het eigenschappenvenster van de taakbalk selecteert of wist. Een appbar kan dit meldingsbericht gebruiken om de status ervan zo in te stellen dat deze voldoet aan die van de taakbalk, indien gewenst.

Wanneer een toepassing op volledig scherm wordt gestart of wanneer de laatste toepassing op volledig scherm wordt gesloten, ontvangt een app-balk het ABN_FULLSCREENAPP meldingsbericht. De parameter lParam geeft aan of de toepassing op volledig scherm wordt geopend of gesloten. Wanneer het wordt geopend, moet de appbar naar de onderste laag van de z-volgorde gaan. De appbalk moet zijn z-orderpositie herstellen wanneer de laatste toepassing op volledig scherm is gesloten.

Een appbar ontvangt het ABN_WINDOWARRANGE meldingsbericht wanneer de gebruiker de opdracht Trapsgewijs, Horizontaal Schikken of Verticaal Schikken selecteert in het contextmenu van de taakbalk. Het systeem verzendt het bericht twee keer, voordat de vensters opnieuw worden gerangschikt (lParam is TRUE) en na het schikken van de vensters (lParam is FALSE).

Een appbar kan ABN_WINDOWARRANGE berichten gebruiken om zichzelf uit te sluiten van de trapsgewijze bewerking of tegelbewerking. Om zichzelf uit te sluiten, moet de appbar zich verbergen wanneer lParamWAAR is en zichzelf tonen wanneer lParamONWAARis. Als een appbar zichzelf verbergt als reactie op dit bericht, hoeft deze niet de ABM_QUERYPOS berichten te verzenden en ABM_SETPOS berichten in reactie op de cascade- of tegeloperatie.

Een bureaubladwerkbalk van een toepassing registreren

Een toepassing moet een app-balk registreren door het ABM_NEW bericht te verzenden. Als u een appbalk registreert, wordt deze toegevoegd aan de interne lijst van het systeem en wordt het systeem voorzien van een bericht-id die moet worden gebruikt om meldingsberichten naar de appbalk te verzenden. Voordat u afsluit, moet een toepassing de registratie van de app-balk ongedaan maken door het ABM_REMOVE bericht te verzenden. Als u de registratie ongedaan maakt, wordt de app-balk uit de interne lijst van het systeem verwijderd en voorkomt u dat de balk appbarnotificaties ontvangt.

De functie in het volgende voorbeeld meldt een appbar aan of af, afhankelijk van de waarde van een booleaanse vlagparameter.

// RegisterAccessBar - registers or unregisters an appbar. 
// Returns TRUE if successful, or FALSE otherwise. 

// hwndAccessBar - handle to the appbar 
// fRegister - register and unregister flag 

// Global variables 
//     g_uSide - screen edge (defaults to ABE_TOP) 
//     g_fAppRegistered - flag indicating whether the bar is registered 

BOOL RegisterAccessBar(HWND hwndAccessBar, BOOL fRegister) 
{ 
    APPBARDATA abd; 
    
    // An application-defined message identifier
    APPBAR_CALLBACK = (WM_USER + 0x01);
    
    // Specify the structure size and handle to the appbar. 
    abd.cbSize = sizeof(APPBARDATA); 
    abd.hWnd = hwndAccessBar; 

    if (fRegister) 
    { 
        // Provide an identifier for notification messages. 
        abd.uCallbackMessage = APPBAR_CALLBACK; 

        // Register the appbar. 
        if (!SHAppBarMessage(ABM_NEW, &abd)) 
            return FALSE; 

        g_uSide = ABE_TOP;       // default edge 
        g_fAppRegistered = TRUE; 

    } 
    else 
    { 
        // Unregister the appbar. 
        SHAppBarMessage(ABM_REMOVE, &abd); 
        g_fAppRegistered = FALSE; 
    } 

    return TRUE; 
}

De grootte en positie van de appbalk instellen

Een toepassing moet de grootte en positie van een app-balk instellen na het registreren van de appbalk, nadat de gebruiker de appbalk heeft verplaatst of de grootte ervan heeft aangepast en wanneer de appbalk het meldingsbericht ABN_POSCHANGED ontvangt. Voordat u de grootte en positie van de app-balk instelt, vraagt de toepassing het systeem op naar een goedgekeurde begrenzingsrechthoek door het ABM_QUERYPOS bericht te verzenden. Het systeem retourneert een begrenzende rechthoek die geen invloed heeft op de taakbalk of een andere appbalk. Het systeem past de rechthoek puur aan door middel van aftrekken; het doet geen moeite om de oorspronkelijke grootte van de rechthoek te behouden. Daarom moet de appbar de rechthoek zo nodig aanpassen nadat ABM_QUERYPOSis verzonden.

Vervolgens geeft de toepassing de begrenzingsrechthoek weer door aan het systeem met behulp van het ABM_SETPOS bericht. Vervolgens wordt de functie MoveWindow aangeroepen om de appbalk in positie te plaatsen.

In het volgende voorbeeld ziet u hoe u de grootte en positie van een app-balk instelt.

// AppBarQuerySetPos - sets the size and position of an appbar. 

// uEdge - screen edge to which the appbar is to be anchored 
// lprc - current bounding rectangle of the appbar 
// pabd - address of the APPBARDATA structure with the hWnd and cbSize members filled

void PASCAL AppBarQuerySetPos(UINT uEdge, LPRECT lprc, PAPPBARDATA pabd) 
{ 
    int iHeight = 0; 
    int iWidth = 0; 

    pabd->rc = *lprc; 
    pabd->uEdge = uEdge; 

    // Copy the screen coordinates of the appbar's bounding 
    // rectangle into the APPBARDATA structure. 
    if ((uEdge == ABE_LEFT) || (uEdge == ABE_RIGHT)) 
    { 
        iWidth = pabd->rc.right - pabd->rc.left; 
        pabd->rc.top = 0; 
        pabd->rc.bottom = GetSystemMetrics(SM_CYSCREEN); 
    } 
    else 
    { 
        iHeight = pabd->rc.bottom - pabd->rc.top; 
        pabd->rc.left = 0; 
        pabd->rc.right = GetSystemMetrics(SM_CXSCREEN); 
    } 

    // Query the system for an approved size and position. 
    SHAppBarMessage(ABM_QUERYPOS, pabd); 

    // Adjust the rectangle, depending on the edge to which the appbar is anchored.
    switch (uEdge) 
    { 
        case ABE_LEFT: 
            pabd->rc.right = pabd->rc.left + iWidth; 
            break; 

        case ABE_RIGHT: 
            pabd->rc.left = pabd->rc.right - iWidth; 
            break; 

        case ABE_TOP: 
            pabd->rc.bottom = pabd->rc.top + iHeight; 
            break; 

        case ABE_BOTTOM: 
            pabd->rc.top = pabd->rc.bottom - iHeight; 
            break; 
    } 

    // Pass the final bounding rectangle to the system. 
    SHAppBarMessage(ABM_SETPOS, pabd); 

    // Move and size the appbar so that it conforms to the 
    // bounding rectangle passed to the system. 
    MoveWindow(pabd->hWnd, 
               pabd->rc.left, 
               pabd->rc.top, 
               pabd->rc.right - pabd->rc.left, 
               pabd->rc.bottom - pabd->rc.top, 
               TRUE); 

}

Het verwerken van meldingsberichten van de app-balk

Een appbar ontvangt een melding wanneer de status van de taakbalk wordt gewijzigd, wanneer een toepassing op volledig scherm wordt gestart (of de laatste wordt gesloten), of wanneer een gebeurtenis optreedt die van invloed kan zijn op de grootte en positie van de app-balk. In het volgende voorbeeld ziet u hoe u de verschillende meldingsberichten verwerkt.

// AppBarCallback - processes notification messages sent by the system. 

// hwndAccessBar - handle to the appbar 
// uNotifyMsg - identifier of the notification message 
// lParam - message parameter 

void AppBarCallback(HWND hwndAccessBar, UINT uNotifyMsg, 
    LPARAM lParam) 
{ 
    APPBARDATA abd; 
    UINT uState; 

    abd.cbSize = sizeof(abd); 
    abd.hWnd = hwndAccessBar; 

    switch (uNotifyMsg) 
    { 
        case ABN_STATECHANGE: 

            // Check to see if the taskbar's always-on-top state has changed
            // and, if it has, change the appbar's state accordingly.
            uState = SHAppBarMessage(ABM_GETSTATE, &abd); 

            SetWindowPos(hwndAccessBar, 
                         (ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM, 
                         0, 0, 0, 0, 
                         SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 

            break; 

        case ABN_FULLSCREENAPP: 

            // A full-screen application has started, or the last full-screen
            // application has closed. Set the appbar's z-order appropriately.
            if (lParam) 
            { 
                SetWindowPos(hwndAccessBar, 
                             (ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM, 
                             0, 0, 0, 0, 
                             SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 
            } 
            else 
            { 
                uState = SHAppBarMessage(ABM_GETSTATE, &abd); 

                if (uState & ABS_ALWAYSONTOP) 
                    SetWindowPos(hwndAccessBar, 
                                 HWND_TOPMOST, 
                                 0, 0, 0, 0, 
                                 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 
            } 

        case ABN_POSCHANGED: 

            // The taskbar or another appbar has changed its size or position.
            AppBarPosChanged(&abd); 
            break; 
    } 
}

Met de volgende functie wordt de begrenzingsrechthoek van een appbar aangepast en wordt vervolgens de toepassingsgedefinieerde AppBarQuerySetPos-functie (opgenomen in de vorige sectie) aangeroepen om de grootte en positie van de balk dienovereenkomstig in te stellen.

// AppBarPosChanged - adjusts the appbar's size and position. 

// pabd - address of an APPBARDATA structure that contains information 
//        used to adjust the size and position. 

void PASCAL AppBarPosChanged(PAPPBARDATA pabd) 
{ 
    RECT rc; 
    RECT rcWindow; 
    int iHeight; 
    int iWidth; 

    rc.top = 0; 
    rc.left = 0; 
    rc.right = GetSystemMetrics(SM_CXSCREEN); 
    rc.bottom = GetSystemMetrics(SM_CYSCREEN); 

    GetWindowRect(pabd->hWnd, &rcWindow); 

    iHeight = rcWindow.bottom - rcWindow.top; 
    iWidth = rcWindow.right - rcWindow.left; 

    switch (g_uSide) 
    { 
        case ABE_TOP: 
            rc.bottom = rc.top + iHeight; 
            break; 

        case ABE_BOTTOM: 
            rc.top = rc.bottom - iHeight; 
            break; 

        case ABE_LEFT: 
            rc.right = rc.left + iWidth; 
            break; 

        case ABE_RIGHT: 
            rc.left = rc.right - iWidth; 
            break; 
    } 

    AppBarQuerySetPos(g_uSide, &rc, pabd); 
}