应用程序应在注册应用程序之后设置应用程序的大小和位置,用户用户移动或调整应用程序大小后,以及每当应用程序栏收到ABN_POSCHANGED通知消息时。在设置应用程序栏的大小和位置之前,应用程序通过发送ABM_QUERYPOS消息向系统查询批准的边界矩形。系统返回一个不影响任务栏或任何其他应用程序的边界矩形。系统通过矩形减法纯粹调整矩形;它不会保留矩形的初始大小。因此,应用程序应在发送ABM_QUERYPOS后根据需要重新调整矩形。
接下来,应用程序使用ABM_SETPOS消息将边界矩形传递回系统。然后它调用MoveWindow函数将appbar移动到位。
以下示例显示如何设置应用程序的大小和位置。
// AppBarQuerySetPos - 设置应用程序的大小和位置。
// uEdge - 应用栏所锚定的屏幕边
// lprc - 应用程序的当前边界矩形
// pabd - 具有hWnd和的APPBARDATA结构的地址
// cbSize成员填充
void PASCAL AppBarQuerySetPos(UINT uEdge,LPRECT lprc,PAPPBARDATA pabd)
{
int iHeight = 0;
int iWidth = 0;
pabd->rc = *lprc;
pabd->uEdge = uEdge;
//复制应用程序边界的屏幕坐标
//矩形进入APPBARDATA结构。
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);
}
//查询系统的批准大小和位置。
SHAppBarMessage(ABM_QUERYPOS, pabd);
//调整矩形,取决于它的边缘
// appbar被锚定
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;
}
//将最终的边界矩形传递给系统。
SHAppBarMessage(ABM_SETPOS, pabd);
//移动并调整应用程序的大小,使其符合
//传递给系统的边界矩形。
MoveWindow(pabd- > hWnd,pabd- > rc.left,pabd- > rc.top,
pabd- > rc.right - pabd- > rc.left,
pabd->rc.bottom - pabd->rc.top, TRUE);
}