暴米花 发表于 2006-12-8 11:25:00

[转帖]Win32API实现不规则窗口教程

<strong><br/><br/></strong>Windows&nbsp;API非规则窗体编程教程<br/>——nowpaper&nbsp;15英寸的世界 <p></p><p>一、前述<br/>也许您在其他软件中经常看到下面这样的界面,除了感叹视觉设计的绚丽外,也注意到了和其他软件的不同——窗口不是正规的正方形。这就是传说中的非规则窗体,也叫多边形窗口、不规则窗体(=。=名字够俗的)</p><p><b><a href="http://bbs.gameres.com/upload/sf_200582315115.rar" target="_blank"><font color="#9c0000">点击这里下载例子和全文</font></a></b><br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823144349.jpg" target="_blank"><img alt="" src="http://bbs.gameres.com/upload/sf_2005823144349.jpg" border="0"/></a></p>
[此贴子已经被作者于2006-12-8 11:35:14编辑过]

暴米花 发表于 2006-12-8 11:26:00

最初找这方面的资料,学习制作一个类似程序,结果发现很多资料都是说的不是很明白,或者是UI控件之类的东东,有一些范例程序还都运行不起来,经过一番折腾,发现一个共同特点,大都是MFC,对MFC印象不是很好,”虽然&nbsp;MFC&nbsp;非常强大,但它也有很多缺点,比如它只是&nbsp;Win32&nbsp;API&nbsp;外的一层薄薄的面板,并且对于很多程序员来说,它太过复杂,很难有效地使用。——MSDN”,另外编译出来的东西太臃肿了,一个普通的程序就要1M,事实上,我们仅仅用到了不到200K的部分。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文中将教会您如何使用Win32&nbsp;API来创建一个不规则窗体结构,以及附加漂亮的皮肤效果,在最后面,还会谈到应用在DX里面的应用。<br/>二、实现方式<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在本文中将以SetWindowRgn创建一个不规则的窗口。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于SetWindowRgn,在很多教程中都有提到,但是有一个共同特点就是作者们喜欢使用一个矩形或者圆形来创造一个不规则的窗体,也许您读完那些代码,但是却不能找到结果,难道每一个部分都要自己拼么?本文中通过颜色加上SetWindowRgn来解决您的问题,期望您读完有所收获,这正是我所希望的:)。

暴米花 发表于 2006-12-8 11:26:00

三、具体实施<br/><br/>1.准备2张图像<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这两张图像分别为mask.bmp和shik.bmp,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mask.bmp&nbsp;:镂空的蒙板文件,一般来讲这个图像是由2个颜色组成的,您需要指定一个颜色来判断那些部分是需要去掉的,而另外一个则是保留的部分。&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skin.bmp&nbsp;&nbsp;:皮肤文件,这个文件将会盖住留下的区域让这个窗体呈现需要的效果。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图像格式您可以使用任何可以读取的图像格式,若您对这2张图像的制作仍然存有疑问,您可以学习一下PhotoShop类似的软件,或者咨询一下视觉设计师。<br/><br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823144635.jpg" target="_blank"><img alt="" src="http://bbs.gameres.com/upload/sf_2005823144635.jpg" border="0"/></a>
[此贴子已经被作者于2006-12-8 11:27:51编辑过]

暴米花 发表于 2006-12-8 11:26:00

2.创建一个程序<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了方便学习起见,我们并不推荐您创建一个空工程从头作起,直接创建一个win32项目的实例还是比较好的。<br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823144745.jpg" target="_blank"><img alt="" src="http://bbs.gameres.com/upload/sf_2005823144745.jpg" border="0"/></a>
[此贴子已经被作者于2006-12-8 11:28:06编辑过]

暴米花 发表于 2006-12-8 11:27:00

3.添加需要的变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于命名的方式,这取决您的习惯,在这里没有使用指针,清爽的编码较容易学习,也许您可以更好的组织代码,但这并不是本文所关心的事情:)<br/><br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823144834.jpg" target="_blank"><img alt="" src="http://bbs.gameres.com/upload/sf_2005823144834.jpg" border="0"/></a><br/>
[此贴子已经被作者于2006-12-8 11:28:21编辑过]

暴米花 发表于 2006-12-8 11:28:00

<p>4.读取皮肤和蒙板<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这部分的代码添加位置在显示窗口之前。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过LoadImage加载bmp图像,也许您有更好的读取图像的程序,但值得注意的是蒙板文件一定要使用没有损伤的图像格式,这对颜色判断非常有用,例如bmp、gif等,在这里我们使用了的是一个bmp的图片。</p><p><a href="http://bbs.gameres.com/upload/sf_2005823145021.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_2005823145021.jpg" border="0" alt=""/></a></p>

暴米花 发表于 2006-12-8 11:29:00

5.最后的准备<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写上一些应用变量,在代码中我已经写好了注释。<br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823145120.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_2005823145120.jpg" border="0" alt=""/></a>

暴米花 发表于 2006-12-8 11:29:00

6.具体实现代码片断<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现方式为,判断蒙板图像的每一个点,如果这个点是需要镂空的颜色,那么就将它创建成为一个RNG(多边形),并且使用CombineRgn组合到整合的多边形中,最后使用SetWindowRgn来设置整合多边形为窗口区域。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里值得一提,这部分还可以优化,您知道,一般来讲镂空的都是一个区域而不是一个点,那么,我们或许可以做一点什么东西就可以让程序少执行几次CombineRgn^_^<br/><br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823145212.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_2005823145212.jpg" border="0" alt=""/></a>

暴米花 发表于 2006-12-8 11:29:00

7.show一下效果<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这就是依据蒙板创建出来的特殊窗口,上图的效果为用鼠标拖动时候的效果,您会发现:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)标题栏是存在的<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)菜单栏也是存在的<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)窗口的大小仍然存在问题 <p></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下一步来解决这个问题<br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_200582314537.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_200582314537.jpg" border="0" alt=""/></a></p>

暴米花 发表于 2006-12-8 11:30:00

8.解决上面的问题<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一步,移动创建窗口代码片断到实际实现代码的下面,让我们先将镂空区域设定好<br/><br/><br/><br/><a href="http://bbs.gameres.com/upload/sf_2005823145355.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_2005823145355.jpg" border="0" alt=""/></a>
页: [1] 2
查看完整版本: [转帖]Win32API实现不规则窗口教程