没有在CWnd上绘制厚帧

时间:2010-06-22 20:54:55

标签: windows winapi windows-7 drawing aero

我有一个应用程序窗口,我在其中添加了WS_THICKFRAME样式,并且我已经删除了WS_CAPTION样式。当窗口最大化时,我想隐藏WS_THICKFRAME,但保留Aero-Snap功能,所以我更改了WS_NCCALCSIZE的处理程序,以返回相对于窗口边框大小的膨胀矩形。

也就是说,WS_NCCLIENTSIZE处理程序代码的重要部分如下所示:

...
CRect rc( lpncsp->rgrc[0] );
if (IsZoomed())
{
    int borderSize = GetSystemMetrics(SM_CYSIZEFRAME);
    rc.InflateRect(borderSize,topOff+borderSize,borderSize,borderSize);
}
else
    rc.InflateRect(0,topOff+0,0,0);

lpncsp->rgrc[0] = rc;
...

该代码有效地隐藏了WS_THICKFRAME。

唯一的问题是当窗口失去焦点或重新获得焦点(同时最大化)时,WS_THICKFRAME会在边界内绘制。是否有消息我可以返回膨胀的矩形或至少重新调整窗口大小以在设置/取消设置窗口焦点时再次隐藏WS_THICKFRAME?

1 个答案:

答案 0 :(得分:1)

是的,那不行。为WM_GETMINMAXINFO实现一个消息处理程序,以允许窗口的边框从屏幕上掉下来。请注意,如果您没有设置链接器的/ SUBSYSTEM选项来表示您的程序是针对Vista或Win7(版本6,0),那么当您使用GetWindowRect()时Aero会骗你。您获得的值基于瘦(遗留)边界。