非客户区 窗口自绘

在进行界面自绘时,一般都需要处理系统的边框,也就是所谓的非客户区,以前做界面时经常为这个问题发愁,那会摸索出了一种简单的方法:

让窗口根本就不存在非客户区,所有的绘制都在客户区里面,但是只会引入另外一个问题,如何实现窗口需要通过鼠标拉伸变化大小?CodeProject上面有个例子可供参考http://www.codeproject.com/KB/MFC/CustomWindow.aspx,里面的处理稍显麻烦,可以自己适当优化下。


另外一种方法是在研究QQ2009之后的界面时发现的,通过SPY可以看出其可拉伸的窗口属性为:

WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_OVERLAPPEDWINDOW

WS_POPUP|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX|WS_MINIMIZEBOX

这里主要是有一个|WS_THICKFRAME,一般情况下有这个属性的窗口肯定会带有系统边框,即带有非客户区,通过SPY++也可以看出其客户矩形的左边不是从0开始的,且是可以通过鼠标拉伸大小的,但是QQ的窗口通过SPY查看会发现其客户区和窗口一样大小,这是为什么呢,显然其通过某种手段将非客户区干掉了,这时我们肯定会想到WM_NCCALCSIZE消息,没错就是这个消息,我们直接在接收到这个消息的地方返回0即可,在MSDN2008里面对这个消息没有说明可以直接返回0,但是在在线版MSDN文档里面有下面这段:

 

Starting with Windows Vista, removing the standard frame by simply returning 0 when the wParam is TRUE does not affect frames that are extended into the client area using the DwmExtendFrameIntoClientArea function. Only the standard frame will be removed.

 

 

剩下的只需在WM_NCHITTEST消息里面处理即可了。

具体实现可以参见下面这个例子:http://download.csdn.net/source/3130708

 

PS:写此文主要是最近看到网上很多开源的DirectUI库,想起当初刚工作那会的界面开发工作,确实学到了不少东西,在研究某个库时发现了WM_NCCALCSIZE直接返回0即可去掉系统非客户区,有趣的是在线版MSDN对这个有说明,而我的本地版没有,让我走了不少弯路啊

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MFC(Microsoft Foundation Class)是一种用于开发Windows平台应用程序的类库,它提供了丰富的功能和接口来简化开发者的工作。MFC客户完美自绘是指在MFC应用程序中,开发者可以对客户(如标题栏、边框等)进行完全自定义的绘制。这意味着开发者可以根据自己的需求和设计来美化和定制应用程序的外观。 MFC客户完美自绘的实现需要开发者对MFC框架和Windows消息处理有一定的了解和掌握。通过重载窗口类的相应函数(如OnNcPaint、OnNcCalcSize等),开发者可以获取客户绘制消息,并在这些消息的处理过程中进行自定义的绘制操作。此外,还可以通过修改窗口样式(style)和扩展风格(extended style)等方式来实现客户的自定义外观。 MFC客户完美自绘的优点在于可以实现高度的个性化定制,使应用程序更加独特和美观。开发者可以根据自己的设计风格和用户体验要求,完全自定义客户的外观和交互效果,从而提升应用程序的品质和吸引力。同时,这也为开发者提供了更大的发挥空间,可以实现更多创新和特色的功能。 总之,MFC客户完美自绘为开发者提供了丰富的自定义机会,使他们能够打造出更加独特和优秀的Windows应用程序。通过深入理解MFC框架和消息处理机制,开发者可以充分利用这一特性,为用户带来更好的体验和享受。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值