WS_CLIPCHILDREN和WS_CLIPSIBLINGS两种窗口样式的理解

来源:互联网 发布:2017淘宝对职业退货师 编辑:程序博客网 时间:2024/05/17 22:00

  1.求助MSDN

  我的第一步当然是求助MSDN。在MSDN里面有详细的解释。

  1.1 WS_CLIPCHILDREN

  WS_CLIPCHILDREN样式从字面上可以理解成ClipChildren,裁减子窗口。

  MSDN里的E文解释:Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.

  读E文是一件困难的事,为了不让大家再重复我的痛苦,我就越俎代庖翻译一下:WS_CLIPCHILDREN样式主要是用于父窗口,也就是说当在父窗口绘制的时候,父窗口上还有一个子窗口,那么设置了这个样式的话,子窗口区域父窗口就不负责绘制。

  那么按照MSDN的理解,可以用下面这幅图来表示:

  图片看不清楚?请点击这里查看原图(大图)。

  图 1‑1 WS_CLIPCHILDREN样式的初理解

  1.1 WS_CLIPSIBLINGS

  WS_CLIPSIBLINGS样式从字面上可以理解成ClipSiblings,裁减兄弟窗口。

  MSDN里的E文解释:Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.

  中文意思是:子窗口间相互裁减。也就是说当两个窗口相互重叠时,设置了WS_CLIPSIBLINGS样式的子窗口重绘时不能绘制被重叠的部分。反之没有设置WS_CLIPSIBLINGS样式的子窗口重绘时是不考虑重叠不重叠,统统重绘。

  图片看不清楚?请点击这里查看原图(大图)。

  图 1‑2 WS_CLIPSIBLINGS样式的初理解

  2.求助Google

  最初看完MSDN,说实话,没有像现在这么清晰画出上面两幅图。而是一片茫然。Google上我所搜索到的中文的还算是比较好的一篇,应该是这篇:http://blog.163.com/sandylin_wind/blog/static/935500552008105104617806/

  大家可以看看,但是确实我觉得还不够详细,因此才会写篇博文,讨论一下这个问题。

  当然E文的专注于WS_CLIPCHILDREN和WS_CLIPSIBLINGS讨论的也比较少。可能老外由于懂E文,所以不像我们这样费事。

  经过一番搜索,仍然有一些比较重要的结论,列举如下:

  (1)           所有的overlapped和popup风格的窗口,都有WS_CLIPSIBLINGS 属性。也就是说这类风格的窗口,你是去不掉WS_CLIPSIBLINGS 属性的,不会在它重叠的兄弟窗口绘图;

  (2)           更进一步说明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.)

  当然在Google上搜索,通常会有意外发现,一般和这个主题相关的往往是控件如何透明的问题。这里也给大家几个关于控件透明的讨论。

  (1)      http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/4744/Transparent-bitmap-button。这个是关于控件上绘制位图,然后透明的讨论。在桌面系统和WinCE的CreateWindoowsEx还有一些细微的差别,在WinCE上隐含地指定了窗口具备WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格;

  (2)      http://www.pocketpcdn.com/articles/transparent_static.html这个是关于控件上面文本透明的例子。

  3.做几个实验

  3.1 验证 WS_CLIPCHILDREN

  简单到什么程度呢?只需要在对话框的属性打个勾而已。

  图 3‑1 如何设置对话框Clip Children属性

  我们先做做第一个程序,这个程序唯一有点难的地方就在于需要继承一下CStatic类,然后重载一下OnPaint函数。

void MYStatic::OnPaint(){CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // 获得控件客户区矩形大小CRect rect;GetClientRect(rect);// 绘制控件边框dc.MoveTo(0,0);dc.LineTo(rect.Width(),0);dc.LineTo(rect.Width(),rect.Height());dc.LineTo(0,rect.Height());dc.LineTo(0,0); // 绘制文本    dc.TextOut(rect.Width()/2 - 5,rect.Height()/2 - 5,"Hello"); // Do not call CStatic::OnPaint() for painting messages}
http://tech.ddvip.com/2009-06/1243872103121916.html


原创粉丝点击