Dela via


Använda Verktygsfält för Skrivbordsapplikationer

Ett skrivbordsverktygsfält för program (kallas även appbar) är ett fönster som liknar Aktivitetsfältet i Windows. Den är fäst vid en kant av skärmen och innehåller vanligtvis knappar som ger användaren snabb åtkomst till andra program och fönster. Systemet förhindrar att andra program använder det skrivbordsområde som används av en appbar. Valfritt antal appbars kan finnas på skrivbordet när som helst.

Det här avsnittet innehåller följande avsnitt.

Om verktygsfält för Application Desktop

Windows tillhandahåller ett API som gör att du kan dra nytta av appbartjänster som tillhandahålls av systemet. Tjänsterna hjälper till att säkerställa att programdefinierade appbars fungerar smidigt med varandra och med aktivitetsfältet. Systemet underhåller information om varje appbar och skickar appbarmeddelanden för att meddela dem om händelser som kan påverka deras storlek, position och utseende.

Skicka meddelanden

Ett program använder en särskild uppsättning meddelanden, som kallas appbarmeddelanden, för att lägga till eller ta bort en appbar, ange en appbars storlek och position och hämta information om aktivitetsfältets storlek, position och tillstånd. Om du vill skicka ett appbarmeddelande måste ett program använda funktionen SHAppBarMessage. Funktionens parametrar innehåller en meddelandeidentifierare, till exempel ABM_NEWoch adressen för en APPBARDATA- struktur. Strukturmedlemmarna innehåller information som systemet behöver för att bearbeta det angivna meddelandet.

För ett visst appbarmeddelande använder systemet vissa medlemmar i APPBARDATA struktur och ignorerar de andra. Systemet använder dock alltid cbSize och hWnd medlemmar, så ett program måste fylla i dessa medlemmar för varje appbarmeddelande. cbSize medlemsvariabel anger strukturens storlek och hWnd medlemsvariabel är handtaget till appbarens fönster.

Vissa appbarmeddelanden begär information från systemet. När du bearbetar dessa meddelanden kopierar systemet den begärda informationen till APPBARDATA strukturen.

Registrering

Systemet behåller en intern lista över appbarer och underhåller information om varje stapel i listan. Systemet använder informationen för att hantera appbars, utföra tjänster åt dem och skicka meddelanden till dem.

Ett program måste registrera en appbar (d.v.s. lägga till den i den interna listan) innan den kan ta emot appbartjänster från systemet. Om du vill registrera en appbar skickar ett program meddelandet ABM_NEW. Den tillhörande APPBARDATA- struktur innehåller handtaget till appbarens fönster och en programdefinierad meddelandeidentifierare. Systemet använder meddelandeidentifieraren för att skicka meddelanden till fönsterproceduren i appbarfönstret. Mer information finns i Appbar-meddelanden.

Ett program avregistrerar en appbar genom att skicka meddelandet ABM_REMOVE. Avregistrera en appbar tar bort den från systemets interna lista över appbarer. Systemet skickar inte längre meddelanden till appbaren eller förhindrar att andra program använder det skärmområde som används av appfältet. Ett program bör alltid skicka ABM_REMOVE innan du förstör en appbar.

Appfältets storlek och position

Ett program bör ange en appbars storlek och position så att det inte stör andra appbarer eller aktivitetsfältet. Varje appbar måste vara fäst vid en viss kant på skärmen och flera appbars kan förankras i en kant. Men om en appbar är fäst vid samma kant som aktivitetsfältet ser systemet till att aktivitetsfältet alltid finns på den yttersta kanten.

Om du vill ange storlek och position för en appbar föreslår ett program först en skärmkant och avgränsningsrektangel för appfältet genom att skicka meddelandet ABM_QUERYPOS. Systemet avgör om någon del av skärmområdet i den föreslagna rektangeln används av aktivitetsfältet eller en annan appbar, justerar rektangeln (om det behövs) och returnerar den justerade rektangeln till programmet.

Därefter skickar programmet meddelandet ABM_SETPOS för att ange den nya avgränsande rektangeln för appfältet. Återigen kan systemet justera rektangeln innan den returneras till programmet. Därför bör programmet använda den justerade rektangel som returneras av ABM_SETPOS för att ange den slutliga storleken och positionen. Programmet kan använda funktionen MoveWindow för att flytta appfältet på plats.

Genom att använda en tvåstegsprocess för att ange storlek och position gör systemet det möjligt för programmet att ge mellanliggande feedback till användaren under flyttåtgärden. Om användaren till exempel drar en appbar kan programmet visa en skuggad rektangel som anger den nya positionen innan appfältet faktiskt flyttas.

Ett program bör ange storlek och position för sitt appfält när det har registrerats och när appfältet tar emot ABN_POSCHANGED meddelandemeddelandet. En appbar tar emot det här meddelandemeddelandet när en ändring sker i aktivitetsfältets storlek, position eller synlighetstillstånd och när en annan appbar på samma sida av skärmen ändras, läggs till eller tas bort.

När en appbar tar emot WM_ACTIVATE-meddelandet ska det skicka ABM_ACTIVATE meddelande. På samma sätt, när en appbar tar emot ett meddelande om WM_WINDOWPOSCHANGED, måste den anropa ABM_WINDOWPOSCHANGED. Om du skickar dessa meddelanden ser du till att systemet korrekt ställer in z-ordningen för alla autohide-appbars på samma kant.

Dölj automatiskt verktygsfält på program skrivbordet

En autohide-appbar är en appbar som normalt är dold men blir synlig när användaren flyttar muspekaren till skärmkanten som appbaren är associerad med. Appbaren döljer sig igen när användaren flyttar musmarkören utanför fältets begränsningsrektangel.

Även om systemet tillåter ett antal olika appfält samtidigt, tillåter det bara ett självdöljande appfält i taget för varje skärmkant enligt principen först till kvarn. Systemet underhåller automatiskt z-ordningen för en autohide-appbar (endast inom dess z-order-grupp).

Ett program använder meddelandet ABM_SETAUTOHIDEBAR för att registrera eller avregistrera en autodöljande appbar. Meddelandet anger gränsen för appfältet och en flagga som anger om appfältet ska registreras eller avregistreras. Meddelandet misslyckas om en autohide-appbar registreras men en redan är associerad med den angivna gränsen. Ett program kan hämta handtaget till den dolda appbaren som är associerad med en skärmkant genom att skicka meddelandet ABM_GETAUTOHIDEBAR.

En autohide-appbar behöver inte registreras som en vanlig appbar. Det innebär att den inte behöver registreras genom att skicka ABM_NEW meddelandet. En appbar som inte har registrerats av ABM_NEW överlappar alla appbarer som är förankrade på samma skärmkant.

Appbar-notifikationsmeddelanden

Systemet skickar meddelanden för att meddela en appbar om händelser som kan påverka dess position och utseende. Meddelandena skickas i kontexten för ett programdefinierat meddelande. Programmet anger identifieraren för meddelandet när det skickar ABM_NEW meddelande för att registrera appbaren. Meddelandekoden finns i parametern wParam för det programdefinierade meddelandet.

En appbar tar emot ABN_POSCHANGED meddelandemeddelandet när aktivitetsfältets storlek, position eller synlighetstillstånd ändras, när en annan appbar läggs till på samma skärmkant eller när en annan appbar på samma skärmkant ändras eller tas bort. En appbar bör svara på det här meddelandemeddelandet genom att skicka ABM_QUERYPOS och ABM_SETPOS meddelanden. Om en appbars position har ändrats bör den anropa funktionen MoveWindow för att flytta sig till den nya positionen.

Systemet skickar ABN_STATECHANGE meddelandemeddelandet när aktivitetsfältets autohide- eller always-on-top-tillstånd har ändrats, det vill säga när användaren väljer eller avmarkerar Alltid ovanpå eller Dölj automatiskt kryssruta i aktivitetsfältets egenskapsblad. En appbar kan använda det här meddelandemeddelandet för att ange dess tillstånd så att det överensstämmer med aktivitetsfältets, om så önskas.

När ett helskärmsprogram startas eller när det sista helskärmsprogrammet stängs tar en appbar emot ABN_FULLSCREENAPP meddelandemeddelandet. Parametern lParam anger om helskärmsprogrammet öppnas eller stängs. Om den öppnas måste appfältet hamna längst ner i z-ordningen. Appbaren bör återställa sin z-orderposition när det senaste helskärmsprogrammet har stängts.

En appbar tar emot meddelandet ABN_WINDOWARRANGE när användaren väljer kommandot Kaskad, Panel vågrätt eller Panel lodrätt från snabbmenyn i aktivitetsfältet. Systemet skickar meddelandet två gånger – innan du ordnar om fönstren (lParam är TRUE) och efter att ha ordnat fönstren (lParam är FALSE).

En appbar kan använda ABN_WINDOWARRANGE meddelanden för att utesluta sig själv från kaskad- eller panelåtgärden. För att utesluta sig själv bör appbaren dölja sig när lParam är TRUE och visa sig när lParam är FALSE. Om en appbar döljer sig som svar på det här meddelandet behöver den inte skicka ABM_QUERYPOS och ABM_SETPOS meddelanden som svar på kaskad- eller panelåtgärden.

Registrera ett verktygsfält för programskrivbord

Ett program måste registrera en appbar genom att skicka meddelandet ABM_NEW. När du registrerar en appbar läggs den till i systemets interna lista och ger systemet en meddelandeidentifierare som ska användas för att skicka meddelanden till appbaren. Innan du avslutar måste ett program avregistrera applikationsfältet genom att skicka meddelandet ABM_REMOVE. Avregistrering tar bort appbaren från systemets interna lista och förhindrar att fältet tar emot appbaraviseringsmeddelanden.

Funktionen i följande exempel registrerar eller avregistrerar en appbar, beroende på värdet för en boolesk flaggparameter.

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

Ange storlek och position för appfältet

Ett program bör ange en appbars storlek och position när appfältet har registrerats, efter att användaren har flyttat eller storleksanpassat appfältet och när appbaren tar emot ABN_POSCHANGED meddelandemeddelandet. Innan storlek och position för appbaren ställs in, frågar programmet systemet efter en godkänd avgränsningsrektangel genom att skicka meddelandet ABM_QUERYPOS. Systemet returnerar en avgränsande rektangel som inte stör aktivitetsfältet eller någon annan appbar. Systemet justerar rektangeln enbart genom rektangelundertraktion; det gör ingen ansträngning för att bevara rektangelns ursprungliga storlek. Därför bör appfältet justera rektangeln efter behov när ABM_QUERYPOShar skickats.

Därefter skickar programmet tillbaka avgränsningsrektangeln till systemet med hjälp av meddelandet ABM_SETPOS. Sedan anropas funktionen MoveWindow för att flytta appfältet på plats.

I följande exempel visas hur du anger storlek och position för en appbar.

// 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); 

}

Bearbeta Appbar-meddelanden

En appbar får ett meddelande när aktivitetsfältets tillstånd ändras, när ett helskärmsprogram startar (eller det sista stängs) eller när en händelse inträffar som kan påverka appbarens storlek och position. I följande exempel visas hur du bearbetar de olika meddelandena.

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

Följande funktion justerar en appbars rektangel för avgränsning och anropar sedan den programdefinierade funktionen AppBarQuerySetPos (ingår i föregående avsnitt) för att ange fältets storlek och position i enlighet med detta.

// 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); 
}