不知道,大家在使用windows 这个api的时候是否遇到过这样一个问题:
(1)使用POPUP类型的对话框,doModal 之后,使用SetWindowRgn没有任何问题,窗口范围能随api使用而变化;
(2)但是将1中的窗口设置为child风格,然后使用的时候发现不起作用;
经过几周测试得出以下windows文档中并未提及的结论:
1. 如果没有WS_CLIPSIBLINGS属性的子窗口。SetWindowRgn对子窗口不起作用只有对以domal形式显示的POPUP风格对话框起作用或者对具有任何overlapped窗口起作用。
2. 如果有WS_CLIPSIBLINGS属性的子窗口,但是没有OWNER_DRAW属性,SetWindowRgn能起作用但是其颜色效果异常。所以子窗口使用setwindowRgn时候必须在Presubclasswindow中增加WS_CLIPSIBLINGS和OWNER_DRAW属性,以便SetWindowRgn效果正常显示。
【如果子窗口设置了Owner_draw,但没有设置WS_CLIPSIBLINGS属性,那么显示结果为两个重叠窗口大小不一的相互覆盖在哪里,如图,说明兄弟窗口重叠,需要设置ws_clipsiblings属性显示兄弟窗口,至于具体SetWIndowRgn是否涉及到创建兄弟窗口一说我也没法说清楚,只是从结果看来是这样;;如果设置了WS_CLIPSIBLINGS,但是没有设置owner_draw属性效果如这样:,即形状有了,但是大小没变】。
3. SetWindowRgn不会改变窗口的客户区大小。
WS_CLIPSIBLINGS属性也剪辑兄弟窗口,即不对兄弟窗口绘制,也就是说本窗口在Z次序上要大于其他兄弟窗口,即本窗口覆盖在兄弟窗口之上,如果将本窗口设置为WS_CLIPSIBLINGS属性也就是在其覆盖了下面的兄弟窗口那部分窗口本窗口就不负责在绘制了,效果就是下面的窗口变为可见了!
对于第一点发现如果使用POPUP风格的Dialog动态创建而不是使用模态对话框形式显示时候,SetWindowRgn还是不起作用,这应该是Domodal中做了额外的工作对其风格进行了修改;而overlappedwindow是可以使用的,追溯两种窗口的宏定义发现:
首先介绍三种常用类型窗口:
■ 重叠窗口(overlapped window),具有应用程序主窗口的全部特点。它的非客户区包括一个可伸缩的框架【对话框是没有伸缩功能的】、菜单条、标题栏和最小化、最大化按钮。
■ 弹出窗口(popup window),具有消息框或者对话框的全部特点。它的非客户区包括一个固定大小的框架【不可变】和一个标题栏。
■ 子窗口(child window),具有类似按钮控件的全部特点。它没有非客户区,窗口的处理过程负责绘制窗口的每个部分。
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \
WS_CAPTION | \ 标题
WS_SYSMENU | \系统菜单-鼠标右击出现菜单
WS_THICKFRAME | \边框
WS_MINIMIZEBOX | \最大最小化
WS_MAXIMIZEBOX)
#define WS_POPUPWINDOW (WS_POPUP | \
WS_BORDER | \
WS_SYSMENU)
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
对于以上文章,我要纠正一点,这也是我后来测试出的结果:
子窗口可以使用SetWindowRgn设置子窗口的属性(你想想Button也是子窗口,既然button可以设置不同样式,其他子窗口同理!):
测试Demon如下:
http://download.csdn.net/detail/lixiang987654321/9324669