加了 WS_THICKFRAME 风格,如何能无边框?

  如果想无边框,直接去掉WS_THICKFRAME不就行了嘛。那为什么还要有WS_THICKFRAME风格,再费劲去掉边框了?

没有WS_THICKFRAME会带来很多问题:

1.没有WS_THICKFRAME,有WS_SYSMENU,就没办法通过相应WM_NCHITTEST,去处理窗口的缩放。

2.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统下任务栏就没有右键菜单弹出。

3.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统任务栏里,想把右键菜单弹出是有方法,不过是个偏方,方法如下:
    1)响应MS没有对外公开的0x313消息,在这个消息里面给主窗口加上WS_SYSMENU风格。
    2)在任务栏菜单弹出来后,响应WM_INITMENUPOPUP消息,在这个消息里通过 HIWORD(lParam) 来判断是否为1,如果是1就表示是系统的菜单弹出(这个消息最后要给系统回调函数处理,不能直接return了);这个时候去掉WS_SYSMENU风格。这样一来一去,可以既弹出任务栏右键菜单,也不影响窗口缩放的处理。

4.现在任务栏右键菜单能弹出来了,可是还有一个问题,在xp系统下,当你窗口最大化了,你移动窗口,还是能移动。。。。 这个问题,你也可以通过其他方式去不让窗口在最大化时移动。但是你发现,在win7系统下,“窗口移动到边缘时自动排列窗口”的功能不能正常工作了。

也就是说,去掉WS_THICKFRAME会带来很多问题,但是你又想WS_THICKFRAME的情况下去掉边框,自己去画UI,哈哈,当你看到这里,恭喜你,有方法可以解决:

响应WM_NCCALCSIZE消息,消息响应函数如下(我这里给出的是wtl的):

LRESULT OnNcCalcSize( UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/ )
{
NCCALCSIZE_PARAMS* lpncsp = (NCCALCSIZE_PARAMS*)lParam;

if((BOOL)wParam)
{
lpncsp->rgrc[2] = lpncsp->rgrc[1];
lpncsp->rgrc[1] = lpncsp->rgrc[0];
}
return TRUE;
}


就这样一个消息拦截处理下,搞定。。。。。。


你可能感兴趣的:(C/C++)