﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客--随笔分类-《Visual C++游戏编程基础》学习笔记</title><link>http://www.cppblog.com/kangnixi/category/13469.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 09 Apr 2010 22:57:07 GMT</lastBuildDate><pubDate>Fri, 09 Apr 2010 22:57:07 GMT</pubDate><ttl>60</ttl><item><title>关于Windows中的键盘</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/10/112131.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 17:30:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/10/112131.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112131.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/10/112131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112131.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112131.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 键盘是计算机的标准配件之一，也是基本的程序输入装置。虽然目前大多数游戏程序以鼠标或者使游戏杆来作为主要的输入设备。相比之下，以键盘操纵游戏的方式似乎变得不太重要，但有时候还是会使用键盘来设计一些快速键的功能，例如跳过片头动画、结束游戏等<br><br><strong>1、虚拟键码</strong><br>&nbsp;&nbsp;&nbsp; 在早期非Windows系统的机器上，如果一般应用程序要取得使用者键盘的输入，就必须去取得输入按键的&#8220;扫描码（Scan code）&#8221;。扫描码由实际的键盘硬件所产生，但是由于不同国家不同区域所使用的键盘设备可能不同，因此Windows系统便发展了一套标准。其解决办法就是对所有键盘的按键定义出一组通用的&#8220;虚拟键码&#8221;，也就是说在Windows系统下所有的按键都会被视为虚拟键（包含鼠标键在内），而每一个虚拟键都有其对应的一个虚拟键码。<br><br>2、键盘消息<br>&nbsp;&nbsp;&nbsp; Windows系统是一个消息驱动的环境，一旦使用者在键盘上进入输入操作，那么系统便会接受到对应的键盘消息。下面是最常见的3中键盘消息：<br>&nbsp;&nbsp;&nbsp; WM_KEYDOWN：按下按键消息<br>&nbsp;&nbsp;&nbsp; WM_KEYUP：松开按键消息<br>&nbsp;&nbsp;&nbsp; WM_CHAR：字符消息<br>&nbsp;&nbsp;&nbsp; 当某一按键被按下时，伴随着这个操作所产生的是以虚拟键码类型传送的WM_KEYDOWN与WM_KEYUP消息。当程序接受到这些消息时，便可由虚拟键码的信息来得知是哪个按键被按下。<br>&nbsp;&nbsp;&nbsp; 此外，WM_CHAR则是当按下的按键为定义域ASCII中的打印字符时，便发出此字符消息。前面介绍的消息循环中的Translate()函数的作用便是当按下的按键为打印字符时，便将虚拟键码消息进行转换并且发出字符消息
<img src ="http://www.cppblog.com/kangnixi/aggbug/112131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-10 01:30 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/10/112131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>背景动画设计——多背景循环动画</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112093.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 10:16:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112093.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112093.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112093.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112093.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 多背景循环动画的背景循环原理其实与随笔&#8220;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html">背景动画设计——循环背景动画</a>&#8221;讲过的背景循环的原理相同。不过由于不同背景在远近层次上及实际视觉移动速度上并不相同，因此在以贴图的方法制作多背景循环动画时，需要决定不同背景贴图的先后顺便及滚动的速度。<br>&nbsp;&nbsp;&nbsp; 下图是本篇随笔多背景循环动画范例的运行结果，画面中出现了几种背景及恐龙跑动的前景图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第3章/6.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/19.JPG"></div>
<br>&nbsp;&nbsp;&nbsp; 观察上面的图，先要决定构成这幅画面的贴图顺序。从远近层次来看，天空是最远的，接着是草地和山峦，因为山峦叠在草地上，接下来是房屋，最后才是前景的恐龙，所以进行画面贴图时顺序应该是：<span style="COLOR: red">天空—&gt;草地—&gt;山峦—&gt;房屋—&gt;恐龙</span><br>&nbsp;&nbsp;&nbsp; 另外，进行山峦、房屋及恐龙的贴图操作时，还需要进行透明的操作，才能使得这些物体能叠在它们前一层的背景上。<br>&nbsp;&nbsp;&nbsp; 决定了贴图时的顺序之后，接着要来决定北京滚动时的速度。由于最远的背景是天空，所以当前景的恐龙跑动时，滚动速度应该是最慢的，而天空前的山峦滚动速度应该比天空要快一点，至于房屋与草地，因为连在一起，所以滚动速度相同，而且又会比山峦还要快一点，这样我们就决定出了所有背景的滚动速度为：<span style="COLOR: red">天空&lt;山峦&lt;草地=房屋</span><br>&nbsp;&nbsp;&nbsp; 前景的恐龙只让它在原地跑动，由于背景自动向右滚动，因此就会产生恐龙向前奔跑的视觉效果。<br><br><br>范例ch3_7：运用贴图技巧并调整不同背景循环滚动的速度，显示具有远近层次感的多背景循环动画。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_7.rar">ch3_7</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/21.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/112093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 18:16 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>背景动画设计——循环背景动画</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112089.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112089.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 循环背景是不断地进行背景图的裁切与结合，然后显示在窗口上所产生的一种背景画面循环滚动的效果。下面就介绍如何利用同一张跟窗口大小相同的背景天空图案来产生背景由左向右循环滚动的动画效果的。<br>&nbsp;&nbsp;&nbsp; 首先来介绍背景图由左向右的概念。假设下图所示的这张图是前一秒画面更新时所看到的画面（外围的方框代表窗口），当下一秒背景向右滚动时。<br><br><br>（阐述为完成）<br><br><br>范例ch3_6：使用定时器，将连续的任务图案显示在窗口上，产生动画效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_6.rar">ch3_6</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/18.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/112089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 17:40 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>背景动画设计——单一背景滚动</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112082.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112082.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112082.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112082.html</trackback:ping><description><![CDATA[<p align=left><br>&nbsp;&nbsp;&nbsp; 单一背景滚动的方法是：利用一张相当大的背景图，当游戏进行的时候，随着画面中人物的移动，背景的显示区域也跟着移动。要制作这样的背景滚动效果实际上很简单，只要在每次背景画面更新时改变要显示到窗口上的区域就可以了。<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第3章/12.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/12.jpg" width=680 height=492></div>
<br>&nbsp;&nbsp;&nbsp; 例如在上面的这张背景图里，由左上到右下画了3个方框，代表要显示在窗口上的背景区域，程序只要按照左上到右下的顺序在窗口上连续显示这3个方框区域，就会产生背景由左上往右下滚动的效果。<br><br><br><br>范例ch3_5：以键盘【&#8593;】、【&#8595;】、【&#8592;】、【&#8594;】键控制背景滚动显示。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_5.rar">ch3_5</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/13.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<p>&#160;</p>
<img src ="http://www.cppblog.com/kangnixi/aggbug/112082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 17:06 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动画显示问题——贴图坐标修正及排序贴图</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112075.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112075.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 动画最基本的要求是画面要流畅且符合真实性。然后由于是利用贴图的方法来产生动画的，因此常会因一些小细节没注意到而使得动画的效果看起来不太自然。在本篇随笔里就提出了两个这方面的小问题，在制作动画时若特别注意，可使得游戏动画看起来更加顺畅。<br><br>1、贴图坐标修正<br><br>2、排序贴图<br><br><br>范例ch3_4：产生多只恐龙随机跑动，每次进行画面贴图前先完成排序操作，并对恐龙跑动进行贴图坐标修正，呈现较为顺畅真实的动画。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_4.rar">ch3_4</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/11.jpg"><br><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 <br>
<img src ="http://www.cppblog.com/kangnixi/aggbug/112075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 16:20 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基础动画显示——透明动画</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112072.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112072.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112072.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112072.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112072.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; &#8220;透明动画&#8221;是游戏中一定会用到的基本技巧，它通过图案的连续显示及透明来产生背景图上的动画效果。前面已介绍游戏循环显示动画的技巧，也介绍了位图透明的方式，在本篇随笔中将用一个范例来说明透明动画的制作过程。<br>&nbsp;&nbsp;&nbsp; 这个范例使用了如下图所示的恐龙跑动连续图，每一张跑动图片的宽高位95&#215;99。<span style="COLOR: red">透明动画制作的前提是，必须在一个暂存的内存DC上完成每一张跑动图的透明然后再贴到窗口上，这样在画面更新时才不会出现透明贴图过程中产生的闪烁现象。<br></span>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第3章/4.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/4.jpg"></div>
<br><br>范例ch3_3：显示连续动态前景图案，并在显示之前进行透明，从而产生透明效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_3.rar">ch3_3</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/6.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/112072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 15:31 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基础动画显示——游戏循环</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112069.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 07:03:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112069.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112069.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112069.html</trackback:ping><description><![CDATA[<p><br>&nbsp;&nbsp;&nbsp; 定时器的使用固然很简单方便，但是事实上这样的方法仅适合用在显示简易动画及小型的游戏程序中。因而一般而言，游戏本身需要显示顺畅的游戏画面，使玩家感觉不到延迟的状况，基本上游戏画面必须在一秒钟之内更新至少25次以上，这一秒钟内程序还必须进行消息的处理和大量数学运算甚至音效的输出等操作。而使用定时器的消息来驱动这些操作，往往达不到所要求的标准，不然就会产生画面显示不顺畅和游戏响应时间太长的情况。<br><br>&nbsp;&nbsp;&nbsp; 这里提出一种&#8220;游戏循环&#8221;概念。游戏循环是将原先程序中的消息循环加以修改，方法时判断其中的内容是否有要处理的消息，如果有则进行处理，否则按照设定的时间间隔来重绘画面。下面所使用的游戏循环的程序代码：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;游戏循环<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;当收到的msg.message不是窗口结束消息WM_QUIT，则继续运行循环。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;其中msg是一个MSG的消息结构，其结构成员message则是一个消息类型的代号</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(&nbsp;msg.message</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">WM_QUIT&nbsp;)<br><img id=Codehighlighter1_136_921_Open_Image onclick="this.style.display='none'; Codehighlighter1_136_921_Open_Text.style.display='none'; Codehighlighter1_136_921_Closed_Image.style.display='inline'; Codehighlighter1_136_921_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_136_921_Closed_Image onclick="this.style.display='none'; Codehighlighter1_136_921_Closed_Text.style.display='none'; Codehighlighter1_136_921_Open_Image.style.display='inline'; Codehighlighter1_136_921_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_136_921_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_136_921_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使用PeekMessage()函数来检测目前是否有要处理的消息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;若检测到消息（包含WM_QUIT消息）则会返回一个非&#8220;0&#8221;的值，否则返回&#8220;0&#8221;。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;因此在游戏循环中，若检测到消息便进行消息的处理，否则运行else叙述之后的程序代码<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;注意：PeekMessage()函数不能用原先消息循环的条件GetMessage()取代<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;因为GetMessage()函数只有在取得WM_QUIT消息时才会返回&#8220;0&#8221;，其他时候则是返回非&#8220;0&#8221;或&#8220;-1&#8221;（发生错误时）</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;PeekMessage(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;,PM_REMOVE)&nbsp;)<br><img id=Codehighlighter1_450_535_Open_Image onclick="this.style.display='none'; Codehighlighter1_450_535_Open_Text.style.display='none'; Codehighlighter1_450_535_Closed_Image.style.display='inline'; Codehighlighter1_450_535_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_450_535_Closed_Image onclick="this.style.display='none'; Codehighlighter1_450_535_Closed_Text.style.display='none'; Codehighlighter1_450_535_Open_Image.style.display='inline'; Codehighlighter1_450_535_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_450_535_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_450_535_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_546_915_Open_Image onclick="this.style.display='none'; Codehighlighter1_546_915_Open_Text.style.display='none'; Codehighlighter1_546_915_Closed_Image.style.display='inline'; Codehighlighter1_546_915_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_546_915_Closed_Image onclick="this.style.display='none'; Codehighlighter1_546_915_Closed_Text.style.display='none'; Codehighlighter1_546_915_Open_Image.style.display='inline'; Codehighlighter1_546_915_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_546_915_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_546_915_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;GetTickCount()函数会取得系统开始运行到目前所经过的时间，单位是百万分之一秒<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;DWORD&nbsp;GetTickCount();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得系统开始到目前经过的时间<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;在这里取得时间的目的主要是可以搭配接下来的判断式，用来调整游戏运行的速度，<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使得游戏不会因为运行计算机速度的不同而跑的太快或太慢</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tNow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetTickCount();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&#8220;tPre&#8221;记录前次绘图的时间，而&#8220;tNow-tPre&#8221;则是计算上次绘图到这次循环运行之间<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;相差多少时间。这里设置为若相差100个单位时间以上则再次进行绘图的操作，通过这个<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;数值的控制可以调整游戏运行的快慢</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(tNow</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">tPre&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyPaint(hdc);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp; 如果把100改为40，即设定40个单位时间（1微妙），那样每隔40个单位进行一次绘图的操作，那么1秒钟大约重绘窗口1000/40=25此，刚好可以达到期望值。<br><br>&nbsp;&nbsp;&nbsp; 由于循环的运行速度远比定时器发出时间信号来得快，因此使用游戏循环的可以更精准地控制程序运行速度并提高每秒钟画面重绘的次数。<br><br><br>范例ch3_2：使用游戏循环产生动画效果，并在窗口左上角显示每秒画面更新次数。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_2.rar">ch3_2</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/3.jpg"><br><br>&nbsp;&nbsp;&nbsp; 在这个范例中设定画面更新的时间间隔是0.1秒，所以每秒钟最多会更新10次画面，不过如果在范例运行的同时，运行其他程序，那么CPU必须马上去处理所开启的其他程序，因此可能会使得每秒画面的更新次数下降。这样的情形在每秒画面更新次数越高的时候会越显著。<br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/112069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 15:03 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基础动画显示——定时器的使用</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112064.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112064.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112064.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112064.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 游戏中播放动画的方法有两种：一种是直接播放影片文件（如AVI和MPEG）文件，常用在游戏的片头与片尾；另一种则是游戏进行时利用连续贴图的方式，制作动画的效果。事实上游戏程序本省几乎都是以无限循环的方式不断地在游戏窗口进行窗口画面重绘的操作，即使画面没有任何变化，这个重绘的操作还是会不断地进行，一直到玩家选择结束游戏为止。<br>&nbsp;&nbsp;&nbsp; &#8220;基础动画显示&#8221;这一系列的随笔将介绍如何利用Windows本省的定时器及游戏中常用的游戏循环来制作游戏的动态小狗，并介绍最为常见的透明动画的制作方法。<br><br>&nbsp;&nbsp;&nbsp; 定时器（Timer）对象可以每隔一段时间发出一个时间消息，程序一旦接收到此消息之后，便可以决定接下来要做哪些事情。这样的一个特性刚好可以适合播放静态的连续图片，产生动画的效果。下面来介绍如何建立与使用定时器。<br><br><strong>1、建立定时器</strong><br><br>&nbsp;&nbsp;&nbsp; Windows API的SetTimer()函数可为窗口建立一个定时器，并且每隔一段时间就发出WM_TIMER消息，此函数的使用语法如下：
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">UINT&nbsp;SetTime(&nbsp;&nbsp;HWND&nbsp;接收定时器消息的窗口,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp;定时器代号,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;时间间隔,<br>&nbsp;<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMERPROC&nbsp;处理响应函数,);</span></div>
&nbsp;&nbsp;&nbsp; SetTimer()函数的第2个参数是定时器的代号，这个代号在同一个窗口中必须是唯一的，且值不为0；第3个参数则是定时器发出WM_TIMER消息的时间间隔，以千分之一秒为单位，也就是若此参数设为1000，则每间隔1秒发出一个WM_TIMER消息；第4个参数则用于设定由系统调用处理WM_TIMER消息的响应函数，如果不用响应函数处理WM_TIMER消息，则此参数应设为NULL。<br>&nbsp;&nbsp;&nbsp; 下面是设定一个每隔0.5秒发出WM_TIMER消息的定时器的程序代码。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">SetTimer(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">.NULL);</span></div>
&nbsp;&nbsp;&nbsp; <span style="COLOR: red">如果不使用相应函数来处理定时器的消息，那么就必须在消息处理函数中定义处理消息的程序代码。（？）</span><br><br><strong>2、删除定时器</strong><br><br>&nbsp;&nbsp;&nbsp; 定时器建立后，就会一直自动地按照设定的时间间隔发出WM_TIMER消息，如果要停用某个定时器，必须使用下面的这个函数。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;KillTimer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;定时器代号);</span></div>
&nbsp;&nbsp;&nbsp; 在大致了解了定时器的使用方法后，接下来将运用定时器使预先准备的几张人物连续摆动的位图，产生动画的效果，如下图所示：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/1.jpg" width=1212 height=252><br><br>范例ch3_1：使用定时器，将连续的任务图案显示在窗口上，产生动画效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch3/ch3%5E_1.rar">ch3_1</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第3章/2.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 <br><br><br><br><br><br>
<img src ="http://www.cppblog.com/kangnixi/aggbug/112064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 14:17 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——景物贴图</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112053.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 04:34:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112053.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112053.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112053.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112053.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 学会了游戏地图的拼接技巧，本篇随笔将要介绍如何在地图上布置一些景物，如花草树木和房子等。景物的点缀将使游戏地图更美观。<br>&nbsp;&nbsp;&nbsp; 其实一旦完成了地图的拼接，景物部分就容易多了。同样可使用一个与地图数组相同大小的数组来定义哪个图块位置上要出现哪些景物，但由于景物图的大小与图块的大小并不一定相同，因此还要再将景物贴图的坐标稍作修正，使得这些景物可以出现在正确的位置上。下面以在64&#215;32的斜角图块上贴上一张50&#215;60的树木图来做说明，如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/41.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/41.jpg"></div>
&nbsp;&nbsp;&nbsp; 从图中可以看出，若斜角图块的贴图坐标是（x，y），那么树木图的X坐标必须向右移动32-25=7个单位，Y坐标则必须向上移动60-16=44个单位，则树木图的贴图坐标为（x+7，x-44）。按照这样的方法，再对其他景物实际的贴图坐标进行修正，最后就可以得到所要的地图场景了。<br><br><br>范例ch2_11：在斜角地图中加入景物，展现游戏地图效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_11.rar">ch2_11</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br>&nbsp;<img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/42.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/112053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 12:34 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——斜角地图贴图</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112050.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 04:02:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112050.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112050.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112050.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112050.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 斜角地图其实是平面地图的一种变化，它是将拼接地图的图块内容，由原先的四方形图案改变成由45度角俯瞰四方形图案时的菱形图案，由这些菱形图案所拼接完成后的地图，就是一张由45度角俯瞰的斜角地图了。<br>&nbsp;&nbsp;&nbsp; 斜角地图拼接方法同样也是使用与平面地图一样的行与列的方法，事实上它们的原理是一样的。但是由于地图拼接时只要取位图中的菱形部分，因此在贴图坐标的计算会有所不同，下面就来说明菱形图块在贴图时的差异，如下图所示，其中的数字式图块的编号。<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/33.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/33.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 上图中的左边是四方形图块的拼接，而右边的则是菱形图块的拼接。四方形图块拼接方法时：图块编号换算成行编号与列编号再换算成贴图坐标。对于斜角地图拼接来说，这些步骤都是一样的，但是在换算贴图坐标时，由于只要显示图块中的菱形部分，因此在贴图排列的方式上会有不同，因而贴图坐标的计算公式也就不一样了。<br>&nbsp;&nbsp;&nbsp; 此外，在合并两个图块的菱形部分时，<span style="COLOR: red">还需要加上一步透明的步骤</span>，不然若直接按照求得的贴图坐标来进行贴图，其效果就会如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/34.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/34.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 接下来看看斜角地图拼接时，各个图块编号与实际排列的情形，如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/35.JPG"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/35.JPG"></div>
<br>&nbsp;&nbsp;&nbsp; 上图同样是一张4&#215;3个小图块所拼接而成的地图，其中的数字式图块编号。对于每一图块首先必须算出它的行编号与列编号，然后才能计算它实际的贴图坐标，计算行列编号的方法与随笔&#8220;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html">游戏地图制作——平面地图贴图</a>&#8221;所使用的公式一样，即：
<p align=center><span style="COLOR: red">列编号 = 索引值 / 每一列的图块个数（行数）；<br>行编号 = 索引值 % 每一列的图块个数（行数）；</span></p>
&nbsp;&nbsp;&nbsp; 求出行编号与列编号后，就可以计算出图块贴图时左上点的坐标，除此之外，还需要知道图块中菱形部分的长度与高度，这里假设图块中菱形的宽与高分别是w和h，如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/36.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/36.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 那么图块左上点贴图坐标的计算公式如下：
<p align=center><span style="COLOR: red">左上点X坐标&nbsp;=&nbsp;xstart + 行编号 &#215;（w/2） - 列编号&#215;（w/2）；<br><span style="COLOR: red">左上点Y坐标&nbsp;=&nbsp;ystart + 列编号 &#215;（h/2 ）- 行编号&#215;（h/2）；</span></span></p>
<br>&nbsp;&nbsp;&nbsp; 公式中的xstart与ystart是代表第一张图块左上角贴图坐标的位置，以下图来说明这个公式：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/37.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/37.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 图中以红线框来表示图块真正的矩形范围，在进行贴图时，首先要定义第1张图块的贴图位置，其他图块的贴图坐标再由此图块向下延伸。现在假设给定图块0的贴图坐标是（xstart，ystart），那么接下来考虑图块1的矩形范围，它左上角贴图的坐标则是（xstart+w/2,ystart+h/2），考虑图块2的矩形范围，它左上角贴图的坐标又变成（xstart+w/2&#215;2,ystart+h/2&#215;2）。依次类推，再加入行编号与列编号，可以得到下面的这个求图块贴图坐标的公式：
<p align=center><span style="COLOR: red">左上点X坐标&nbsp;=&nbsp;xstart + 行编号 &#215;（w/2）；<br><span style="COLOR: red">左上点Y坐标&nbsp;=&nbsp;ystart + 列编号 &#215;（h/2 ）；</span></span></p>
<br>&nbsp;&nbsp;&nbsp; 但是要注意一点，这是当图块都在属于同一列的情况。考虑下一列的图块4，图块4的左上角贴图坐标是（xstart-w/2,ystart+h/2），而图块5的左上角贴图坐标是（xstart-w/2+w/2,ystart+h/2+h/2），图块6的左上角贴图坐标为（xstart-w/2+w/2&#215;2,ystart+h/2+h/2&#215;2），依次类推，可看出同一列上坐标变化规律都是一样的，贴图坐标都是往右下方递增半个图块的长于高单位。<br>&nbsp;&nbsp;&nbsp; 如果是在同一行（图块0、4、8）上的坐标变化则是往左下方递减半个图块的长（X轴方向）以及递增半个图块的高（Y轴方向），因此利用图块的行编号与列编号便得出了前面的贴图坐标公式。<br>&nbsp;&nbsp;&nbsp; 计算出每个图块的坐标并完成了斜角地图的拼接后，此时要将整块地图贴到窗口中，还需要知道地图的宽度与高度，计算的方法可以通过下图进行说明：<br>&nbsp;&nbsp;&nbsp;
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/38.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/38.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 由上面可以很容易的推导出整张地图的宽与高计算公式如下：
<p align=center><span style="COLOR: red">地图宽&nbsp;=&nbsp;（列数+行数）&#215;（w/2）；<br><span style="COLOR: red">地图高&nbsp;=&nbsp;（列数+行数）&#215;（h/2 ）；</span></span></p>
<br>&nbsp;&nbsp;&nbsp; 在了解了关于斜角地图拼接的方法之后，接下来的这个范例将上一小节里的平面拼接地图转换成以45度角俯视的斜角地图。<br><br>范例ch2_10：从文件中加载位图，并显示在窗口上。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_10.rar">ch2_10</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/40.jpg">&nbsp;<br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/112050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 12:02 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——平面地图贴图</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 01:26:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/112037.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/112037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/112037.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>&nbsp;&nbsp;&nbsp; 游戏地图的画面是游戏中不可缺少的重要环节之一，要产生游戏地图，除了可以直接使用已经绘制好的地图外，对于一些画面不太复杂，且具有重复性质的地图或场景，有一个比较好的解决办法，那就是利用地图拼接的方法，将一小块一小块的小地图组合成较大的地图。<br>&nbsp;&nbsp;&nbsp; 地图拼接的优点在于节省系统资源，因为一张大型的地图会占用比较多的内存空间，且加载速度较慢，如果游戏中使用了为数较多的大型地图，那么势必会降低程序运行时的性能，而且需要相当可观的内存空间。</span></p>
&nbsp;&nbsp;&nbsp; 本篇随笔从最基本的平面地图贴图开始讲起，这种贴图方法相当直观，即利用一张张四方形的小图块组成同样是四方形的大地图。下图便是一张由3种不同图块组合而成的平面地图。<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/30.JPG"><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/31.JPG" width=286 height=216></div>
&nbsp;&nbsp;&nbsp; 事实上，这张地图是由4&#215;3张小图块组成的，列方向是4张图块，行方向是3张图块，这里使用列与行这样的字眼，是因为随后将使用数组来定义地图中出现图块的内容。<br>&nbsp;&nbsp;&nbsp; 从这张图中可以看到，一共出现了3中不一样的地图，这是因为程序中会事先以数组定义哪个位置上要出现哪一种地图，使得拼接出来的地图能够符合需求。现在假设图中3种不同图块的编号分别为0、1和2，那么可以以下面的这个一维数组来定义出上图中的地图。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_17_57_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_57_Open_Text.style.display='none'; Codehighlighter1_17_57_Closed_Image.style.display='inline'; Codehighlighter1_17_57_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_17_57_Closed_Image onclick="this.style.display='none'; Codehighlighter1_17_57_Closed_Text.style.display='none'; Codehighlighter1_17_57_Open_Image.style.display='inline'; Codehighlighter1_17_57_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mapblock[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_17_57_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_17_57_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">第1列</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">第2列</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">第3列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为什么用一维数组而不是二维数组呢？</span></div>
<p align=left><br>&nbsp;&nbsp;&nbsp; 将这个一维数组以行列的方式排列，可以看出每个数组元素对应图中的哪个图块。<br>&nbsp;&nbsp;&nbsp; 需要提醒的是，由于使用的是一位数组来定义地图内容，因此上面这个数组的每个元素的索引值是0&#8230;&#8230;11.但是，由于程序里不论计算图块贴图的位置还是计算整张地图的长宽尺寸，都是以行列来进行换算的，所以需要将数组的索引值转换成相应的列编号与行编号，转换公式如下：<br></p>
<p align=center><span style="COLOR: red">列编号 = 索引值 / 每一列的图块个数（行数）；<br>行编号 = 索引值 % 每一列的图块个数（行数）；</span></p>
<p>&nbsp;&nbsp;&nbsp; 下图验证上面的公式，方格中的编号是一维数组的元素索引值。<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/23.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/23.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 这里需要注意的是，列编号与行编号的起始值都是从0开始算起，而一旦算出了列编号与行编号之后，便可以按照图块的宽与高来求出图块贴图的位置，下面是计算图块左上点贴图坐标的公式。
<p>&nbsp;</p>
<p align=center>左上点X坐标 = 行编号 &#215; 图块的宽度；<br>左上点Y坐标 = 列编号 &#215; 图块的高度；<br><br></p>
<p>范例ch2_9：运用不同小图块，示范平面地图拼接的技巧。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_9.rar">ch2_9</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/32.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/32.jpg"></div>
<p>&nbsp;<br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。</p>
<img src ="http://www.cppblog.com/kangnixi/aggbug/112037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 09:26 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏画面特效制作——透明半透明效果</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111995.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111995.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111995.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111995.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111995.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 在&#8220;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html">游戏画面特效制作——半透明效果</a>&#8221;的随笔的代码中做出了美观的半透明效果，可是在运行的画面中，似乎可看到前景图四周还留着原来位图的矩形轮廓，感觉有点美中不足。不过没关系，在本篇随笔中将介绍如何制作更完美的透明半透明效果。<br>&nbsp;&nbsp;&nbsp; 制作透明半透明效果还是要运用前面所讲的透明及半透明技巧，就是先进行透明处理再进行半透明处理。除此之外，还记得是怎么做透明的吗？是利用贴图函数直接与已经贴在窗口中背景图进行两个必要的Raster运算完成的。可是，如果这样做的话，那结果的透明图已经在窗口上产生了，又要怎么做半透明处理？<br>&nbsp;&nbsp;&nbsp; 在这里多使用了一个内存DC与位图对象，先在内存DC上完成透明，再取出这个DC伤的位图内容来进行半透明处理，这样就可以达到目的了。下面直接以一个范例来示范这种做法。这个范例中需要下面的位图，用来制作前景图的透明：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/26.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/26.jpg"></div>
<br><br>范例ch2_8：这个范例说明介绍如何产生透明半透明的效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_8.rar">ch2_8</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/29.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/29.jpg"></div>
<br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/111995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 19:53 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏画面特效制作——半透明效果</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 11:12:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111992.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111992.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 半透明在游戏中通常用来呈现若隐若现的特殊效果。事实上这种效果的运用相当频繁，比如薄雾、鬼魂或隐形任务等，有时会以半透明的手法来表现。本篇随笔就来介绍半透明效果的制作方法，下图23是一张位图经过半透明处理后显示在背景上的效果。<br><br><strong>1、半透明的制作原理</strong><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 简单地说，半透明效果就是前景图案与背景图案像素颜色的混合。从图23中观察半透明效果呈现的区域，可以看到背景图案，也可看到前景的人物图案。什么是前景图案与背景图案像素颜色的混合呢？这就要从位图的基本结构开始谈起了。<br>&nbsp;&nbsp;&nbsp; 一张位图是由许多的像素所组成的，每一个像素中都包含红（R）、绿（G）、蓝（B）三原色的色彩值，由这三种原色值来决定该像素的色彩。而要呈现半透明效果，必须将前景图与背景图彼此对应像素的颜色依某一比例来进行调配，这个比例就叫做&#8220;不透明度&#8221;。<br>&nbsp;&nbsp;&nbsp; 以没有进行半透明处理，单纯地将一张前景图贴到背景图上的一块区域来说，前景图的不透明度是100%，而背景图在这一块区域上的不透明度则是0%（完全透明，所以看不见背景），也就是说在这块区域上，背景图的色彩完全派不上用场。<br>&nbsp;&nbsp;&nbsp; 可是如果想要有半透明的效果，让前景图看起来稍微透明一点，那就需要确定不透明度的值。假设确定不透明度是70%，也就是说前景图像素颜色按照一定的不透明度比例进行合成，那么最后整个区域所呈现出来的就是所要的半透明效果了。综合上面的说明，可以整理出一个建档的公式如下：<br>&nbsp;&nbsp;&nbsp; <span style="COLOR: red">半透明图色彩 = 前景图色彩 &#215; 不透明度 + 背景图色彩 &#215;（1 - 不透明度）</span><br><br><strong>2、半透明的操作步骤</strong><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 清楚了半透明制作的原理后，接下来说明程序产生半透明效果的实际步骤。<br>&nbsp;&nbsp;&nbsp; <strong>步骤一：取得位图结构<br></strong>&nbsp;&nbsp;&nbsp; 位图结构包含了一些位图的基本信息，由于我们在制作半透明效果时会用到，因此在从文件加载位图后，必须先取得该位图的结构，而取的位图结构的函数如下：
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetObject(&nbsp;&nbsp; HGDIOBJ&nbsp;GDI对象,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得GDI对象结构</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;结构大小,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID&nbsp;结构变量,);</span></div>
&nbsp;&nbsp;&nbsp; 上面这个函数用于取得GDI对象的信息，包含这里所谈的位图，其中第3个参数是一个结构变量，如果是用于取得位图的信息，则输入一个位图结构的地址，而Windows API所定义的位图结构（BITMAP）如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_24_209_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_209_Open_Text.style.display='none'; Codehighlighter1_24_209_Closed_Image.style.display='inline'; Codehighlighter1_24_209_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_24_209_Closed_Image onclick="this.style.display='none'; Codehighlighter1_24_209_Closed_Text.style.display='none'; Codehighlighter1_24_209_Open_Image.style.display='inline'; Codehighlighter1_24_209_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">typedef&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tagBITMAP</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_24_209_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_24_209_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;bmType;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;位图类型，必须设为0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">LONG&nbsp;bmWidth;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;位图宽度</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">LONG&nbsp;bmHeight;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">位图长度</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">LONG&nbsp;bmWidthBytes;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">每一列像素所占Byte数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">WORD&nbsp;bmPlanes;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">颜色平面数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">WORD&nbsp;bmBitsPixel;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">像素的位数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">LPVOID&nbsp;bmBits;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">位图内存指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">BITMAP;</span></div>
&nbsp;&nbsp;&nbsp; 后面将会用到bmWidth、bmHeight、bmWidthBytes及bmBitsPixel这几个结构成员的信息。<br>&nbsp;&nbsp;&nbsp; 在此举个例子来说明取得位图结构的方法，假设现在有一个位图名称为&#8220;bitmap&#8221;，位图结构变量名称为&#8220;bm&#8221;，则使用GetObject()函数取得BITMAP结构的程序代码如下：
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">GetObject(bitmap,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(BITMAP),</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bm);</span></div>
&nbsp;&nbsp;&nbsp; 这样，位图结构bm中的各个结构成员便包含了位图bitmap的基本信息。<br>&nbsp;&nbsp;&nbsp; <strong>步骤二：建立暂存数组</strong><br>&nbsp;&nbsp;&nbsp; 取得位图的结构，接下来必须先建立一个暂存数组准备存储位图中所有像素的颜色值。这个暂存数组的大小是由前一个步骤中所取得位图的bmHeight与bmWidthBytes信息来决定的，因此，必须利用指针来动态建立。延续前一个例子，若要建立一个可存储bitmap所有像素颜色值的暂存数组，程序代码如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">px&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;[bm.bmHeight&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bm.bmWidthBytes];</span></div>
&nbsp;&nbsp;&nbsp; 这里，因为unsigned char变量类型大小是1Byte，所以这个数组的每个元素大小也就是1Byte（8bits）。以一张24bits色彩的位图来说，它的每个像素是以24bits来表示颜色的，其中B（蓝）、G（绿）、R（红）三原色各占8个bits。<br>&nbsp;&nbsp;&nbsp; 因此，在下面的步骤中，当取出位图的所有颜色并存储在这个数组中时，每一个像素会占用3个数组元素来存储B、G、R的颜色值。<br>&nbsp;&nbsp;&nbsp; <strong>步骤三：取得位图位置</strong><br>&nbsp;&nbsp;&nbsp; 建立了暂存数组之后，要取出位图的所有颜色值存储到数组中就简单多了，有一个现成的API函数可以使用。
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">LONG&nbsp;GetBitmapBits(&nbsp;&nbsp;HBITMAP&nbsp;位图,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得位图位值</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">LONG&nbsp;要取得的Byte数,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID&nbsp;存储的数组指针);</span></div>
&nbsp;&nbsp;&nbsp; 使用此函数取得位图位值的程序代码如下。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">GetBitmapBits(bitmap, bm.bmHeight&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bm.bmWidthBytes, px);</span></div>
&nbsp;&nbsp;&nbsp; 下面以图来说明像素颜色值存储在数组中的对应关系，如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/24.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/24.jpg"></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong>步骤四：合成像素颜色值<br></strong>&nbsp;&nbsp;&nbsp; 取得了位图的所有像素颜色值之后，接下来的工作就是按照不透明度来设定半透明区域内每个像素的颜色了。<br>&nbsp;&nbsp;&nbsp; 此时应该会有两个像素颜色数组，一个是前景图的，一个则是背景图的。根据实际要显示半透明区域的坐标，将这两个数组算出对应的元素进行签名讲过的颜色合成运算，再存回暂存数组中，anemia数组中所存储的便是已经完成半透明的颜色值了。这个步骤的实际处理过程，将在代码中做详细说明。<br>&nbsp;&nbsp;&nbsp; <strong>步骤五：重设位图颜色</strong><br>&nbsp;&nbsp;&nbsp; 处理完暂存数组中半透明的颜色值之后，最后一个操作就是根据数组的内容来重设位图的颜色。这个操作同样可以使用一个API的函数来完成。
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">LONG&nbsp;SetBitmapBits( &nbsp; &nbsp;&nbsp;HBITMAP&nbsp;位图,&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设定位图位值</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">DWORD&nbsp;颜色数组大小,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONST&nbsp;VOID&nbsp;数组指针&nbsp;);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">为什么是CONST&nbsp;VOID?</span></div>
<br>&nbsp;&nbsp;&nbsp; 以上5个步骤都完成之后，所要的半透明图也就完成了，剩下的就只有贴图操作了。<br><br><br>范例ch2_7：取得前景图与背景图的颜色值，以前景图的不透明度30%和背景图的不透明度70%进行半透明处理，制作半透明效果。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_7.rar">ch2_7</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/25.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/25.jpg"></div>
<br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/111992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 19:12 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏画面特效制作——透明效果</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111977.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111977.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111977.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111977.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111977.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 由于所有的图文件都是以一个四方矩形来存储的，但有时我们可能会需要把一张怪物图片贴到窗口的背景图上，而在这种情况下如果我们直接进行贴图，其结果如下图所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/17.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/17.jpg"></div>
&nbsp;<span><span>&nbsp;&nbsp;&nbsp;这似乎不是所要的结果。在本篇随笔中将要讨论</span></span><span>透明效果，就是要利用</span><span>BitBlt()</span><span>贴图函数以及</span><span>Raster</span><span>值的运算来将图片中不必要的部分去掉（又称去背），使得图中的主体可以与背景图完全融合。<br>&nbsp;&nbsp;&nbsp; 制作透明效果有多种方法，但基本上都是利用贴图时不同的</span><span>Raster</span><span>运算，通过转换而最后产生相同的透明效果。<br>&nbsp;&nbsp;&nbsp; 以下面的恐龙图为例子，首先必须准备一张位图，它的色彩分配如下所示<br>
<p>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/18.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/18.jpg"></div>
&nbsp;&nbsp;&nbsp; 图中左边的图是要去背并贴在背景图上的前景图，右边的黑白图称为&#8220;屏蔽图&#8221;，在透明的过程中会用到它。把要去背的位图与屏蔽图合并成同一张图，透明的时候再按照需要来进行裁切。可以把它分成两张图，但这样程序必须运行两次图文件加载的操作。<br>&nbsp;&nbsp;&nbsp; 有了屏蔽图就可以利用贴图函数来产生透明效果了，所需进行的贴图步骤如下：<br>&nbsp;&nbsp;&nbsp; （1）将屏蔽图与背景图做&#8220;AND&#8221;（Raster的SRCAND）运算，贴到目的地DC中。<br>&nbsp;&nbsp;&nbsp; （2）将前景图与背景图做&#8220;OR&#8221;（Raster的SRCPAINT）运算，贴到目的地DC中。<br>&nbsp;&nbsp;&nbsp; 为什么经过上面的两个步骤就能产生透明的效果呢？可以参看下图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/19.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/19.jpg"></div>
</span>
<p>&nbsp;</p>
&nbsp;&nbsp;&nbsp; 接下来说明上述两个步骤所产生的图点色彩的变化。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1、屏蔽图与背景图做&#8220;AND&#8221;运算<br>&nbsp;&nbsp;&nbsp; （1）屏蔽图中的黑色部分与背景图做&#8220;AND&#8221;运算<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/AND1.jpg"><br>&nbsp;&nbsp;&nbsp; （2）屏蔽图中的白色部分与背景图做&#8220;AND&#8221;运算<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/AND2.jpg"><br>&nbsp;&nbsp;&nbsp; 经过这一运算所产生的结果如图20所示：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/20.jpg"><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/20.jpg"></div>
<br>&nbsp;&nbsp;&nbsp; 2、前景图与背景图做&#8220;OR&#8221;运算<br>&nbsp;&nbsp;&nbsp; （1）前景图中的彩色部分与图20做&#8220;OR&#8221;运算<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/or1.jpg"><br>&nbsp;&nbsp;&nbsp; （2）前景图中的黑色部分与图20做&#8220;OR&#8221;运算<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/or2.jpg"><br>&nbsp;&nbsp;&nbsp; 经过这一运算后所显示的画面就是所需的透明图了，图下图所示<br><br>范例ch2_6：透明效果的显示。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_6.rar">ch2_6</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br>
<div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏编程第2章图片/22.jpg"><br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/22.jpg"><br></div>
<br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。 
<img src ="http://www.cppblog.com/kangnixi/aggbug/111977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 16:52 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>绘制位图</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111965.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111965.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111965.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111965.html</trackback:ping><description><![CDATA[<p><span><br>&nbsp;&nbsp;&nbsp; 绘图是属于</span><span>GDI</span><span>的对象之一，在一套游戏开发过程中，常常需要运用大量的位图来构建游戏的所有画面。<br>&nbsp;&nbsp;&nbsp; 以游戏程序来说，由于使用的位图数量相当多，因此都会先将位图存成文件，等到程序需要时再将文件加载到窗口中。<br>&nbsp;&nbsp;&nbsp; 将位图从文件中加载到绘制窗口中必须经过以下几个步骤：<br>&nbsp;&nbsp;&nbsp; ①从文件中加载位图（</span><span>BITMAP</span><span>）对象。<br>&nbsp;&nbsp;&nbsp; ②建立一个与窗口</span><span>DC</span><span>兼容的内存</span><span>DC</span><span>。<br>&nbsp;&nbsp;&nbsp; ③内存</span><span>DC</span><span>使用步骤</span><span>1</span><span>所建立的位图对象。<br>&nbsp;&nbsp;&nbsp; ④将</span><span>内存</span><span>DC</span><span>的内容粘帖到窗口</span><span>DC</span><span>中，完成显像的操作。</span></p>
<br>&nbsp;&nbsp;&nbsp; 以上是大致的流程，接下来一步步地说明如何完成这些操作
<p><strong><span>步骤一：加载位图</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; 要从文件加载位图，常使用</span><span>LoadImage()</span><span>函数<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HANDLE&nbsp;LoadImage(&nbsp;&nbsp; HINSTANCE&nbsp;来源实体,&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">加载位图</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">LPCTSTR&nbsp;名称,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">UINT&nbsp;位图类型,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;加载宽度,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;加载高度,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp;加载方式,);</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp; 详细说明如下：</span>&nbsp;
<table border=1 cellSpacing=0 cellPadding=0 width=732>
    <tbody>
        <tr>
            <td vAlign=top width=86>
            <p>参数</p>
            </td>
            <td vAlign=top width=646>
            <p><span>说明</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>HINSTANCE</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>包含位图所在的实体，若要加载的位图存在于硬盘或者资源文件中，则将此项参数设为<span>&#8221;NULL&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>LPCTSTR</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>要加载位图所在的路径与文件名或者资源名称</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>UINT</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>加载位图的类型，有下列<span>3</span>种：</span></p>
            <p align=left><span>◆IMAGE_BITMAP</span><span>：加载的位图为一般图文件，扩展名为<span>&#8220;.bmp&#8221;</span></span></p>
            <p align=left><span>◆IMAGE_CURSOR</span><span>：加载的位图为光标图标，扩展名为<span>&#8220;.cur&#8221;</span></span></p>
            <p align=left><span>◆IMAGE_ICON</span><span>：加载的位图为图标，扩展名为<span>&#8220;.ico&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>int</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>位图加载的宽度，单位为像素</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>int</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>位图加载的高度，单位为像素</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=86>
            <p align=left><span>UINT</span></p>
            </td>
            <td vAlign=top width=646>
            <p align=left><span>设定位图的加载方式，若是从文件中加载位图，则设为<span>&#8220;LR_LOADFROMFILE</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong><span>步骤二：建立与窗口</span><span>DC</span></strong><strong><span>兼容的内存</span><span>DC</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; 内存</span><span>DC</span><span>并不是真正的设备的</span><span>DC</span><span>，在这里把它揭示为一个缓冲区或许会更恰当些。内存</span><span>DC</span><span>用来暂存加载的位图，由于最终会把存储在这个内存</span><span>DC</span><span>上的位图贴到真正的窗口的</span><span>DC</span><span>上，因此这个内存</span><span>DC</span><span>必须跟窗口</span><span>DC</span><span>的性质兼容。可调用</span><span>CreateCompatibleDC()</span><span>函数来建立内存</span><span>DC</span><span>。</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HDC&nbsp;CreateCompatibleDC(HDC&nbsp;hdc);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;建立兼容DC</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp; 函数中输入的唯一参数就是要与内存</span><span>DC</span><span>兼容的目的</span><span>DC</span><span>。</span><span>跟窗口</span><span>DC</span><span>一样，内存</span><span>DC</span><span>使用后也必须进行释放的操作，释放内存</span><span>DC</span><span>所调用的函数为</span><span>DeleteDC()</span><span>。</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DeleteDC(HDC&nbsp;DC名称);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放DC</span></div>
<p></span><strong><span>步骤三：选用位图对象</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; 位图对象是</span><span>GDI</span><span>的</span><span>6</span><span>种对象之一，内存</span><span>DC</span><span>选用位图对象的方法和前面介绍的选用画笔或画刷的方式相同，都是通过调用</span><span>SelectObject()</span><span>函数来实现。</span></p>
<p><strong><span>步骤四：贴图</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; 把内存</span><span>DC</span><span>中的位图复制到显示的</span><span>DC</span><span>上，这个操作被称为&#8220;贴图&#8221;。函数是</span><span>BitBlt()</span><span>：</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;BitBlt (&nbsp; &nbsp;HDC&nbsp;目的DC,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;目的DC&nbsp;X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;目的DC&nbsp;Y坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;贴到目的DC的宽度,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;贴到目的DC的高度,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HDC&nbsp;来源DC,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;来源DC&nbsp;X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;来源DC&nbsp;Y坐标,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp; DWORD&nbsp;贴图方式)</span></div>
<p></span>&nbsp;&nbsp;&nbsp; <span>BitBlt()</span><span>函数最后一个参数所输入的是称为&#8220;</span><span>Raster</span><span>&#8221;的运算值，这个值是用来设定内存</span><span>DC</span><span>到目的</span><span>DC</span><span>的贴图方式。范例中输入的</span><span>Raster</span><span>值是</span><span>SRCCOPY</span><span>，表示贴图后的位图与原来的位图完全一样，下表列出了可使用的</span><span>Raster</span><span>值及说明。</span></p>
<p>
<table border=1 cellSpacing=0 cellPadding=0 width=732>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p><span>Raster</span><span>值</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>说明</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>BLACKNESS</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图转换为黑色</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>DSTINVERT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将目的地</span><span>DC</span><span>做&#8220;</span><span>NOT</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>MERGECOPY</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将选择的笔刷与来源位图做&#8220;</span><span>AND</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>MERGEPAINT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>先将来源位图做&#8220;</span><span>NOT</span><span>&#8221;运算，再与目的地</span><span>DC</span><span>做&#8220;</span><span>OR</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>NOTSRCCOPY</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图做&#8220;</span><span>NOT</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>NOTSRCERASE</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>先将来源位图与目的地</span><span>DC</span><span>做&#8220;</span><span>OR</span><span>&#8221;运算，再将其做&#8220;</span><span>NOT</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>PATCOPY</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将选择的笔刷贴到目的地</span><span>DC</span><span>上</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>PATINVERT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将目的地</span><span>DC</span><span>与选择的笔刷做&#8220;</span><span>XOR</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>PATPAINT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>先将来源位图做&#8220;</span><span>NOT</span><span>&#8221;运算，再与笔刷做&#8220;</span><span>OR</span><span>&#8221;运算，最后再与目的地</span><span>DC</span><span>做&#8220;</span><span>OR</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>SRCAND</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图与目的地</span><span>DC</span><span>做&#8220;</span><span>AND</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>SRCCOPY</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图贴到目的地</span><span>DC</span><span>上</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>SRCERASE</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>先将目的地</span><span>DC</span><span>做&#8220;</span><span>NOT</span><span>&#8221;运算，再与来源位图做&#8220;</span><span>AND</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>SRCINVERT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图与目的地</span><span>DC</span><span>做&#8220;</span><span>XOR</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>SRCPAINT</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图与目的地</span><span>DC</span><span>做&#8220;</span><span>OR</span><span>&#8221;运算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p><span>WHITENESS</span></p>
            </td>
            <td vAlign=top width=612>
            <p><span>将来源位图转换为白色</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>范例ch2_5：从文件中加载位图，并显示在窗口上。<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_5.rar">ch2_5</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>程序运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/16.jpg"><br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。</p>
<img src ="http://www.cppblog.com/kangnixi/aggbug/111965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 15:28 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDI绘图函数</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 06:37:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111959.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111959.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在该随笔中将介绍一些GDI的绘图函数，以加深您对于程序绘图的认识。<br><br><strong>1、文字输出</strong><br>&nbsp;&nbsp;&nbsp;&nbsp; 窗口画面上的文字输出比后面所要介绍的几个绘图函数还要重要，因为在程序设计时，可能有时需要在画面上显示一些数据和信息，以利于程序本身的追踪与排错。<br><br>范例ch2_2：根据鼠标的移动，将光标所在位置的坐标值显示在窗口中。<br>下载：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2%5E_2.rar">ch2_2</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/7.jpg"><br><br><strong>2、多边形函数</strong><br>&nbsp;&nbsp;&nbsp; 下表中给出了GDI函数中关于多边形的绘图函数：&nbsp;
<table border=1 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td vAlign=top width=103>
            <p><span>函数名称</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>说明</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>Polygon</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>绘制封闭多边形</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>PolyLine</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>绘制多边线条</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>PolylineTo</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>以当前画笔所在位置绘制多边线条</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>PolyPolygon</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>绘制多个封闭多边形</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>PolyPolyline</span></p>
            </td>
            <td vAlign=top width=324>
            <p><span>绘制多个多边线条</span></p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp; 以上几个函数的使用方法大同小异，以Polygon()函数来做说明。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;Polygon(HDC&nbsp;hdc,&nbsp;CONST&nbsp;POINT&nbsp;点数组指针,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;多边形点数);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">绘制多边形</span></div>
&nbsp;&nbsp;&nbsp; 第2个参数输入的是一个POINT结构的数组指针，POINT可用于描述一个坐标点，其结构如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_23_131_Open_Image onclick="this.style.display='none'; Codehighlighter1_23_131_Open_Text.style.display='none'; Codehighlighter1_23_131_Closed_Image.style.display='inline'; Codehighlighter1_23_131_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_23_131_Closed_Image onclick="this.style.display='none'; Codehighlighter1_23_131_Closed_Text.style.display='none'; Codehighlighter1_23_131_Open_Image.style.display='inline'; Codehighlighter1_23_131_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">typedef&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tagPOINT</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_23_131_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_23_131_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;x;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;X坐标</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;y;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Y坐标</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;POINT;</span></div>
<br>范例ch2_3：展示多边形绘制函数的用法，并在窗口中绘制多边形。<br>下载：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2%5E_2.rar">ch2_3</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>运行结果如下图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/8.jpg" width=600 height=450><br><br>3、封闭图形函数<br>&nbsp;&nbsp;&nbsp; 下边再来讨论一下封闭几何图形的绘制方法，&#8220;<a id=viewpost1_TitleUrl href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html"><font color=#000000>画笔与画刷</font></a>&#8221;随笔中介绍了画矩形的Rectangle()函数，现在再来看看画椭圆形的GDI函数。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_12_113_Open_Image onclick="this.style.display='none'; Codehighlighter1_12_113_Open_Text.style.display='none'; Codehighlighter1_12_113_Closed_Image.style.display='inline'; Codehighlighter1_12_113_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_12_113_Closed_Image onclick="this.style.display='none'; Codehighlighter1_12_113_Closed_Text.style.display='none'; Codehighlighter1_12_113_Open_Image.style.display='inline'; Codehighlighter1_12_113_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">BOOL&nbsp;Ellipse</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_12_113_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_12_113_Open_Text><span style="COLOR: #000000">( HDC&nbsp;hdc,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">绘制椭圆形</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点Y坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点Y坐标);</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp; 上面的函数说明确定一个外围矩形就可以产生椭圆形。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面再来看看绘制圆角矩形的函数。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_14_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_14_75_Open_Text.style.display='none'; Codehighlighter1_14_75_Closed_Image.style.display='inline'; Codehighlighter1_14_75_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_14_75_Closed_Image onclick="this.style.display='none'; Codehighlighter1_14_75_Closed_Text.style.display='none'; Codehighlighter1_14_75_Open_Image.style.display='inline'; Codehighlighter1_14_75_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">BOOL&nbsp;RoundRect</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_14_75_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_14_75_Open_Text><span style="COLOR: #000000">( HDC&nbsp;hdc,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">绘制圆角矩形&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点Y坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点Y坐标</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;圆角上椭圆长,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;圆角上椭圆高)</span></span><span style="COLOR: #000000">;</span></div>
&nbsp;&nbsp;&nbsp; 在这个函数中，除了给定外围矩形的坐标外，还给定了圆角上椭圆的长与高，用来表示圆角的弧度。<br><br>&nbsp;&nbsp;&nbsp; 最后来说明绘制扇形（Pie）与弓形（Chord）函数，扇形与弓形都是椭圆的一部分。<br>&nbsp;&nbsp;&nbsp; 扇形与弓形都有连接的起点与终点，不同之处在于，扇形还会与椭圆的中心点相连接，而弓形则直接连接起点与终点。绘制扇形的函数为Pie()，绘制弓形的函数则为Chord()，两者输入的参数意义都相同，下面以Pie()函数为例来进行说明。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;Pie (&nbsp; HDC&nbsp;hdc,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">绘制扇形</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形左上点Y坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点X坐标,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;外围矩形右下点Y坐标,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;起点X坐标,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;起点Y坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;终点X坐标,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;终点Y坐标);</span></div>
<br>范例ch2_4：显示封闭图形绘制函数的用法，并在窗口中绘制不同图形。<br>下载：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2/ch2%5E_4.rar">ch2_4</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br>运行结果如下图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/13.jpg" width=600 height=450>&nbsp;<br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/111959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 14:37 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>画笔与画刷</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111951.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111951.html</trackback:ping><description><![CDATA[<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;画笔和画刷都是</span><span>GDI</span><span>所定义的图形对象，画笔是线条的样式，画刷则是封闭图形内部填充的样式。可以自定义绘图所用画笔及画刷的样式，系统预设画笔的样式为</span><span>BLACK_PEN</span><span>，画刷的样式为</span><span>NULL_BRUSH</span><span>。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要自定义画笔或画刷，可以使用下列</span><span>3</span><span>个</span><span>API</span><span>函数。</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HPEN&nbsp;CreatePen(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;样式,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;宽度,&nbsp;COLORREF&nbsp;颜色);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立画笔</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">HBRUSH&nbsp;CreateHatchBrush(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;样式,&nbsp;COLORREF颜色);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立阴影画刷</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">HBRUSH&nbsp;CreateSolidBrush(COLORREF&nbsp;颜色);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立单色画刷</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面的</span><span>3</span><span>个</span><span>API</span><span>函数可以看出，其返回值都是以英文字母&#8220;</span><span>H</span><span>&#8221;开头，&#8220;</span><span>H</span><span>&#8221;在这里代表的就是前面所提过的&#8220;</span><span>handle</span><span>&#8221;（句柄）。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建立新画笔与画刷之后，必须在所要进行绘图的</span><span>DC</span><span>中选用它们，才会产生预期的画笔及画刷效果，选用的函数如下：</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HGDIOBJ&nbsp;SelectObject(HDC&nbsp;hdc,&nbsp;HGDIBJ&nbsp;GDI对象);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">选用GDI对象</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个</span><span>SelectObject()</span><span>函数所输入的第二个参数就是</span><span>GDI</span><span>对象的</span><span>handle</span><span>，而返回值则是前一次所使用的</span><span>GDI</span><span>对象。除了这一小节所介绍的画笔，画刷是属于</span><span>GDI</span><span>对象外，其他的</span><span>GDI</span><span>对象还有：位图、字体、区域及调色板。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GDI</span><span>对象一经建立便会占用部分内存，一旦不使用的时候，务必将它们删除，删除函数如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;DeleteObject(HGDIOBJ&nbsp;GDI对象);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">删除GDI对象</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若删除对象成功，则会返回布尔值&#8220;</span><span>TRUE</span><span>&#8221;，若失败则返回&#8220;</span><span>FALSE</span><span>&#8221;。</span></p>
<br>范例ch2_1：建立7种系统所提供的画笔即画刷样式，将结果绘制于窗口中<br>下载地址：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/ch2%5E_1.rar">ch2_1</a>（上传到windows live空间，可能需要MSN账号登陆）<br>说明：程序源代码中有相关的注释。<br><br>最后运行结果图：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/6.jpg">&nbsp;<br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/111951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 12:59 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>坐标与DC</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111938.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111938.html</trackback:ping><description><![CDATA[<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GDI</span><span>（</span><span>Graphics Device Interface</span><span>）中文可译为&#8220;图形设备接口&#8221;，是</span><span>Windows API</span><span>中相当重要的一个成员，它掌管了所有显像设备的图像显示及输出功能。缺少了它，</span><span>Windows</span><span>系统将不会像现在所使用的图形操作环境，而游戏程序既然运行了大量的影像图形处理，自然少不了</span><span>GDI<br><br><strong>1、屏幕区、窗口区与内部窗口区<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于一个游戏程序来说，不论采用全屏幕的模式还是单纯的窗口模式，都必须建立一个窗口。<span>当窗口建立后，显示的屏幕上便划分为</span><span>3</span><span>个区域，即屏幕区（</span><span>Screen</span><span>）、窗口区（</span><span>Window</span><span>）与内部窗口区（</span><span>Client</span><span>）。 如下图所示：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/kangnixi/游戏编程第2章图片/2.jpg" width=1280 height=573><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 屏幕区的区域大小视使用者计算机所设定的显示分辨率而定，一般在程序中都是以像素（</span><span>pixel</span><span>）当做坐标及长度单位。</span><span>80</span><span>0</span><span>&#215;<span>600</span>即屏幕区矩形的大小即为</span><span>80</span><span>0</span><span>&#215;<span>600</span>像素。</span></p>
<strong>2、Device Context</strong><br>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Device Context</span><span>（设备内容）一般简称为<span>DC</span>，就绘图的观点来说，<span>DC</span>就是程序可以进行绘图的地方。举例来说，如果要在整个屏幕区上绘图，那么<span>Device(</span>设备<span>)</span>就是屏幕<span>,</span>而<span>DC</span>就是屏幕区上的绘图层。相同的道理，如果要在窗口中绘图，那么<span>Device</span>就是窗口，<span>DC</span>就是窗口上可以绘图的地方，也就是内部窗口区。</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_PAINT;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">hdc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;BeginPaint(hWnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ps);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">EndPaint(hWnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ps);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，调用</span><span>BeginPaint()</span><span>函数开始进行窗口重绘的动作，而调用</span><span>EndPaint()</span><span>函数则是结束所有绘图动作。程序代码中调用</span><span>BeginPaint()</span><span>时会返回一个</span><span>DC</span><span>对象</span><span>hdc</span><span>，此对象所代表的是窗口（</span><span>hWnd</span><span>）</span><span>DC</span><span>，也就是内部窗口区。当窗口重绘消息发生时，可以在第二行和第三行程序代码之间加入要在内部窗口上进行绘图的动作。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外，在处理</span><span>WM_PAINT</span><span>消息之外的地方，若要取得窗口的</span><span>DC</span><span>，必须调用下面的这个函数：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HDC&nbsp;GetDC(HWND&nbsp;hWnd);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得DC</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，所输入的参数是窗口的&#8220;</span><span>handle</span><span>&#8221;。</span><span>handle</span><span>是</span><span>Windows</span><span>系统中用来识别各种不同资源的一个句柄，而且每一项资源的</span><span>handle</span><span>都是唯一的。根据</span><span>handle</span><span>，</span><span>Windows</span><span>可以快速且正确地找到所要使用的资源。注意，若使用</span><span>GetDC()</span><span>函数取得窗口</span><span>DC</span><span>后，当不使用时必须将它释放，否则其他应用程序将无法使用。</span><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ReleaseDC(HWND&nbsp;hWnd,&nbsp;HDC释放DC名称);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放DC</span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若上面这个函数运行成功，则会返回整数&#8220;</span><span>1</span><span>&#8221;，若失败则返回&#8220;</span><span>0</span><span>&#8221;。</span></p>
<strong>3、坐标系统</strong><br>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 坐标问题。以屏幕区的左上角的坐标点为原点，屏幕上的任何一个位置都可以某一点坐标来表示，称为屏幕坐标。若绘图的区域是内部窗口区，那么坐标原点所在的位置就不通了，变成了内部窗口最左上角的点。</span></p>
<strong><br>4、坐标转换</strong><br>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于坐标的转换，GDI中提供了相关的函数。<br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。</span></p>
</span>
<img src ="http://www.cppblog.com/kangnixi/aggbug/111938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 11:53 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Visuanl C++游戏编程基础》学习笔记——索引随笔 </title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 03:05:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111931.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111931.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111931.html</trackback:ping><description><![CDATA[<p align=center>书名：《Visual C++游戏编程基础》，电子工业出版社</p>
<br><strong>第1章 </strong><a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111930.html"><strong>Windows API程序快速入门</strong></a><br><br><strong>第2章 游戏画面绘图</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">2.1 基本屏幕绘图</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html">坐标与DC<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111951.html">画笔与画刷</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.3&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html">GDI绘图函数<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.4&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111965.html">绘制位图<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red">2.2 游戏画面特效制作</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111977.html">透明效果</a><a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111938.html"><br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html">半透明效果<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2.3&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111992.html">透明半透明效果<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111959.html"><br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red">2.3 游戏地图制作</span><br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112037.html">平面地图贴图<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112050.html">斜角地图贴图</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3.3 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112053.html">景物贴图</a><br><br><strong>第3章 游戏动画技巧</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">3.1 基础动画显示</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112064.html">定时器的使用<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112069.html">游戏循环<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1.3&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112072.html">透明动画</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">3.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html">动画显示问题<br></a></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.2.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html">贴图坐标修正</a>（未完成）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.2.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112075.html">排序贴图</a>（阐述未完成，代码完成）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">3.3 背景动画设计</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3.1&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112082.html">单一背景滚动<br></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3.2&nbsp;<a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112089.html">循环背景动画</a>（阐述未完成，代码完成）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3.3 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/09/112093.html">多背景循环动画<br></a><br><strong>第4章 游戏输入消息处理</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">4.1 键盘输入消息<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.1.1&nbsp;关于Windows中的键盘<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.1.2 键盘消息处理<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">4.2&nbsp;鼠标输入消息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3&nbsp;鼠标相关函数<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3.1&nbsp;获取窗口外鼠标消息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3.2&nbsp;设定鼠标光标位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3.3 显示与隐藏鼠标光标<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3.4 限制鼠标光标移动区域<br><br><strong>第5章 游戏人工智能<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">5.1&nbsp;移动型游戏AI</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.1.1&nbsp;追逐移动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.1.2 躲避移动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.1.3&nbsp;模式移动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">5&nbsp;.2&nbsp;行为型游戏AI</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.2.1 计算机角色的思考与行为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.2.2&nbsp;搜索迷宫出口<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">5.3&nbsp;策略型游戏AI</span><br><br><strong>第6章 游戏物理现象设计原理<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;6.1&nbsp;物理运动</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.1.1&nbsp;匀速运动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.1.2&nbsp;加速度运动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.1.3&nbsp;重力<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.1.4&nbsp;摩擦力<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">6.2&nbsp;物体间的碰撞<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.2.1&nbsp;以范围检测碰撞<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.2.2&nbsp;以颜色检测碰撞<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.2.3&nbsp;以行进路线检测碰撞<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.2.4&nbsp;与斜面碰撞后的速度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">6.3&nbsp;粒子的应用<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.3.1&nbsp;粒子的定义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.3.2&nbsp;雪花纷飞<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.3.3&nbsp;放烟火<br><br><strong>第7章 进入3D世界</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">7.1&nbsp;初探DirectX</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.1.1&nbsp;DirectX SDK简介<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.1.2 DirectX的特色<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">7.2&nbsp;使用Direct Graphics<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.2.1&nbsp;介绍Direct Graphics设备<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.2.2&nbsp;如何建立Direct Graphics设备<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.2.3&nbsp;使用Direct Graphics取得绘图设备（GDI）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">7.3&nbsp;使用Direct Graphics进行2D影像处理<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.3.1&nbsp;Direct Graphics绘图引擎<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.3.2&nbsp;如何贴影像文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">7.4&nbsp;Direct Graphics的颜色操作</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.4.1&nbsp;Direct Graphics颜色操作流程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.4.2&nbsp;混色操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.4.3&nbsp;材质基台操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><strong>第8章 Direct Graphics 3D的奇幻世界<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;&nbsp;8.1 迷人的3D魅力&nbsp;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.1&nbsp;三维空间概念&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.2 模型与顶点&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.3&nbsp;3D世界的环境描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.4&nbsp;顶点颜色的计算方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.5&nbsp;加载一个X文件的模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">8.2&nbsp;3D空间坐标的转换</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.2.1&nbsp;Direct Graphics坐标转换管线<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.2.2&nbsp;世界环境描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.2.3&nbsp;视觉环境描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.2.4&nbsp;投射环境描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">8.3&nbsp;Direct Graphics的色彩计算</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.3.1&nbsp;颜色的决定因素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.3.2&nbsp;发射光的设定方式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.3.3&nbsp;表面材质的设定方法<br><br><strong>第9章 DirectSound的使用方式</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;9.1&nbsp;开始建立DirectSound的第一步</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.1&nbsp;建立DirectSound的第一步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.2&nbsp;DirectSound对象的建立<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.3&nbsp;设定程序协调层级<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.4&nbsp;缓冲区的基本概念<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.5&nbsp;建立主缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.6&nbsp;WAVE声音文件的加载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.7&nbsp;建立次缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1.8&nbsp;加载声音道次缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">9.2&nbsp;声音的播放与控制<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2.1&nbsp;播放声音功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2.2&nbsp;制作混音功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2.3&nbsp;控制声音功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">9.3&nbsp;3D音效的实际演练</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.3.1&nbsp;认识3D音效<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.3.2&nbsp;建立倾听者功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.3.3&nbsp;建立发声者<br><br><strong>第10章 DirectInput的使用方法<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">10.1&nbsp;建立DirectInput程序</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.1&nbsp;开始建立DirectInput程序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.2&nbsp;建立DirectInput对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.3&nbsp;建立输入装置对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.4&nbsp;资料格式的设定<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.5&nbsp;设定程序协调层级<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.6&nbsp;输入装置的调用方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">10.2&nbsp;键盘与鼠标输入的取得方法<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.2.1&nbsp;键盘输入的取得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.2.2&nbsp;取得鼠标输入<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;10.3&nbsp;使用摇杆功能<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.3.1&nbsp;取得摇杆装置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.3.2&nbsp;摇杆组件的列举方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.3.3&nbsp;摇杆输入的取得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.3.4 设定无效范围<br><br><strong>第11章 威力强大的DirectPlay和DirectShow<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">11.1&nbsp;DirectPlay初体验<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.1.1&nbsp;DirectPlay的使用时机<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.1.2&nbsp;DirectPlay的网络拓扑<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.1.3&nbsp;网络联机游戏的构成<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.1.4&nbsp;DirectPlay的组成模式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.1.5&nbsp;联机程序范例介绍<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">11.2&nbsp;DirectShow的多媒体功能</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.2.1&nbsp;DirectShow的架构<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.2.2&nbsp;播放影片功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.2.3&nbsp;播放MP3<br><br><strong>第12章 小游戏设计实例</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">12.1&nbsp;俄罗斯方块游戏轻松做<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12.2&nbsp;抢娃娃游戏</span><br><br><strong>附录A DirectDraw制作游戏秘籍大公开</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">A.1&nbsp;程序中的各个自定义函数</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.1.1&nbsp;初始化与建立DirectDraw对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.1.2&nbsp;建立DirectDraw幕后暂存区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.1.3&nbsp;建立DirectSound次缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.1.4&nbsp;设定颜色键函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">A.2&nbsp;绚丽的电流急即棒</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.2.1&nbsp;游戏功能介绍<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.2.2&nbsp;游戏功能设计方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.2.3 程序内容说明&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">A.3&nbsp;太空射击游戏</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.1&nbsp;游戏功能介绍<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.2&nbsp;滚动背景的设计<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.3&nbsp;怪物的产生于移动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.4&nbsp;子弹的产生<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.5&nbsp;检测碰撞的方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.3.6 程序编写的方法<br><br><strong>附录B 专业词汇<br><br>附录C 常用Windows虚拟键表</strong> 
<img src ="http://www.cppblog.com/kangnixi/aggbug/111931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 11:05 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第1章 Windows API程序快速入门</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111930.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111930.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111930.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111930.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore"><br><span style="COLOR: red">1、</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目前一般的大型商业游戏软件开发模式，大多采用</span><span lang=EN-US>Visual C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序开发工具与</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US>Application Program Interface</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）程序架构来编写以提高游戏程序运行时的效率。</span></p>
<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore"><br><span style="COLOR: red">2、</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是拥有着优良传统的程序语言，而</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是微软公司开发出的一套适用于</span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法的程序开发工具。在</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境中，编写</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作系统平台的窗口程序有两种不同的程序架构：一种是微软在</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中所加入的</span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US>Microsoft Foundation Class library</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）架构，</span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个庞大的类型函数库，其中提供了完整开发窗口程序所需的对象类型与函数，常用于设计一般的应用软件程序；另一种是本书所介绍的</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构，使用</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来开发上述的应用软件程序并不容易，但用在设计游戏程序上却相当简单且具有较优越的运行性能。</span></p>
<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><br><span style="COLOR: red">3、</span>&nbsp; </span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在游戏程序开发上所具备的优点</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008080">3.1优越的速度表现</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序编译后的文件是可直接运行的机器码，而其他程序语言（如</span><span lang=EN-US>VB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>Java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）编译后产生的是一种所谓的&#8220;中间码&#8221;。运行中间码时，系统内必须存在解释该程序语言的&#8220;解释器（</span><span lang=EN-US>Interpreter</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）&#8221;，用做同步翻译工作。解释器解释中间码时，本身会加载到内存中占用部分内存，且同步翻译中间码的过程也会浪费时间，因此，运行这类程序时要比可直接运行的机器码缓慢很多。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008080">3.2弹性管理资源与内存</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp; 在</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开发环境中，程序资源及内存管理方面都具有相当的弹性。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;在资源管理部分，通常是通过一个句柄来使用该项资源。这里所指的资源，可能是窗口、设备、图像和声音等对象。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp; 在内存管理部分，</span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言本身就具备内存管理的功能，除了可通过指针进行内存的存取和配置之外，还提供了完整的内存管理相关函数。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp; 由于游戏程序使用了大量的多媒体数据，运行时会占用不少内存，因此，若程序设计师能够弹性有效地来管理资源和内存，将可大大降低硬件要求并提高游戏程序本身的性能。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008080">3.3易于使用Windows API</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作系统提供的动态链接函数库（通常以&#8220;</span><span lang=EN-US>.DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;的文件格式存在于</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统中），</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中包含了</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内核及所有应用程序所需要的功能。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作系统发展至今，</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要可分为</span><span lang=EN-US>Win16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US>Windows 3.1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前）以及</span><span lang=EN-US>Win32</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US>Windows 95</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以后）两种版本，不同版本</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统间</span><span lang=EN-US>API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内容或多或少有些差异但都以向下兼容为原则。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp; 一般在</span><span lang=EN-US>VB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中，要调用</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的函数，必须先完成声明的操作。但在</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境下，不论采用</span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的程序架构，只要在项目中设定好所要链接的函数库并引用正确的头文件，那么在程序中使用</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的函数就跟使用</span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准函数库一样容易。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;（动态链接（</span><span lang=EN-US>Dynamic Linking</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是指在程序运行阶段，真正调用外部函数时才进行链接（注：将程序代码中调用函数的指针指向外部函数所在的地址）的操作）<br><br></span></p>
<span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore">
<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><br><span style="COLOR: red">4、</span>&nbsp; </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111927.html"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构建游戏设计的舞台</span></a>(单击其链接可进入相应的随笔)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp; 5、</span>&nbsp;</span></span><span><a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111929.html"><span>程序架构说明</span></a><font face=宋体>(单击其链接可进入相应的随笔)<br><br><br><br><font face="Times New Roman">PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔</font><a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html"><font face="Times New Roman">：《Visual C++游戏编程基础》学习笔记——索引随笔</font></a></font><font face="Times New Roman">。</font></span></span></span></p>
<img src ="http://www.cppblog.com/kangnixi/aggbug/111930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 11:02 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序架构说明</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111929.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111929.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111929.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111929.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在&#8220;构建游戏设计的舞台&#8221;这一随笔中，建立的项目便是一个标准Windows API的程序架构，主程序文件&#8220;canvas.cpp&#8221;由下表中几个重要的函数所构成：<br>&nbsp;
<table border=1 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=115>
            <p style="COLOR: #000000">函数名称</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=453>
            <p style="COLOR: #000000">说明</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=115>
            <p style="COLOR: #000000">WinMain</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=453>
            <p style="COLOR: #000000">主程序，程序起始点</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=115>
            <p style="COLOR: #000000">WndProc</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=453>
            <p style="COLOR: #000000">自定义函数，处理程序消息</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=115>
            <p style="COLOR: #000000">MyRegisterClass</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=453>
            <p style="COLOR: #000000">自定义函数，注册窗口类别</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=115>
            <p style="COLOR: #000000">InitInstance</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=453>
            <p style="COLOR: #000000">自定义函数，建立及显示窗口的初始化函数</p>
            </td>
        </tr>
    </tbody>
</table>
<p><br>下面来说说这些函数的内容与功能。<br><br><strong>1.WinMain函数<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主程序，也就是整个项目程序开始运行的地方，如同Console程序中的main()函数。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">****主程序***********************************</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;APIENTRY&nbsp;WinMain(HINSTANCE&nbsp;hInstance,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">HINSTANCE&nbsp;hPrevInstance,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpCmdLine,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCmdShow)<br><img id=Codehighlighter1_153_959_Open_Image onclick="this.style.display='none'; Codehighlighter1_153_959_Open_Text.style.display='none'; Codehighlighter1_153_959_Closed_Image.style.display='inline'; Codehighlighter1_153_959_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_153_959_Closed_Image onclick="this.style.display='none'; Codehighlighter1_153_959_Closed_Text.style.display='none'; Codehighlighter1_153_959_Open_Image.style.display='inline'; Codehighlighter1_153_959_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_153_959_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_153_959_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">MSG&nbsp;msg;<br><img id=Codehighlighter1_164_377_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_377_Open_Text.style.display='none'; Codehighlighter1_164_377_Closed_Image.style.display='inline'; Codehighlighter1_164_377_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_164_377_Closed_Image onclick="this.style.display='none'; Codehighlighter1_164_377_Closed_Text.style.display='none'; Codehighlighter1_164_377_Open_Image.style.display='inline'; Codehighlighter1_164_377_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_164_377_Closed_Text>/**/</span><span id=Codehighlighter1_164_377_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*********************************************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自定义函数，注册窗口类别<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;调用MyRegisterClass()函数，向系统注册窗口类别，输入参数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;&#8220;hInstance&#8221;是目前程序运行个体的对象代码<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">*********************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">MyRegisterClass(hInstance);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;运行初始化函数，调用InitInstance()函数，进行初始化操作</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">InitInstance&nbsp;(hInstance,&nbsp;nCmdShow))<br><img id=Codehighlighter1_486_502_Open_Image onclick="this.style.display='none'; Codehighlighter1_486_502_Open_Text.style.display='none'; Codehighlighter1_486_502_Closed_Image.style.display='inline'; Codehighlighter1_486_502_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_486_502_Closed_Image onclick="this.style.display='none'; Codehighlighter1_486_502_Closed_Text.style.display='none'; Codehighlighter1_486_502_Open_Image.style.display='inline'; Codehighlighter1_486_502_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_486_502_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_486_502_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_504_850_Open_Image onclick="this.style.display='none'; Codehighlighter1_504_850_Open_Text.style.display='none'; Codehighlighter1_504_850_Closed_Image.style.display='inline'; Codehighlighter1_504_850_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_504_850_Closed_Image onclick="this.style.display='none'; Codehighlighter1_504_850_Closed_Text.style.display='none'; Codehighlighter1_504_850_Open_Image.style.display='inline'; Codehighlighter1_504_850_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_504_850_Closed_Text>/**/</span><span id=Codehighlighter1_504_850_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*****************************************************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;消息循环<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;程序通过此消息循环来获取消息，并进行必要的键盘消息转换，<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;而后将控制权交给操作系统，由操作系统决定该由哪个程序的<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;消息处理函数处理消息。这个循环使用了3个API函数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;GetMessage&nbsp;获取程序消息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;TranslateMessage&nbsp;转换伪码及字符<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">*&nbsp;DispatchMessage&nbsp;将控制权交给系统，再由系统决定负责处理消息的程序<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">*****************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(GetMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))<br><img id=Codehighlighter1_889_938_Open_Image onclick="this.style.display='none'; Codehighlighter1_889_938_Open_Text.style.display='none'; Codehighlighter1_889_938_Closed_Image.style.display='inline'; Codehighlighter1_889_938_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_889_938_Closed_Image onclick="this.style.display='none'; Codehighlighter1_889_938_Closed_Text.style.display='none'; Codehighlighter1_889_938_Open_Image.style.display='inline'; Codehighlighter1_889_938_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_889_938_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_889_938_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">TranslateMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">DispatchMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;msg.wParam;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><strong>2.MyRegisterClass函数</strong>&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_0_231_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_231_Open_Text.style.display='none'; Codehighlighter1_0_231_Closed_Image.style.display='inline'; Codehighlighter1_0_231_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_0_231_Closed_Image onclick="this.style.display='none'; Codehighlighter1_0_231_Closed_Text.style.display='none'; Codehighlighter1_0_231_Open_Image.style.display='inline'; Codehighlighter1_0_231_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_0_231_Closed_Text>/**/</span><span id=Codehighlighter1_0_231_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****************************************************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;在建立程序窗口的实体之前，必须先定义一个窗口类别，其中包含所要<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;建立窗口的相关信息，并向系统注册。这里的MyRegisterClass()函数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;就是进行定义及注册窗口类别的函数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;****************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">ATOM&nbsp;MyRegisterClass(HINSTANCE&nbsp;hInstance)<br><img id=Codehighlighter1_275_1099_Open_Image onclick="this.style.display='none'; Codehighlighter1_275_1099_Open_Text.style.display='none'; Codehighlighter1_275_1099_Closed_Image.style.display='inline'; Codehighlighter1_275_1099_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_275_1099_Closed_Image onclick="this.style.display='none'; Codehighlighter1_275_1099_Closed_Text.style.display='none'; Codehighlighter1_275_1099_Open_Image.style.display='inline'; Codehighlighter1_275_1099_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_275_1099_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_275_1099_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明一个窗口类别&#8220;WNDCLASSEX&#8221;和结构&#8220;wcex&#8221;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEX&nbsp;wcex;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img id=Codehighlighter1_330_398_Open_Image onclick="this.style.display='none'; Codehighlighter1_330_398_Open_Text.style.display='none'; Codehighlighter1_330_398_Closed_Image.style.display='inline'; Codehighlighter1_330_398_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_330_398_Closed_Image onclick="this.style.display='none'; Codehighlighter1_330_398_Closed_Text.style.display='none'; Codehighlighter1_330_398_Open_Image.style.display='inline'; Codehighlighter1_330_398_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_330_398_Closed_Text>/**/</span><span id=Codehighlighter1_330_398_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">**************************Begin**********************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;定义&#8220;wcex&#8221;结构的各项信息，其中设定消息处理函数（IpfnWndProc）为<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&#8220;WndProc&#8221;，类别名称（lpszClassName）为&#8220;canvas&#8221;。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wcex.cbSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(WNDCLASSEX);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.style&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CS_HREDRAW&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;CS_VREDRAW;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;设定消息处理函数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wcex.lpfnWndProc&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(WNDPROC)WndProc;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.cbClsExtra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.cbWndExtra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hInstance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hInstance;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hIcon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hCursor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hCursor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LoadCursor(NULL,&nbsp;IDC_ARROW);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hbrBackground&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(HBRUSH)(COLOR_WINDOW</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.lpszMenuName&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">类别名称</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wcex.lpszClassName&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">canvas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wcex.hIconSm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img id=Codehighlighter1_930_998_Open_Image onclick="this.style.display='none'; Codehighlighter1_930_998_Open_Text.style.display='none'; Codehighlighter1_930_998_Closed_Image.style.display='inline'; Codehighlighter1_930_998_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_930_998_Closed_Image onclick="this.style.display='none'; Codehighlighter1_930_998_Closed_Text.style.display='none'; Codehighlighter1_930_998_Open_Image.style.display='inline'; Codehighlighter1_930_998_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_930_998_Closed_Text>/**/</span><span id=Codehighlighter1_930_998_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">***************************End***********************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;调用RegisterClassEx()函数注册类别，返回一个&#8220;ATOM&#8221;形态的字符串，此字符串即为类别名称&#8220;canvas&#8221;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;RegisterClassEx(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wcex);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><strong>3.InitInstance函数</strong>&nbsp;<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;在这一初始函数中，按照前面所定义的窗口类别来建立并显示实际的程序窗口<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">*****初始化函数*******************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;1.存储instance&nbsp;handle于全局变量中<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;2.建立并显示主窗口</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL&nbsp;InitInstance(HINSTANCE&nbsp;hInstance,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nCmdShow)<br><img id=Codehighlighter1_178_658_Open_Image onclick="this.style.display='none'; Codehighlighter1_178_658_Open_Text.style.display='none'; Codehighlighter1_178_658_Closed_Image.style.display='inline'; Codehighlighter1_178_658_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_178_658_Closed_Image onclick="this.style.display='none'; Codehighlighter1_178_658_Closed_Text.style.display='none'; Codehighlighter1_178_658_Open_Image.style.display='inline'; Codehighlighter1_178_658_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_178_658_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_178_658_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWnd;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;hInst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hInstance;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;调用CreateWindow()函数来建立一个窗口对象，所输入的第1个参数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;就是窗口建立所依据的类别名称，也就是前面程序所定义的&#8220;canvas&#8221;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hWnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateWindow(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">canvas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">绘图窗口</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;,&nbsp;WS_OVERLAPPEDWINDOW,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;CW_USEDEFAULT,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;NULL,&nbsp;NULL,&nbsp;hInstance,&nbsp;NULL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">hWnd)<br><img id=Codehighlighter1_440_459_Open_Image onclick="this.style.display='none'; Codehighlighter1_440_459_Open_Text.style.display='none'; Codehighlighter1_440_459_Closed_Image.style.display='inline'; Codehighlighter1_440_459_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_440_459_Closed_Image onclick="this.style.display='none'; Codehighlighter1_440_459_Closed_Text.style.display='none'; Codehighlighter1_440_459_Open_Image.style.display='inline'; Codehighlighter1_440_459_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_440_459_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_440_459_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;下面三条语句，设定窗口的显示位置及窗口大小，然后绘制在显示设备上<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;设定窗口显示的位置及窗口大小</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MoveWindow(hWnd,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">600</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">450</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;设定窗口显示时的状态</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hWnd,&nbsp;nCmdShow);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;将窗口绘制于显示设备上</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hWnd);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><strong>4.WndPro函数</strong>&nbsp;<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_0_433_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_433_Open_Text.style.display='none'; Codehighlighter1_0_433_Closed_Image.style.display='inline'; Codehighlighter1_0_433_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_0_433_Closed_Image onclick="this.style.display='none'; Codehighlighter1_0_433_Closed_Text.style.display='none'; Codehighlighter1_0_433_Open_Image.style.display='inline'; Codehighlighter1_0_433_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_0_433_Closed_Text>/**/</span><span id=Codehighlighter1_0_433_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*******************************************************************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;在前面定义类别的时候把WndPro定义为消息处理函数，也就是当某些外部消息发生时，会<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;按照消息的类型来决定该如何进行处理。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;此外，WndPro函数也是一个所谓的&#8220;回调函数（CALLBACK）&#8221;，简单地说，回调函数是属于<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;Windows操作系统所调用的函数，而非程序本身所调用的函数，这是因为Windows是一个多任<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;务的作业环境，在同一时刻可能会有多个程序正在运行，而当某一事件发生时，有可能每一<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;个程序都会接受到此消息，因此系统必须去判断该由哪个程序进行处理，然后再调用该程序<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;*&nbsp;的消息处理函数。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;*******************************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">LRESULT&nbsp;CALLBACK&nbsp;WndProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;message,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)<br><img id=Codehighlighter1_515_1091_Open_Image onclick="this.style.display='none'; Codehighlighter1_515_1091_Open_Text.style.display='none'; Codehighlighter1_515_1091_Closed_Image.style.display='inline'; Codehighlighter1_515_1091_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_515_1091_Closed_Image onclick="this.style.display='none'; Codehighlighter1_515_1091_Closed_Text.style.display='none'; Codehighlighter1_515_1091_Open_Image.style.display='inline'; Codehighlighter1_515_1091_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_515_1091_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_515_1091_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT&nbsp;ps;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;判断消息类型</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(message)&nbsp;<br><img id=Codehighlighter1_576_1076_Open_Image onclick="this.style.display='none'; Codehighlighter1_576_1076_Open_Text.style.display='none'; Codehighlighter1_576_1076_Closed_Image.style.display='inline'; Codehighlighter1_576_1076_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_576_1076_Closed_Image onclick="this.style.display='none'; Codehighlighter1_576_1076_Closed_Text.style.display='none'; Codehighlighter1_576_1076_Open_Image.style.display='inline'; Codehighlighter1_576_1076_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_576_1076_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_576_1076_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_PAINT:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口重绘消息</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;BeginPaint(hWnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ps);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hWnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ps);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_DESTROY:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口结束消息</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_711_912_Open_Image onclick="this.style.display='none'; Codehighlighter1_711_912_Open_Text.style.display='none'; Codehighlighter1_711_912_Closed_Image.style.display='inline'; Codehighlighter1_711_912_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_711_912_Closed_Image onclick="this.style.display='none'; Codehighlighter1_711_912_Closed_Text.style.display='none'; Codehighlighter1_711_912_Open_Image.style.display='inline'; Codehighlighter1_711_912_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_711_912_Closed_Text>/**/</span><span id=Codehighlighter1_711_912_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">**********************************************************<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;调用PostQuitMessage()函数发送窗口结束消息给系统，通知<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;系统结束目前程序的运行，然后由系统处理程序结束的后续操作<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**********************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">其他消息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;DefWindowProc()函数调用预设的系统函数来处理程序本身不处理的消息</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;DefWindowProc(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>下载源代码：<a href="http://cid-c5477b7925583ef7.skydrive.live.com/self.aspx/%e3%80%8aVisual%20C++%e6%b8%b8%e6%88%8f%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80%e3%80%8b/canvas.rar">canvas.rar</a>（文件上传在Windows live空间，可能需要有msn账号进行登录） <br><br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/111929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 11:00 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建游戏设计的舞台</title><link>http://www.cppblog.com/kangnixi/archive/2010/04/08/111927.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/kangnixi/archive/2010/04/08/111927.html</guid><wfw:comment>http://www.cppblog.com/kangnixi/comments/111927.html</wfw:comment><comments>http://www.cppblog.com/kangnixi/archive/2010/04/08/111927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kangnixi/comments/commentRss/111927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kangnixi/services/trackbacks/111927.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果您是第一次接触VC++，或许还不清楚建立VC++程序项目的方式，不过没关系，在这里先以VC++项目向导做个建立简单项目的示例，可以按照下面的操作步骤来完成这项工作，如下图：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><strong>第一步：</strong><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/kangnixi/构建游戏设计的舞台/2.jpg" width=752 height=493><br><br><strong>第二步</strong><br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/构建游戏设计的舞台/3.jpg" width=622 height=480><br><br>在项目建立完成后，查看工作区的文件列表，可看到如下图所示的内容<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/kangnixi/构建游戏设计的舞台/5.JPG" width=228 height=330><br><br>其中几个重要的文件说明如下表所示：<br>&nbsp;
<table border=1 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=79>
            <p style="COLOR: #000000">文件名称</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=489>
            <p style="COLOR: #000000">说明</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=79>
            <p style="COLOR: #000000">canvas.cpp</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=489>
            <p style="COLOR: #000000">主程序文件，其中包含整个项目的主程序WinMain</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=79>
            <p style="COLOR: #000000">canvas.rc</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=489>
            <p style="COLOR: #000000">资源文件，定义了整个项目所使用的资源</p>
            </td>
        </tr>
        <tr>
            <td style="COLOR: #000000" vAlign=top width=79>
            <p style="COLOR: #000000">StdAfx.h</p>
            </td>
            <td style="COLOR: #000000" vAlign=top width=489>
            <p style="COLOR: #000000">标头文件，其中引用整个项目所需的头文件</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br>可以直接按【</span><span lang=EN-US>F5</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">】键运行这个项目。</span> <br><br>PS：如想获得更多关于Visual C++游戏开发的内容，可点击随笔<a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111931.html">：《Visual C++游戏编程基础》学习笔记——索引随笔</a>。
<img src ="http://www.cppblog.com/kangnixi/aggbug/111927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 10:35 <a href="http://www.cppblog.com/kangnixi/archive/2010/04/08/111927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>