Bagikan melalui


Menggunakan Toolbar Desktop Aplikasi

Toolbar desktop aplikasi (juga disebut appbar) adalah jendela yang mirip dengan taskbar Windows. Ini dipasang di sisi layar, dan biasanya berisi tombol yang memungkinkan pengguna mengakses aplikasi dan jendela lain dengan cepat. Sistem mencegah aplikasi lain menggunakan area desktop yang digunakan oleh appbar. Sejumlah appbar dapat ada di desktop pada waktu tertentu.

Topik ini berisi bagian berikut.

Tentang Bilah Alat Desktop Aplikasi

Windows menyediakan API yang memungkinkan Anda memanfaatkan layanan appbar yang disediakan oleh sistem. Layanan ini membantu memastikan bahwa appbar yang ditentukan aplikasi beroperasi dengan lancar satu sama lain dan dengan taskbar. Sistem mempertahankan informasi tentang setiap appbar dan mengirim pesan appbars untuk memberi tahu mereka tentang peristiwa yang dapat memengaruhi ukuran, posisi, dan tampilannya.

Mengirim Pesan

Aplikasi menggunakan sekumpulan pesan khusus, yang disebut pesan appbar, untuk menambahkan atau menghapus appbar, mengatur ukuran dan posisi appbar, dan mengambil informasi tentang ukuran, posisi, dan status taskbar. Untuk mengirim pesan appbar, aplikasi harus menggunakan fungsiSHAppBarMessage. Parameter fungsi mencakup pengidentifikasi pesan, seperti ABM_NEW, dan alamat strukturAPPBARDATA. Anggota struktur berisi informasi yang diperlukan sistem untuk memproses pesan yang diberikan.

Untuk pesan appbar tertentu, sistem menggunakan beberapa anggota APPBARDATA struktur dan mengabaikan yang lain. Namun, sistem selalu menggunakan anggota cbSize dan hWnd, sehingga aplikasi harus mengisi anggota ini untuk setiap pesan appbar. Anggota cbSize menentukan ukuran struktur, dan anggota hWnd adalah handle ke jendela appbar.

Beberapa pesan appbar meminta informasi dari sistem. Saat memproses pesan ini, sistem menyalin informasi yang diminta ke dalam strukturAPPBARDATA.

Pendaftaran

Sistem menyimpan daftar bilah aplikasi internal dan menyimpan informasi mengenai setiap bilah dalam daftar. Sistem menggunakan informasi untuk mengelola appbar, melakukan layanan untuk mereka, dan mengirimi mereka pesan pemberitahuan.

Aplikasi harus mendaftarkan appbar (yaitu, menambahkannya ke daftar internal) sebelum dapat menerima layanan appbar dari sistem. Untuk mendaftarkan appbar, aplikasi mengirimkan pesan ABM_NEW. Struktur APPBARDATA yang menyertainya mencakup pegangan ke jendela appbar dan pengidentifikasi pesan yang ditentukan aplikasi. Sistem menggunakan pengidentifikasi pesan untuk mengirim pesan pemberitahuan ke prosedur jendela jendela appbar. Untuk informasi selengkapnya, lihat Pesan Pemberitahuan Appbar.

Aplikasi membatalkan pendaftaran appbar dengan mengirim pesan ABM_REMOVE. Membatalkan pendaftaran appbar akan menghapusnya dari daftar internal appbar sistem. Sistem tidak lagi mengirim pesan pemberitahuan ke appbar atau mencegah aplikasi lain menggunakan area layar yang digunakan oleh appbar. Aplikasi harus selalu mengirim ABM_REMOVE sebelum menghancurkan appbar.

Ukuran dan Posisi Appbar

Aplikasi harus mengatur ukuran dan posisi appbar sehingga tidak mengganggu appbar lain atau taskbar. Setiap appbar harus ditempatkan ke tepi layar tertentu, dan beberapa appbar dapat ditempatkan ke tepi yang sama. Namun, jika "appbar" tertambat ke tepi yang sama dengan "taskbar", sistem memastikan bahwa "taskbar" selalu berada di tepi terluar.

Untuk mengatur ukuran dan posisi appbar, aplikasi terlebih dahulu mengusulkan tepi layar dan persegi panjang pembatas untuk appbar dengan mengirim pesan ABM_QUERYPOS. Sistem menentukan apakah ada bagian dari area layar dalam persegi panjang yang diusulkan digunakan oleh bilah tugas atau bilah aplikasi lain, lalu menyesuaikan persegi panjang (jika perlu), dan mengembalikan persegi panjang yang sudah disesuaikan ke aplikasi.

Selanjutnya, aplikasi mengirim pesan ABM_SETPOS untuk mengatur persegi panjang pembatas baru untuk appbar. Sekali lagi, sistem dapat menyesuaikan persegi sebelum mengembalikannya ke aplikasi. Untuk alasan ini, aplikasi harus menggunakan persegi panjang yang disesuaikan yang dikembalikan oleh ABM_SETPOS untuk mengatur ukuran dan posisi akhir. Aplikasi dapat menggunakan fungsiMoveWindowuntuk memindahkan appbar ke posisinya.

Dengan menggunakan proses dua langkah untuk mengatur ukuran dan posisi, sistem memungkinkan aplikasi untuk memberikan umpan balik perantara kepada pengguna selama operasi pemindahan. Misalnya, jika pengguna menyeret appbar, aplikasi mungkin menampilkan persegi panjang berteduh yang menunjukkan posisi baru sebelum appbar benar-benar bergerak.

Aplikasi harus mengatur ukuran dan posisi appbar-nya setelah mendaftarkannya dan setiap kali appbar menerima pesan pemberitahuan ABN_POSCHANGED. Appbar menerima pesan pemberitahuan ini setiap kali perubahan terjadi dalam ukuran, posisi, atau status visibilitas taskbar dan setiap kali appbar lain di sisi layar yang sama diubah ukurannya, ditambahkan, atau dihapus.

Setiap kali appbar menerima pesan WM_ACTIVATE, appbar harus mengirim pesan ABM_ACTIVATE. Demikian pula, ketika appbar menerima pesan WM_WINDOWPOSCHANGED, ia harus memanggil ABM_WINDOWPOSCHANGED. Dengan mengirimkan pesan-pesan ini memastikan bahwa sistem mengatur urutan z-order dengan benar dari panel aplikasi yang bersembunyi otomatis di tepi yang sama.

Bilah Alat Desktop Aplikasi Autohide

Appbar autohide adalah bilah aplikasi yang biasanya tersembunyi tetapi akan muncul ketika pengguna memindahkan kursor mouse ke tepi layar yang terkait dengan bilah aplikasi tersebut. Appbar menyembunyikan dirinya lagi ketika pengguna memindahkan kursor mouse keluar dari persegi panjang pembatas bilah.

Meskipun sistem memungkinkan sejumlah appbar yang berbeda pada waktu tertentu, sistem ini hanya mengizinkan satu appbar autohide pada satu waktu untuk setiap tepi layar berdasarkan urutan kedatangan pertama yang dilayani. Sistem secara otomatis mempertahankan urutan z dari appbar autohide (hanya dalam grup z-order-nya).

Aplikasi menggunakan pesan ABM_SETAUTOHIDEBAR untuk mendaftarkan atau membatalkan pendaftaran appbar autohide. Pesan menentukan tepi untuk appbar dan penanda yang menentukan apakah appbar akan didaftarkan atau dibatalkan pendaftarannya. Pesan gagal jika appbar autohide sedang didaftarkan tetapi sudah ada yang dikaitkan dengan tepi yang ditentukan. Aplikasi dapat mengambil tangkai ke appbar autohide yang terkait dengan tepi dengan mengirim pesan ABM_GETAUTOHIDEBAR.

Appbar autohide tidak perlu mendaftar sebagai appbar normal; artinya, tidak perlu didaftarkan dengan mengirim pesan ABM_NEW. Appbar yang tidak didaftarkan melalui ABM_NEW akan tumpang tindih dengan appbar lainnya yang ditempatkan di sisi layar yang sama.

Pesan Pemberitahuan Appbar

Sistem mengirim pesan untuk memberi tahu appbar tentang peristiwa yang dapat memengaruhi posisi dan tampilannya. Pesan dikirim dalam konteks pesan yang ditentukan aplikasi. Aplikasi menentukan pengidentifikasi pesan saat mengirim pesan ABM_NEW untuk mendaftarkan appbar. Kode pemberitahuan ada di parameter wParam dari pesan yang ditentukan aplikasi.

Appbar menerima pesan pemberitahuan ABN_POSCHANGED saat ukuran, posisi, atau status visibilitas taskbar berubah, saat appbar lain ditambahkan ke tepi layar yang sama, atau ketika appbar lain di tepi layar yang sama diubah ukurannya atau dihapus. Appbar harus merespons pesan pemberitahuan ini dengan mengirim pesan ABM_QUERYPOS dan ABM_SETPOS. Jika posisi sebuah appbar telah berubah, appbar tersebut harus memanggil fungsi MoveWindow untuk memindahkan dirinya ke posisi baru.

Sistem mengirim pesan pemberitahuan ABN_STATECHANGE setiap kali status autohide atau always-on-top taskbar telah berubah—yaitu, ketika pengguna memilih atau menghapus kotak centang Always on top atau Sembunyikan otomatis pada lembar properti taskbar. Appbar dapat menggunakan pesan pemberitahuan ini untuk mengatur statusnya agar sesuai dengan taskbar, jika diinginkan.

Saat aplikasi layar penuh dimulai atau ketika aplikasi layar penuh terakhir ditutup, appbar menerima pesan pemberitahuan ABN_FULLSCREENAPP. Parameter lParam menunjukkan apakah aplikasi layar penuh terbuka atau ditutup. Jika terbuka, appbar harus turun ke bagian bawah z-order. Appbar harus memulihkan posisi z-order ketika aplikasi layar penuh terakhir telah ditutup.

Appbar menerima pesan pemberitahuan ABN_WINDOWARRANGE saat pengguna memilih perintah Cascade, Tile Horizontal, atau Tile Vertically dari menu pintasan taskbar. Sistem mengirim pesan dua kali—sebelum mengatur ulang jendela (lParamTRUE) dan setelah mengatur jendela (lParamFALSE).

Appbar dapat menggunakan pesan ABN_WINDOWARRANGE untuk mengecualikan dirinya dari operasi kaskade atau petak peta. Untuk mengecualikan dirinya sendiri, appbar harus menyembunyikan diri ketika lParamTRUE dan menunjukkan diri ketika lParamFALSE. Jika appbar menyembunyikan dirinya sebagai respons terhadap pesan ini, appbar tidak perlu mengirim pesan ABM_QUERYPOS dan ABM_SETPOS sebagai respons terhadap operasi kaskade atau petak peta.

Mendaftarkan Bilah Alat Aplikasi Desktop

Aplikasi harus mendaftarkan appbar dengan mengirim pesan ABM_NEW. Mendaftarkan appbar menambahkannya ke daftar internal sistem dan menyediakan pengidentifikasi pesan kepada sistem untuk digunakan untuk mengirim pesan pemberitahuan ke appbar. Sebelum keluar, aplikasi harus membatalkan pendaftaran appbar dengan mengirim pesan ABM_REMOVE. Membatalkan pendaftaran akan menghapus appbar dari daftar internal sistem dan mencegah appbar menerima pesan pemberitahuan appbar.

Fungsi dalam contoh berikut mendaftarkan atau membatalkan pendaftaran appbar, tergantung pada nilai parameter bendera Boolean.

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

Mengatur Ukuran dan Posisi Appbar

Aplikasi harus mengatur ukuran dan posisi appbar setelah mendaftarkan appbar, setelah pengguna memindahkan atau mengukur appbar, dan setiap kali appbar menerima pesan pemberitahuan ABN_POSCHANGED. Sebelum mengatur ukuran dan posisi appbar, aplikasi meminta sistem untuk persegi panjang pembatas yang disetujui dengan mengirim pesan ABM_QUERYPOS. Sistem mengembalikan persegi panjang pembatas yang tidak mengganggu taskbar atau appbar lainnya. Sistem menyesuaikan persegi panjang murni dengan pengurangan persegi panjang; tidak ada upaya untuk mempertahankan ukuran awal persegi panjang. Untuk alasan ini, appbar harus menyesuaikan persegi panjang, jika diperlukan, setelah mengirim ABM_QUERYPOS.

Selanjutnya, aplikasi meneruskan persegi panjang pembatas kembali ke sistem dengan menggunakan pesan ABM_SETPOS. Kemudian memanggil fungsi MoveWindow untuk memindahkan appbar ke posisi.

Contoh berikut menunjukkan cara mengatur ukuran dan posisi 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); 

}

Memproses Pesan Pemberitahuan Appbar

Appbar menerima pesan pemberitahuan saat status taskbar berubah, saat aplikasi layar penuh dimulai (atau yang terakhir ditutup), atau ketika peristiwa terjadi yang dapat memengaruhi ukuran dan posisi appbar. Contoh berikut menunjukkan cara memproses berbagai pesan pemberitahuan.

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

Fungsi berikut menyesuaikan persegi panjang batas appbar dan kemudian memanggil fungsi AppBarQuerySetPos yang ditentukan aplikasi (termasuk di bagian sebelumnya) untuk mengatur ukuran dan posisi bilah yang sesuai.

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