Uygulama Masaüstü Araç Çubuklarını Kullanma
uygulama masaüstü araç çubuğu (uygulama çubuğu olarak da adlandırılır), Windows görev çubuğuna benzer bir penceredir. Ekranın bir kenarına sabitlenmiştir ve genellikle kullanıcıya diğer uygulama ve pencerelere hızlı erişim sağlayan düğmeler içerir. Sistem, diğer uygulamaların bir uygulama çubuğu tarafından kullanılan masaüstü alanını kullanmasını engeller. Herhangi bir anda masaüstünde herhangi bir sayıda uygulama çubuğu bulunabilir.
Bu konu aşağıdaki bölümleri içerir.
- Uygulama Masaüstü Araç Çubukları Hakkında
- Uygulama Masaüstü Araç Çubuğunu Kaydetme
- Uygulama Çubuğu Boyutunu ve Konumunu Ayarlama
- Uygulama Çubuğu Bildirim İletilerini İşleme
Uygulama Masaüstü Araç Çubukları Hakkında
Windows, sistem tarafından sağlanan appbar hizmetlerinden yararlanmanızı sağlayan bir API sağlar. Hizmetler, uygulama tanımlı uygulama çubuklarının birbiriyle ve görev çubuğuyla sorunsuz bir şekilde çalışmasını sağlamaya yardımcı olur. Sistem, her bir uygulama çubuğu hakkındaki bilgileri korur ve appbars iletilerini göndererek boyutlarını, konumlarını ve görünümlerini etkileyebilecek olaylar hakkında bildirim gönderir.
İleti Gönderme
Uygulama, bir uygulama çubuğu eklemek veya kaldırmak, bir uygulama çubuğunun boyutunu ve konumunu ayarlamak ve görev çubuğunun boyutu, konumu ve durumu hakkında bilgi almak için appbar iletileri olarak adlandırılan özel bir ileti kümesi kullanır. Uygulama çubuğu iletisi göndermek için uygulamanın SHAppBarMessage işlevini kullanması gerekir. İşlevin parametreleri, ABM_NEWgibi bir ileti tanımlayıcısı ve APPBARDATA yapısının adresini içerir. Yapı üyeleri, sistemin verilen iletiyi işlemek için ihtiyaç duyduğu bilgileri içerir.
Belirli bir uygulama çubuğu iletisi için sistem, APPBARDATA yapısının bazı üyelerini kullanır ve diğerlerini yoksayar. Ancak, sistem her zaman cbSize ve hWnd üyelerini kullanır, bu nedenle bir uygulamanın her appbar iletisi için bu üyeleri doldurması gerekir. cbSize üyesi yapının boyutunu belirtir ve hWnd üyesi de uygulama çubuğunun penceresinin tutamacıdır.
Bazı uygulama çubuğu iletileri sistemden bilgi ister. Sistem bu iletileri işlerken istenen bilgileri APPBARDATA yapısına kopyalar.
Kayıt
Sistem, iç bir uygulama çubuğu listesi tutar ve listedeki her çubukla ilgili bilgileri korur. Sistem, appbar'ları yönetmek, bunlar için hizmet gerçekleştirmek ve bildirim iletileri göndermek için bu bilgileri kullanır.
Bir uygulamanın, sistemden appbar hizmetlerini alabilmesi için önce bir uygulama çubuğunu kaydetmesi (iç listeye eklemesi) gerekir. Uygulama çubuğunu kaydetmek için uygulama ABM_NEW iletisini gönderir. Eşlik eden APPBARDATA yapısı, appbar penceresinin tutamacını ve uygulama tanımlı ileti tanımlayıcısını içerir. Sistem, uygulama çubuğu penceresinin pencere yordamına bildirim iletileri göndermek için ileti tanımlayıcısını kullanır. Daha fazla bilgi için bkz. Uygulama Çubuğu Bildirim İletileri.
Uygulama, ABM_REMOVE iletisini göndererek bir uygulama çubuğunun kaydını kaldırıyor. Bir uygulama çubuğunun kaydının kaldırılması, bunu sistemin iç uygulama çubukları listesinden kaldırır. Sistem artık uygulama çubuğuna bildirim iletileri göndermez veya diğer uygulamaların uygulama çubuğu tarafından kullanılan ekran alanını kullanmasını engeller. Bir uygulama, bir uygulama çubuğunu yok etmeden önce daima ABM_REMOVE göndermelidir.
Uygulama Çubuğu Boyutu ve Konumu
Bir uygulama, başka bir uygulama çubuğuna veya görev çubuğuna müdahale etmemesi için bir uygulama çubuğunun boyutunu ve konumunu ayarlamalıdır. Her uygulama çubuğunun ekranın belirli bir kenarına sabitlenmiş olması gerekir ve bir kenarda birden çok uygulama çubuğu sabitlenebilir. Ancak, bir uygulama çubuğu görev çubuğuyla aynı kenarda sabitlenmişse, sistem görev çubuğunun her zaman en dış kenarda olmasını sağlar.
Uygulama çubuğunun boyutunu ve konumunu ayarlamak için, uygulama ilk olarak ABM_QUERYPOS iletisini göndererek uygulama çubuğu için bir ekran kenarı ve sınırlayıcı dikdörtgen önerir. Sistem, önerilen dikdörtgen içindeki ekran alanının herhangi bir bölümünün görev çubuğu veya başka bir uygulama çubuğu tarafından kullanılıp kullanılmadığını belirler, dikdörtgeni ayarlar (gerekirse) ve ayarlanan dikdörtgeni uygulamaya döndürür.
Ardından uygulama, uygulama çubuğu için yeni sınırlayıcı dikdörtgeni ayarlamak üzere ABM_SETPOS iletisini gönderir. Yine sistem dikdörtgeni uygulamaya döndürmeden önce ayarlayabilir. Bu nedenle uygulama, son boyutu ve konumu ayarlamak için ABM_SETPOS tarafından döndürülen ayarlanmış dikdörtgeni kullanmalıdır. Uygulama, MoveWindow işlevini kullanarak uygulama çubuğunu konuma taşıyabilir.
Sistem, boyutu ve konumu ayarlamak için iki adımlı bir işlem kullanarak uygulamanın taşıma işlemi sırasında kullanıcıya ara geri bildirim sağlamasına olanak tanır. Örneğin, kullanıcı bir uygulama çubuğunu sürüklerse uygulama, uygulama çubuğu gerçekten taşınmadan önce yeni konumu gösteren gölgeli bir dikdörtgen görüntüleyebilir.
Uygulama, kayıt ettikten sonra ve uygulama çubuğu ABN_POSCHANGED bildirim iletisini aldığında, uygulama çubuğunun boyutunu ve konumunu ayarlamalıdır. Görev çubuğunun boyut, konum veya görünürlük durumunda bir değişiklik olduğunda ve ekranın aynı tarafındaki başka bir uygulama çubuğu yeniden boyutlandırıldığında, eklendiğinde veya kaldırıldığında uygulama çubuğu bu bildirim iletisini alır.
Bir uygulama çubuğu WM_ACTIVATE iletisini aldığında, ABM_ACTIVATE iletisini göndermelidir. Benzer şekilde, bir uygulama çubuğu bir WM_WINDOWPOSCHANGED iletisi aldığında ABM_WINDOWPOSCHANGEDçağrısı yapmalıdır. Bu mesajların gönderilmesi, sistemin aynı kenardaki otomatik gizleme uygulama çubuklarının z sırasını düzgün şekilde ayarlamasını sağlar.
Uygulama Masaüstü Araç Çubuklarını Otomatik Gizle
Otomatik göster uygulama çubuğu normalde gizli olan ancak kullanıcı fare imlecini uygulama çubuğunun ilişkilendirildiği ekran kenarına hareket ettirdiğinde görünür hale gelen bir uygulama çubuğudur. Kullanıcı fare imlecini çubuğun sınırlayıcı dikdörtgeninin dışına taşırken uygulama çubuğu kendini yeniden gizler.
Sistem bir anda çeşitli uygulama çubuklarına izin verse de, her ekran kenarı için yalnızca bir otomatik gizlenen uygulama çubuğuna, ilk gelen alır esasına göre izin verir. Sistem otomatik olarak bir otomatik gizleme uygulama çubuğunun z sırasını korur (yalnızca z-order grubu içinde).
Bir uygulama, kendiliğinden gizlenen bir uygulama çubuğunu kaydetmek veya kayıttan çıkarmak için ABM_SETAUTOHIDEBAR iletisini kullanır. İleti, uygulama çubuğunun kenarını ve uygulama çubuğunun kaydedilip kaydedilmeyeceğini belirten bir bayrağı belirtir. Otomatik gizlenen bir uygulama çubuğu kaydedilmeye çalışılıyorsa fakat belirtilen kenarla zaten bir uygulama çubuğu ilişkilendirilmişse, mesajda hata oluşur. Bir uygulama, ABM_GETAUTOHIDEBAR iletisini göndererek bir kenarla ilişkilendirilmiş otomatik gizlenen uygulama çubuğunun tanıtıcısını alabilir.
Otomatik gizlenen bir uygulama çubuğunun normal bir uygulama çubuğu olarak kaydedilmesi gerekmez; yani, ABM_NEW iletisi gönderilerek kaydedilmesi gerekmez. ABM_NEW tarafından kaydedilmeyen bir uygulama çubuğu, ekranın aynı kenarına sabitlenmiş tüm uygulama çubuklarıyla çakışıyor.
Uygulama Çubuğu Bildirim İletileri
Sistem, konumunu ve görünümünü etkileyebilecek olaylar hakkında bir uygulama çubuğuna bildirim göndermek için iletiler gönderir. İletiler, uygulama tanımlı bir ileti bağlamında gönderilir. Uygulama, uygulama çubuğunu kaydetmek için ABM_NEW iletisini gönderdiğinde iletinin tanımlayıcısını belirtir. Bildirim kodu, uygulama tanımlı iletinin wParam parametresindedir.
Görev çubuğunun boyutu, konumu veya görünürlük durumu değiştiğinde, ekranın aynı kenarına başka bir uygulama çubuğu eklendiğinde veya ekranın aynı kenarındaki başka bir uygulama çubuğu yeniden boyutlandırıldığında veya kaldırıldığında uygulama çubuğu ABN_POSCHANGED bildirim iletisini alır. Bir uygulama çubuğu, ABM_QUERYPOS ve ABM_SETPOS iletileri göndererek bu bildirim iletisine yanıt vermelidir. Bir uygulama çubuğunun konumu değiştiyse, kendisini yeni konuma taşımak için MoveWindow işlevini çağırması gerekir.
Sistem, görev çubuğunun otomatik gösterme veya her zaman üstte durumu değiştiğinde (yani kullanıcı görev çubuğunun özellik sayfasındaki Her zaman üstte veya Otomatik gizle onay kutusunu seçtiğinde veya temizlediğinde) ABN_STATECHANGE bildirim iletisini gönderir. Bir uygulama çubuğu, isterseniz durumunu görev çubuğunun durumuna uyacak şekilde ayarlamak için bu bildirim iletisini kullanabilir.
Tam ekran bir uygulama başlatıldığında veya son tam ekran uygulama kapatıldığında, bir uygulama çubuğu ABN_FULLSCREENAPP bildirim iletisini alır. lParam parametresi, tam ekran uygulamanın açılıp açılmadığını veya kapandığını gösterir. Açılırsa, uygulama çubuğu z düzeninde en alta düşmelidir. Son tam ekran uygulama kapatıldığında uygulama çubuğu, z-düzenindeki konumunu geri yüklemelidir.
Kullanıcı görev çubuğunun kısayol menüsünden Basamakla Diz, Yatay Döşe veya Dikey Döşe komutunu seçtiğinde bir uygulama çubuğu ABN_WINDOWARRANGE bildirim iletisini alır. Sistem, pencereleri yeniden düzenlemeden önce (lParamTRUE) ve pencereleri düzenledikten sonra (lParamFALSE) iki kez ileti gönderir.
Bir uygulama çubuğu, ABN_WINDOWARRANGE iletilerini kullanarak kendisini art arda veya kutucuk işlemlerinden dışlayabilir. Kendisini dışlamak için, lParam TRUE kendini gizlemelidir ve lParam FALSE olduğunda kendini göstermelidir. Bir uygulama çubuğu bu iletiye yanıt olarak kendisini gizlerse, ABM_QUERYPOS ve ABM_SETPOS iletilerini art arda veya kutucuk işlemine yanıt olarak göndermesi gerekmez.
Uygulama Masaüstü Araç Çubuğu Kaydetme
Bir uygulamanın ABM_NEW iletisini göndererek bir uygulama çubuğunu kaydetmesi gerekir. Bir uygulama çubuğunun kaydedilmesi, bunu sistemin iç listesine ekler ve sisteme, uygulama çubuğuna bildirim iletileri göndermek için kullanılacak bir ileti tanımlayıcısı sağlar. Çıkmadan önce, bir uygulamanın ABM_REMOVE iletisini göndererek uygulama çubuğunun kaydını kaldırması gerekir. Kaydı kaldırma, uygulama çubuğunu sistemin iç listesinden kaldırır ve çubuğun appbar bildirim iletilerini almasını engeller.
Aşağıdaki örnekteki işlev, Boole bayrağı parametresinin değerine bağlı olarak bir uygulama çubuğunu kaydeder veya kaydını kaldırır.
// 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;
}
Uygulama Çubuğu Boyutunu ve Konumunu Ayarlama
Uygulama, uygulama çubuğunu kaydettikten sonra, kullanıcı uygulama çubuğunu taşır veya boyutlandırdıktan sonra ve uygulama çubuğu ABN_POSCHANGED bildirim iletisini aldığında bir uygulama çubuğunun boyutunu ve konumunu ayarlamalıdır. Uygulama çubuğu boyutunu ve konumunu ayarlamadan önce uygulama, ABM_QUERYPOS iletisini göndererek sistemi onaylı bir sınırlayıcı dikdörtgen için sorgular. Sistem, görev çubuğuna veya başka bir uygulama çubuğuna müdahalede bulunmayan sınırlayıcı bir dikdörtgen döndürür. Sistem dikdörtgeni yalnızca dikdörtgen çıkarma yoluyla ayarlar; dikdörtgenin ilk boyutunu korumak için hiçbir çaba harcamaz. Bu nedenle, uygulama çubuğu ABM_QUERYPOSgönderdikten sonra dikdörtgeni gerektiği gibi yeniden ayarlamalıdır.
Ardından uygulama, ABM_SETPOS iletisini kullanarak sınırlayıcı dikdörtgeni sisteme geri geçirir. Ardından MoveWindow işlevini çağırarak uygulama çubuğunu konuma taşır.
Aşağıdaki örnekte, bir uygulama çubuğunun boyutunu ve konumunu ayarlama gösterilmektedir.
// 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);
}
Uygulama Çubuğu Bildirim İletilerini İşleme
Görev çubuğunun durumu değiştiğinde, tam ekran bir uygulama başlatıldığında (veya son uygulama kapandığında) veya uygulama çubuğunun boyutunu ve konumunu etkileyebilecek bir olay oluştuğunda uygulama çubuğu bir bildirim iletisi alır. Aşağıdaki örnekte çeşitli bildirim iletilerinin nasıl işlendiği gösterilmektedir.
// 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;
}
}
Aşağıdaki işlev, bir appbar'ın sınırlayıcı dikdörtgenini ayarlar ve ardından çubuğun boyutunu ve konumunu uygun şekilde ayarlamak için uygulama tanımlı AppBarQuerySetPos işlevini (önceki bölümde yer alır) çağırır.
// 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);
}