加了 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;
}


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


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值