首页 > 代码库 > 自绘窗口要处理的几个关键消息

自绘窗口要处理的几个关键消息

要想绘制一个窗口,替换掉原始的标题栏,最大最小按钮等,要经过以下步骤:
一般窗口都有标准标题栏,最大最小按钮等。要想自绘标题栏,最大最小按钮,首先要将他们给去除掉,怎么样除掉呢?
1 可以定义窗口类型为没有边框的,这样系统就不会给窗口加上标题栏,按钮了。但是这种方式会导致一些问题,比方说窗口不能resize,不能移动,在任务栏不能最小化窗口等问题,当然可以在程序中处理这些问题,但显得麻烦了。
2 可以响应Windows的WM_NCCALCSIZE消息,该消息是当窗口需要计算client大小时调用的(不要被名字NC给蒙蔽了,参看MSDN:The WM_NCCALCSIZE message is sent when the size and position of a window‘s client area must be calculated. By processing this message, an application can control the content of the window‘s client area when the size or position of the window changes.),即任何时候需要显示client时都会调用。在该消息中可以让窗口就是整个客户区,这样就没有了非客户区。接下来就可以用贴图的方式实现自定义的最大最小按钮等,也可以贴出原窗口不能显示的Logo美图

第二个问题,请看下面的图:
技术分享
技术分享
点击那个区域仍然会有系统默认的按钮出现,解决这个办法是在OnSize函数中给该窗口设置一个裁剪区域,最好也重写默认的响应WM_NCPAINT过程

第三个问题,请看下图:
技术分享
技术分享
是当该窗口即将失去焦点时系统给他加上的默认按钮和边框,解决这个的办法是重写默认的响应WM_NCACTIVATE消息过程。

当然除了以上视觉上的问题,还可能会有其他问题,比如窗口不能拖动,处理WM_NCHITTEST消息即可。
最后是其他细节问题,比如改变窗口大小时怎么处理,这个需要细心测试调试,还有如何定义窗口的最大化尺寸等问题。
当然绘制窗口的核心是使窗口美化,这个需要对窗口贴图,混合颜色等操作,这个下次再详谈。

自绘窗口要处理的几个关键消息