创建非矩形窗口的简单方法

2016-01-29 11:50 67 1 收藏

创建非矩形窗口的简单方法,创建非矩形窗口的简单方法

【 tulaoshi.com - C语言心得技巧 】

创建非矩形窗口的简单方法
赵湘宁 本文范例程序

提出问题:    

    为了创建不同形状窗口的应用程序,象MP3播放器,我设置对话框的背景为 “TRANSPARENT”(透明)(使用SetBkMode)并在WM_CTLCOLORDLG消息处理器中创建一支“空笔”(NULL)来绘制对话框背景。然后我用TransparenBlt将自己的位图(bitmap)放到对话框上。开始显示对话框时透明,但关闭这个对话框下层的其它窗口时,重画后显示的是前一个窗口部分,而不是下层的窗口的图形。那么如何才能做到真正的透明?
    

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

    SetBkMode这个函数在绘制窗口时确实使背景透明,但Windows假设每一个窗口必须是矩形的。如果你改变窗口大小,或关闭或移动后面的窗口,Windows是不会重画你窗口下面的像素的,因为它已经假设你的窗口将它们置灰了。换句话说,每一个窗口负责完整地绘制自身,包括背景。(事实上,Windows在擦除窗口背景时恰好发送WM_ERASEBKGND消息)
那么那些形状怪异的音乐播放器的怪异形状是如何实现的呢?它们并不是使用透明(TRANSPARENT)绘制模式(尽管那样做也行得通),而是调用SetWindowRgn函数。这个特别的函数可以创建非矩形窗口。在SetWindowRgn函数中指定一个区域(HRGN),这个区域的形状就是窗口的形状。指定的区域可以是矩形、椭圆形、多边形、园角矩形或其它任何组合形状。图三列出了一个你可以使用的Windows函数列表,你可以使用这些函数创建和处理区域。调用SetWindowRgn函数时,你重写绘制约定:只负责绘制区域内部。Windows负责绘制区域外部以及其它的一些行为,如鼠标点击和改变光标。
本文附带的一个小程序,NonRect,示范了SetWindowRgn的使用方法(见图四)。NonRect是一个经过精简的标准MFC程序:带主框架类,CMainFrame,有一个OnSize处理器,其中含有如下代码:

CRect rc;
GetWindowRect(&rc);
rc -= rc.TopLeft(); //normalize
m_rgn.CreateRoundRectRgn(rc.left,rc.top,
rc.right,rc.bottom, 50,50);
SetWindowRgn(m_rgn,TRUE);

这段代码产生一个园角矩形窗口,见图五
图五

如果你改变窗口的大小,移动它或关闭它下面的其它窗口,会发现窗口的角不在了:Windows用适当的背景重画缺角,并且当你点击窗口缺角时,Windows激活下面的窗口(如果有的话)。当然,一个真的非矩形窗口是不会有标题条、菜单或边缘的,因为这些元素在非矩形窗口中出现是不对劲的。NonRect只是一个粗糙的demo程序,意在说明SetWindowRgn的使用方式。如果要让NonRect成为真正的非矩形窗口应用,就要去掉所有的菜单、边缘及其它不必要的东西,并要自己绘制窗口-也包括所有非客户区域。一般来说,一旦你决定使用SetWindowRgn函数,那么很多事情就得由以自己做了,你必须自己实现所有的菜单,最小/最大化按钮,边缘(如果有的话)及非客户区的点击测试。尤其是你要重载不是全部也是大多数的WM_NCXXX消息。

来源:http://www.tulaoshi.com/n/20160129/1483533.html

延伸阅读
小狗折纸的简单方法 准备材料:正方形卡纸、马克笔 第一步:首先将准备好的正方形卡纸放在桌面上呈三角对折。 第二步:然后将折好的三角形底边右边角往上方折叠一下。 第三步:然后将三角形左边的角也往上折一下,折的长度和右边一样。 第四步:将卡纸角度翻转一下,然后把底部的尖角往上折叠。 第五步:然后用准备好的...
标签: 美容 美容方法
    去雀斑的简单方法?研究发现,在面饼、酱料和奶酪中,都含有相当数量的盐分,常规大小的一角披萨含盐量就可能达到600毫克。因此,专家建议选择蔬菜多的披萨饼,每餐别超过两角,避免经常食用。     此外,面包、冷切肉等食物中也含有高量的盐。其中,90克冷切肉(约3片)中就含有450毫克~1克钠盐;一片面包含盐量高达...
标签: 美容护肤 护肤
很多人认为过了青春期就不会长痘痘了,其实不是的呢。那么痘痘形成原因是什么呢?下面这些去痘痘的简单方法,便捷又快速祛痘,快来试试! 痘痘形成原因 1、内分泌失调 不合理的饮食习惯,来自生活、工作以及感情方面的压力以及生理期的来临,都会改变原本平衡的雌雄性激素分泌,雌激素和代谢会出现紊乱的现象,导致皮脂腺分泌旺盛,造成脸...
标签: 生活常识
夏季驱蚊的简单方法   1、吃大蒜可有效驱蚊,因为蚊子不喜欢人体分泌出来的大蒜味。 2、口服维生素B、通过人体生理代谢后从汗液排出体外,会产生一种蚊子不敢接近的气味。服法为睡前一小时口服维生素B1~2片,但不要长期大量服用。 图老师阅读配图 3、穿黄色、模色、白色衣服在日常生活中,常见有些人经常挨蚊子咬,而...
标签: 美容护肤
芦荟汁 1 可以用芦荟胶涂抹局部,消炎止痒,褪黑祛疤,促进皮肤新陈代谢。注意保持局部干净卫生,不要用手抠局部。在疤痕初期食用芦荟汁具有减轻疤印的作用,这是因为芦荟凝胶所含的氨基酸类、有机酸类、芦荟辛等成分能抑制酪氨酸酶活性,阻碍黑色素的形成。 冰河泥面膜 2 不小心擦伤或出现其他较浅的伤痕,可以在用点酒止血消毒后,在...

经验教程

154

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部