处理Appbar通知消息

【勇芳软件工作室】汉化HomePreviousNext

当任务栏的状态改变,全屏应用程序启动(或最后一个关闭)或发生可能影响应用程序的大小和位置的事件时,应用程序栏会收到通知消息。以下示例显示如何处理各种通知消息。

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

}