要想绘制一个窗口,替换掉原始的标题栏,最大最小按钮等,要经过以下步骤:
一般窗口都有标准标题栏,最大最小按钮等。要想自绘标题栏,最大最小按钮,首先要将他们给去除掉,怎么样除掉呢?
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美图
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消息即可。
最后是其他细节问题,比如改变窗口大小时怎么处理,这个需要细心测试调试,还有如何定义窗口的最大化尺寸等问题。
当然绘制窗口的核心是使窗口美化,这个需要对窗口贴图,混合颜色等操作,这个下次再详谈。