当任务栏的状态改变,全屏应用程序启动(或最后一个关闭)或发生可能影响应用程序的大小和位置的事件时,应用程序栏会收到通知消息。以下示例显示如何处理各种通知消息。
// AppBarCallback - 处理系统发送的通知消息。
// hwndAccessBar - appbar的句柄
// uNotifyMsg - 通知消息的标识符
// lParam - 消息参数
void AppBarCallback(HWND hwndAccessBar,UINT uNotifyMsg,
LPARAM lParam)
{
APPBARDATA abd;
UINT uState;
abd.cbSize = sizeof(abd);
abd.hWnd = hwndAccessBar;
switch(uNotifyMsg){
case ABN_STATECHANGE:
//检查任务栏的永远在线状态是否有
//改变了,如果有的话,改变appbar的状态
//相应地。
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:
//全屏应用程序已启动,或最后一个完整
//屏幕应用已关闭。设置appbar的
// Z顺序正确。
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:
//任务栏或其他应用程序已更改它
//尺寸或位置。
AppBarPosChanged(&abd);
break;
}
}
以下函数调整appbar的边界矩形,然后调用应用程序定义的AppBarQuerySetPos函数(包括在上一节中)来相应地设置条的大小和位置。
// AppBarPosChanged - 调整appbar的大小和位置。
// pabd - 包含信息的APPBARDATA结构的地址
//用于调整大小和位置
无效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);
}