<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_独酌逸醉</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/74638/rss</id><updated>2012-04-30T01:32:15Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/74638/rss"/><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2012/04/30/2476731.html</id><title type="text">此博客已经作废，不再更新</title><summary type="text">大家好，我的博客已搬至 www.keepsimply.org 。另外喜欢音乐的朋友可以去我的音乐博客去( www.yuehun.in )听歌。</summary><published>2012-04-30T01:31:00Z</published><updated>2012-04-30T01:31:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2012/04/30/2476731.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2012/04/30/2476731.html"/><content type="html">&lt;p&gt;大家好，我的博客已搬至 &lt;a href="http://www.keepsimply.org"&gt;www.keepsimply.org&lt;/a&gt; 。另外喜欢音乐的朋友可以去我的音乐博客去( www.yuehun.in )听歌。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2476731.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2012/04/30/2476731.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/11/23/2261043.html</id><title type="text">Direct3D 初涉: 光照</title><summary type="text">1.光照的组成在Direct3D的光照模型中，光源发出的光由以下3种分量或者3种类型的光组成：(1)环境光(AmbientLight)：光经其他表面反射到达物体表面，并照亮整个场景。个人理解：白天阴天的时候为什么还能看见物体？环境光！(2)漫射光(DiffuseLight)：光沿着特定的方向传播。当它到达某一表面时，将沿着各个方向均匀反射。无论从那个方向来看，表面亮度均相同，所以采用该模型时，无须考虑观察者的位置。(3)镜面光(SpecularLight)：光沿特定方向传播。当此类光到达一个表面时，将严格地沿着另一个方向反射，从而形成只能在一定角度范围内才能观察到的高亮度照射。相对前两种光照类</summary><published>2011-11-23T15:42:00Z</published><updated>2011-11-23T15:42:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/23/2261043.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/23/2261043.html"/><content type="html">&lt;div class="Section0"&gt;&lt;h3 class="p0"&gt;1.&amp;nbsp;光照的组成&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的光照模型中，光源发出的光由以下&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;种分量或者&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;种类型的光组成：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(1)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;环境光&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Ambient&amp;nbsp;Light)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;：光经其他表面反射到达物体表面，并照亮整个场景。个人理解：白天阴天的时候为什么还能看见物体？环境光！&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(2)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;漫射光&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Diffuse&amp;nbsp;Light)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;：光沿着特定的方向传播。当它到达某一表面时，将沿着各个方向均匀反射。无论从那个方向来看，表面亮度均相同，所以采用该模型时，无须考虑观察者的位置。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(3)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;镜面光&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Specular&amp;nbsp;Light)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;：光沿特定方向传播。当此类光到达一个表面时，将严格地沿着另一个方向反射，从而形成只能在一定角度范围内才能观察到的高亮度照射。相对前两种光照类型，镜面光的计算量要大的多，因此默认情况下&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;不进行镜面反射计算；如果想启动镜面光，必须将绘制状态&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DRS_SPECULARENABLE&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;true&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;每种类型的光都可用结构&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DCOLORVALUE&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;或&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DXCOLOR&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来表示，这些类型描述了光线的颜色&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&amp;nbsp;Alpha&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;值被忽略&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;2.&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;材质&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在现实世界中，我们所看到的物体颜色是由该物体所反射的光的颜色决定的&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物体对光进行的部分吸收&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。例如：我的显示器边缘是黑色的，这是由于它吸收了所有非黑色的光，所以它显示为黑色。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;通过定义物体的材质&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(materials)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来模拟同样的现象。允许我们定义物体表面对各种颜色光的反射比例。在代码中使用结构&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172571%28v=vs.85%29.aspx"&gt;D3DMATERIAL9&lt;/a&gt;&amp;nbsp;来表示。&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;使用&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174437%28v=vs.85%29.aspx"&gt;SetMaterial&lt;/a&gt;&amp;nbsp;来设定当前材质。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;当物体能收吸收所有的光时，它将显示为黑色；当物体能反射所有的光时，它将显示为白色。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;3.&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb173380%28v=vs.85%29.aspx"&gt;顶点法线&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;面法线是一个描述多边形朝向的向量。顶点法线描述构成多边形各个顶点的法线。&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;需要知道顶点的法线方向，以确定光线到达表示时的入射角。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;4.&amp;nbsp;光源&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;支持三种类型的光源：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(1)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;点光源&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Point&amp;nbsp;lights)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，在世界坐标系位置固定，并且向所有的方向发射光线。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(2)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;方向光&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Directional&amp;nbsp;lights)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，没有位置信息，发射的光线平行地沿着某一特定的方向传播。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(3)&amp;nbsp;&lt;a href="http://www.toymaker.info/Games/html/lighting.html"&gt;聚光灯&lt;/a&gt;(Spot&amp;nbsp;lights)&lt;span style="font-family: 宋体;"&gt;，和手电筒类似，有位置信息，其发射的光线成锥形，沿着特定的方向传播。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;在程序代码中，光源用结构&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172566%28v=vs.85%29.aspx"&gt;D3DLIGHT9&lt;/a&gt;&amp;nbsp;来表示。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;5.&amp;nbsp;例程&lt;span style="font-family: Consolas;"&gt;(Lighting)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;(1)&amp;nbsp;将光照和颜色整合到框架中，将&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/21/2257705.html"&gt;DrawColorTriangle&lt;/a&gt;&amp;nbsp;中的&lt;span style="font-family: Consolas;"&gt;GlobalColorConstant.h&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;添加到框架中。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(2)&amp;nbsp;新建文件&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;GlobalMtrlConstant.h&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，保存常用材质的常量。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#ifndef __GLOBALMTRLCONSTANCE_H__&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __GLOBALMTRLCONSTANCE_H__&lt;br /&gt;&lt;br /&gt;D3DMATERIAL9 InitMtrl(D3DXCOLOR ambient, D3DXCOLOR diffuse, D3XCOLOR specular,&lt;br /&gt;                      D3DXCOLOR emissive, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; power)&lt;br /&gt;{&lt;br /&gt;    D3DMATRIAL9 mtrl;&lt;br /&gt;    mtrl.Ambient  = ambient;&lt;br /&gt;    mtrl.Diffuse  = diffuse;&lt;br /&gt;    mtrl.Specular = specular;&lt;br /&gt;    mtrl.Emissive = emissive;&lt;br /&gt;    mtrl.Power    = p;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; mtrl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DMATERIAL9 WHITE_MTRL  = InitMtrl(WHITE, WHITE, WHITE, BLACK, &lt;span style="color: #800080;"&gt;8.0f&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DMATERIAL9 RED_MTRL    = InitMtrl(RED, RED, RED, BLACK, &lt;span style="color: #800080;"&gt;8.0f&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DMATERIAL9 GREEN_MTRL  = InitMtrl(GREEN, GREEN, GREEN, BLACK, &lt;span style="color: #800080;"&gt;8.0f&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DMATERIAL9 BLUE_MTRL   = InitMtrl(BLUE, BLUE, BLUE, BLACK, &lt;span style="color: #800080;"&gt;8.0f&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, &lt;span style="color: #800080;"&gt;8.0f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __GLOBALMTRLCONSTANCE_H__ */&lt;/div&gt;&lt;p class="p0"&gt;(3)&amp;nbsp;新建工程&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Lighting&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，将框架代码拷贝到新工程中&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;以下在&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Lighting&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;上操作&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(4)&amp;nbsp;新建文件&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;NormalVertex.h&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，添加法线顶点的定义。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#ifndef __NORMALVERTEX_H__&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __NORMALVERTEX_H__&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; NormalVertex&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    NormalVertex()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    NormalVertex(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; x, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; y, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; z, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; nx, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; ny, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; nz)&lt;br /&gt;    {&lt;br /&gt;        m_x = x; m_y = y; m_z = z;&lt;br /&gt;        m_nx = nx; m_ny = ny; m_nz = nz;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; m_x, m_y, m_z;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; m_nx, m_ny, m_nz;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD FVF;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD NormalVertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __NORMALVERTEX_H__ */&lt;/div&gt;&lt;p class="p0"&gt;(5)&amp;nbsp;向&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3DFrame&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类中添加成员变量，保存金字塔的定点数据。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;IDirect3DVertexBuffer9&amp;nbsp;*&amp;nbsp;m_pyramid;&amp;nbsp;//&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;金字塔顶点缓存&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(6)&amp;nbsp;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Setup&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中添加场景光照和其他操作&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Setup()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 启用光照&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;SetRenderState(D3DRS_LIGHTING, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建顶点缓存，并指定构成金字塔的三角形单元的顶点，顶点法线预先计算好&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;CreateVertexBuffer(&lt;br /&gt;        &lt;span style="color: #800080;"&gt;12&lt;/span&gt; * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NormalVertex),&lt;br /&gt;        D3DUSAGE_WRITEONLY,&lt;br /&gt;        NormalVertex::FVF,&lt;br /&gt;        D3DPOOL_MANAGED,&lt;br /&gt;        &amp;amp;m_pyramid,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    NormalVertex* nv;&lt;br /&gt;    m_pyramid-&amp;gt;Lock(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;**)&amp;amp;nv, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; font face&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    nv[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = NormalVertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; left face&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    nv[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = NormalVertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;] = NormalVertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; right face&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    nv[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;7&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;8&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; back face&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    nv[&lt;span style="color: #800080;"&gt;9&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;] = NormalVertex( &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;    nv[&lt;span style="color: #800080;"&gt;11&lt;/span&gt;] = NormalVertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.707f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    m_pyramid-&amp;gt;Unlock();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 设置物体材质&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DMATERIAL9 mtrl;&lt;br /&gt;    mtrl.Ambient = WHITE;&lt;br /&gt;    mtrl.Diffuse = WHITE;&lt;br /&gt;    mtrl.Specular = WHITE;&lt;br /&gt;    mtrl.Emissive = BLACK;&lt;br /&gt;    mtrl.Power = &lt;span style="color: #800080;"&gt;0.5f&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    m_device-&amp;gt;SetMaterial(&amp;amp;mtrl);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建并启用光源&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DLIGHT9 dir;&lt;br /&gt;    ::ZeroMemory(&amp;amp;dir, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(dir));&lt;br /&gt;    dir.Type = D3DLIGHT_DIRECTIONAL;&lt;br /&gt;    dir.Diffuse = WHITE;&lt;br /&gt;    dir.Specular = WHITE * &lt;span style="color: #800080;"&gt;0.3f&lt;/span&gt;;&lt;br /&gt;    dir.Ambient = WHITE * &lt;span style="color: #800080;"&gt;0.6f&lt;/span&gt;;&lt;br /&gt;    dir.Direction = D3DXVECTOR3(&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    &lt;br /&gt;    m_device-&amp;gt;SetLight(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &amp;amp;dir);&lt;br /&gt;    m_device-&amp;gt;LightEnable(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 重新规范化法向量，启用镜面光&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;SetRenderState(D3DRS_NORMALIZENORMALS, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;    m_device-&amp;gt;SetRenderState(D3DRS_SPECULARENABLE, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    D3DXVECTOR3 position(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;2.5f&lt;/span&gt;);&lt;br /&gt;    D3DXVECTOR3 target(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    D3DXVECTOR3 up(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    D3DXMATRIX v;&lt;br /&gt;    D3DXMatrixLookAtLH(&amp;amp;v, &amp;amp;position, &amp;amp;target, &amp;amp;up);&lt;br /&gt;&lt;br /&gt;    m_device-&amp;gt;SetTransform(D3DTS_VIEW, &amp;amp;v);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set the projection matrix.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DXMATRIX proj;&lt;br /&gt;    D3DXMatrixPerspectiveFovLH(&lt;br /&gt;            &amp;amp;proj,&lt;br /&gt;            D3DX_PI * &lt;span style="color: #800080;"&gt;0.5f&lt;/span&gt;, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 90 - degree&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_width / (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_height,&lt;br /&gt;            &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: #800080;"&gt;1000.0f&lt;/span&gt;);&lt;br /&gt;    m_device-&amp;gt;SetTransform(D3DTS_PROJECTION, &amp;amp;proj);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;(7)&amp;nbsp;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Display&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;添加代码，使金字塔显示和旋转起来&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Display(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m_device) { &lt;br /&gt;        D3DXMATRIX yRot;&lt;br /&gt;        D3DXMatrixRotationY(&amp;amp;yRot, m_yRotAngle);&lt;br /&gt;        m_yRotAngle += timeDelta;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( m_yRotAngle &amp;gt;= &lt;span style="color: #800080;"&gt;6.28f&lt;/span&gt; ) {&lt;br /&gt;            m_yRotAngle = &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;SetTransform(D3DTS_WORLD, &amp;amp;yRot);&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;Clear(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, &lt;span style="color: #800080;"&gt;0x00000000&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        m_device-&amp;gt;BeginScene();&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;SetStreamSource(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, m_pyramid, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NormalVertex));&lt;br /&gt;        m_device-&amp;gt;SetFVF(NormalVertex::FVF);&lt;br /&gt;        m_device-&amp;gt;DrawPrimitive(D3DPT_TRIANGLELIST, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;EndScene();&lt;br /&gt;        m_device-&amp;gt;Present(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;(8)&amp;nbsp;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Cleanup&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中释放资源(在以后的博客中不再提示)。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;运行后效果图：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011112323402416.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;本文由&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;&amp;nbsp;原创，转载请注明博客链接，谢谢！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** 小弟初学&amp;nbsp;&lt;span style="font-family: Times New Roman;"&gt;Direct3D&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文章中如果存在错误，烦请指证，不胜感激！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;参考书籍：《&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;时间：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2011.11.23&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2261043.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/23/2261043.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/11/21/2257705.html</id><title type="text">Direct3D 初涉: 颜色</title><summary type="text">1.颜色表示在Direct3D中。颜色用RGB三元组表示。RGB数据可用两种不同的结构来保存。第一种是D3DCOLOR，它实际上与DWORD类型完全相同(由typedef定义)，共有32位。D3DCOLOR类型中各位被分成8位项(section)，每项存储了一种颜色分量的亮度值(Alpha,,R,G,B)。每项均占一个字节，所以每个分量的亮度值范围都在[0,255]区间内，接近0值表示最小值，接近255的值表示高度值。Direct3D提供了宏D3DCOLOR_ARGB帮助我们完成将颜色分量值，安插到D3DCOLOR类型的合适位置上。也可以使用D3DCOLOR_XRGB宏来代替D3DCOLOR_</summary><published>2011-11-21T13:58:00Z</published><updated>2011-11-21T13:58:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/21/2257705.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/21/2257705.html"/><content type="html">&lt;div class="Section0"&gt;&lt;h3 class="p0"&gt;1.&amp;nbsp;颜色表示&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中。颜色用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;RGB&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;三元组表示。&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;RGB&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;数据可用两种不同的结构来保存。第一种是&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DCOLOR&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，它实际上与&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DWORD&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类型完全相同&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;由&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;typedef&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;定义&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，共有&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;32&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;位。&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DCOLOR&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类型中各位被分成&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;8&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;位项&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(section)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，每项存储了一种颜色分量的亮度值&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Alpha,,R,G,B)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。每项均占一个字节，所以每个分量的亮度值范围都在&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;[0,255]&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;区间内，接近&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;值表示最小值，接近&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;255&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的值表示高度值。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;提供了宏&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172521%28v=vs.85%29.aspx"&gt;D3DCOLOR_ARGB&lt;/a&gt;&amp;nbsp;帮助我们完成将颜色分量值，安插到&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DCOLOR&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类型的合适位置上。也可以使用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DCOLOR_XRGB&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;宏来代替&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DCOLOR_ARGB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，两者很相似，&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172525%28v=vs.85%29.aspx"&gt;D3DCOLOR_XRGB&lt;/a&gt;&amp;nbsp;不接受&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Alpha&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;参数&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;将&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Alpha&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;分量设为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;0xff(255)&amp;nbsp;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中，存储颜色的数据的另一种结构是&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172520%28v=vs.85%29.aspx"&gt;D3DCOLORVALUE&amp;nbsp;&lt;/a&gt;。在该结构中，我们使用单精度浮点数来度量每个颜色分量的亮度值。亮度范围为&lt;span style="font-family: Consolas;"&gt;(0~1)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;我们可以利用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172730%28v=vs.85%29.aspx"&gt;D3DXCOLOR&lt;/a&gt;&amp;nbsp;代替&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DCOLORVALUE&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，前者不但包含了与后者相同的数据成员，而且还提供了一组有用的构造函数和重载运算符，为颜色的运算提供了便利。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;2.&amp;nbsp;顶点颜色&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;图元的颜色由构成该图元的顶点的颜色所决定。所以，我们必须为顶点数据结构添加一个表示颜色的数据成员。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;3.&amp;nbsp;着色&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在光栅化过程中，需要对多边形进行着色&lt;span style="font-family: Consolas;"&gt;(shading)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。着色规定了如何利用顶点的颜色来计算构成图元的像素的颜色。目前，我们使用两种着色模式&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(shading&amp;nbsp;mode)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(1)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;平面着色&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(flat&amp;nbsp;shading)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。每个图元的每个像素都被一致地赋予该图元的第一个顶点所指定的颜色。即使用平面着色时，如果第一个顶点是红色的，那么其他顶点的颜色值将被忽略。平面着色容易使物体呈现出&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&amp;ldquo;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;块状&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&amp;rdquo;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，这是因为各颜色之间没有平滑地过度。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;(2)&amp;nbsp;Gouraud&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;着色&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Gouraud&amp;nbsp;Shading)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。图元中个像素的颜色值由各顶点的颜色线性插值得到。各个颜色之间的平滑的过度，因此&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Gouraud&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;着色也称平滑着色&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(smooth&amp;nbsp;shading)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;4.&amp;nbsp;例程&lt;span style="font-family: Consolas;"&gt;(DrawColorTriangle)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;初涉：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;框架的搭建&lt;/span&gt;&lt;/a&gt;&amp;nbsp;的框架上添加代码。&lt;/p&gt;&lt;p class="p0"&gt;(1)&amp;nbsp;新建头文件&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;GlobalColorConstant.h&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，添加一些颜色全局常量：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#ifndef __GLOBALCOLOR_CONSTANT_H__&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __GLOBALCOLOR_CONSTANT_H__&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   WHITE  ( D3DCOLOR_XRGB(&lt;span style="color: #800080;"&gt;255&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   BLACK  ( D3DCOLOR_XRGB(  &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   RED    ( D3DCOLOR_XRGB(&lt;span style="color: #800080;"&gt;255&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   GREEN  ( D3DCOLOR_XRGB(  &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   BLUE   ( D3DCOLOR_XRGB(  &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   YELLW  ( D3DCOLOR_XRGB(&lt;span style="color: #800080;"&gt;255&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   CYAN   ( D3DCOLOR_XRGB(  &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; D3DXCOLOR   MAGENTA( D3DCOLOR_XRGB(&lt;span style="color: #800080;"&gt;255&lt;/span&gt;,   &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __GLOBALCOLOR_CONSTANT_H__ */&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;(2)&amp;nbsp;新建头文件&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;ColorVertex.h&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;添加有色顶点的结构体定义：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#ifndef __COLORVERTEX_H__&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __COLORVERTEX_H__&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; ColorVertex&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    ColorVertex(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; x, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; y, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; z, D3DCOLOR color) &lt;br /&gt;    {&lt;br /&gt;        m_x = x; m_y = y; m_z = z;&lt;br /&gt;        m_color = color;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD FVF;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;    m_x;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;    m_y; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;    m_z;&lt;br /&gt;    D3DCOLOR m_color;&lt;br /&gt;};&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __COLORVERTEX_H__ */&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;(3)&lt;span style="font-family: 宋体;"&gt;在&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3DFrame&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类中添加代码：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    D3DXMATRIX              m_worldMatrix;   &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 存储所要绘制三角形的世界变换矩阵&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    IDirect3DVertexBuffer9* m_triangle;      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 保存三角形数据的定点缓存&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p class="p0"&gt;(4)&amp;nbsp;Setup&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;方法创建了一个顶点缓存，并用所要绘制的三角形中带有颜色信息的顶点对该缓存进行填充。该三角形第&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个顶点的颜色为红色，第&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个顶点的颜色为绿色，第&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个顶点为蓝色。在本例的最后，将光照禁用。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Setup()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Create the vertex buffer.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;CreateVertexBuffer(&lt;br /&gt;        &lt;span style="color: #800080;"&gt;3&lt;/span&gt;*&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(ColorVertex),&lt;br /&gt;        D3DUSAGE_WRITEONLY,&lt;br /&gt;        ColorVertex::FVF,&lt;br /&gt;        D3DPOOL_MANAGED,&lt;br /&gt;        &amp;amp;m_triangle,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Fill the buffer with the triangle data.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    ColorVertex* v;&lt;br /&gt;    m_triangle-&amp;gt;Lock(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;**)&amp;amp;v, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    v[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = ColorVertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;2.0f&lt;/span&gt;, RED);&lt;br /&gt;    v[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = ColorVertex( &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;2.0f&lt;/span&gt;, GREEN);&lt;br /&gt;    v[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = ColorVertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;2.0f&lt;/span&gt;, BLUE);&lt;br /&gt;&lt;br /&gt;    m_triangle-&amp;gt;Unlock();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set the projection matrix.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DXMATRIX proj;&lt;br /&gt;    D3DXMatrixPerspectiveFovLH(&lt;br /&gt;        &amp;amp;proj,&lt;br /&gt;        D3DX_PI * &lt;span style="color: #800080;"&gt;0.5f&lt;/span&gt;,&lt;br /&gt;        (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_width / (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_height,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;1000.0f&lt;/span&gt;);&lt;br /&gt;    m_device-&amp;gt;SetTransform(D3DTS_PROJECTION, &amp;amp;proj);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Turn off lighting.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;SetRenderState(D3DRS_LIGHTING, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;(5)&amp;nbsp;Display&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;函数在两个不同的位置以两种不同的着色模式分别绘制&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Triangle&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。每个三角形位置由世界变换矩阵&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;World&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来控制。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Display(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m_device) { &lt;br /&gt;        m_device-&amp;gt;Clear(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, &lt;span style="color: #800080;"&gt;0xffffffff&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;BeginScene();&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;SetFVF(ColorVertex::FVF);&lt;br /&gt;        m_device-&amp;gt;SetStreamSource(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, m_triangle, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(ColorVertex));&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; draw the triangle to the left with flat shading&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        D3DXMatrixTranslation(&amp;amp;m_worldMatrix, -&lt;span style="color: #800080;"&gt;1.25f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;        m_device-&amp;gt;SetTransform(D3DTS_WORLD, &amp;amp;m_worldMatrix);&lt;br /&gt;        m_device-&amp;gt;SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);&lt;br /&gt;        m_device-&amp;gt;DrawPrimitive(D3DPT_TRIANGLELIST, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; draw the triangle to the right with gouraud shading&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        D3DXMatrixTranslation(&amp;amp;m_worldMatrix, &lt;span style="color: #800080;"&gt;1.25f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;        m_device-&amp;gt;SetTransform(D3DTS_WORLD, &amp;amp;m_worldMatrix);&lt;br /&gt;        m_device-&amp;gt;SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);&lt;br /&gt;        m_device-&amp;gt;DrawPrimitive(D3DPT_TRIANGLELIST, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;br /&gt;        m_device-&amp;gt;EndScene();&lt;br /&gt;        m_device-&amp;gt;Present(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;(6)&amp;nbsp;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Cleanup&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中释放资源&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Direct3DFrame::Cleanup()&lt;br /&gt;{&lt;br /&gt;    m_device-&amp;gt;Release();&lt;br /&gt;    m_triangle-&amp;gt;Release();&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;运行后截图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011112121571333.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;本文由&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;&amp;nbsp;原创，转载请注明博客链接，谢谢！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** 小弟初学&amp;nbsp;&lt;span style="font-family: Times New Roman;"&gt;Direct3D&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文章中如果存在错误，烦请指证，不胜感激！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;参考书籍：《&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;时间：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2011.11.21&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2257705.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/21/2257705.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/11/20/2256331.html</id><title type="text">Direct3D 初涉： Direct3D 中的绘制</title><summary type="text">1.顶点缓存和索引缓存(vertex/indexbuffer)一个顶点缓存是一个包含顶点数据的连续内存空间；一个索引缓存是包含索引数据的连续内存空间。顶点缓存和索引缓存可以被放置到显存(videomemory)中。进行绘制时，使用显存中的数据将获得比使用系统内存中的数据(Array)快得多的速度。1.1创建顶点缓存用接口IDirect3DVertexBuffer9表示，用CreateVertexBuffer创建；索引缓存用IDirect3DIndexBuffer9表示，用CreateIndexBuffer创建。*静态缓存与动态缓存创建缓存时，如果未使用标记D3DUSAGE_DYNAMIC，则称</summary><published>2011-11-20T10:21:00Z</published><updated>2011-11-20T10:21:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/20/2256331.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/20/2256331.html"/><content type="html">&lt;h3 class="p0"&gt;1.&amp;nbsp;顶点缓存和索引缓存&lt;span style="font-family: Consolas;"&gt;(vertex/index&amp;nbsp;buffer)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;一个顶点缓存是一个包含顶点数据的连续内存空间；一个索引缓存是包含索引数据的连续内存空间。顶点缓存和索引缓存可以被放置到显存&lt;span style="font-family: Consolas;"&gt;(video&amp;nbsp;memory)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中。进行绘制时，使用显存中的数据将获得比使用系统内存中的数据&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Array)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;快得多的速度。&lt;/span&gt;&lt;/p&gt;&lt;h3 class="p0"&gt;1.1&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;创建&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;顶点缓存用接口&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205915%28v=vs.85%29.aspx"&gt;IDirect3DVertexBuffer9&lt;/a&gt;&amp;nbsp;表示，用&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174364%28v=vs.85%29.aspx"&gt;CreateVertexBuffer&lt;/a&gt;&amp;nbsp;创建；索引缓存用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205865%28v=vs.85%29.aspx"&gt;IDirect3DIndexBuffer9&lt;/a&gt;&amp;nbsp;表示，用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174357%28v=vs.85%29.aspx"&gt;CreateIndexBuffer&amp;nbsp;&lt;/a&gt;&amp;nbsp;创建。&lt;/p&gt;&lt;p class="p0"&gt;*&lt;span style="font-family: 宋体;"&gt;静态缓存与动态缓存&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;创建缓存时，如果未使用标记&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DUSAGE_DYNAMIC&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，则称所创建的缓存为静态缓存&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(static&amp;nbsp;buffer)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。静态缓存一般被放置在显存中，以保证存储于其中的数据得到最高效的处理。然而，静态缓存是以牺牲对静态缓存读写操作的速度为代价的，这是因为访问显存的速度本身就很慢。基于上述原因，我们用静态缓存来存储静态数据&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;那些不需要经常修改或访问的数据&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。静态缓存必须在应用程序初始化时用几何体的数据进行填充。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;创建缓存时，如果使用了标记&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DUSAGE_DYNAMIC&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，&amp;nbsp;则称所创建的缓存为动态缓存&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(dynamic&amp;nbsp;buffer)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。动态缓存一般放置在&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;AGP(&lt;/span&gt;Accelerated&amp;nbsp;Graphics&amp;nbsp;Port)&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;存储区中，其内容可被迅速更新。动态缓存中数据的处理速度不像静态缓存那样快，这是因为在绘制之前数据必须传输到显存中。但动态缓存的突出优点是其更新速度相当快&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;快速的&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;CPU&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;写操作&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。所以，如果您需要频繁更新缓存中的内容，该缓存应设置为动态的。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;对显存和&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;AGP&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;存储区进行读操作非常慢。所以，如果您需要在程序中运行时读取几何数据，最好在系统内存中保留一份副本，然后需要时对其进行读操作。&lt;/span&gt;&lt;/p&gt;&lt;h4 class="p0"&gt;1.2&lt;span style="font-family: 宋体;"&gt;访问顶点缓存&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;使用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205917%28v=vs.85%29.aspx"&gt;Lock&lt;/a&gt;&amp;nbsp;方法来获取指向缓存内容的指针。访问完毕之后，必须对缓存进行解锁&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205918%28v=vs.85%29.aspx"&gt;unlock&lt;/a&gt;)&lt;span style="font-family: 宋体;"&gt;操作。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 class="p0"&gt;1.3&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;获取顶点缓存和索引缓存的信息&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;使用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205916%28v=vs.85%29.aspx"&gt;GetDesc&lt;/a&gt;&amp;nbsp;方法来获取顶点缓存&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172629%28v=vs.85%29.aspx"&gt;D3DVERTEXBUFFER_DESC&lt;/a&gt;)&lt;span style="font-family: 宋体;"&gt;和索引缓存&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172563%28v=vs.85%29.aspx"&gt;D3DINDEXBUFFER_DESC&lt;/a&gt;)&lt;span style="font-family: 宋体;"&gt;的信息。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;2.&amp;nbsp;绘制状态&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;绘制状态&lt;span style="font-family: Consolas;"&gt;(render&amp;nbsp;state)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，几何体的绘制方式。使用&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174454%28v=vs.85%29.aspx"&gt;SetRenderState&lt;/a&gt;&amp;nbsp;来指定绘制状态。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;3.&amp;nbsp;绘制的准备工作&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;3.1&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;指定数据流输入源。将顶点缓存和数据流进行链接，实质上是将几何体的信息传输到绘制流水线中。使用&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174459%28v=vs.85%29.aspx"&gt;SetStreamSource&lt;/a&gt;&amp;nbsp;方法来设置输入源。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;3.2&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;设置顶点格式。指定&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/bb174433.aspx"&gt;SetFVF&lt;/a&gt;)&lt;span style="font-family: 宋体;"&gt;后续绘制调用中使用的顶点格式。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;3.3&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;设置索引缓存。如果我们想使用索引缓存，必须对后续绘制操作中所要使用的索引缓存进行设置&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174435%28v=vs.85%29.aspx"&gt;SetIndices&lt;/a&gt;)&lt;span style="font-family: 宋体;"&gt;。任意时刻只允许使用一个索引缓存，索引如果您要用一个不同的索引缓存绘制物体时，必须进行切换。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;4.&amp;nbsp;使用顶点缓存和索引缓存进行绘制&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;使用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174371%28v=vs.85%29.aspx"&gt;DrawPrimitive&lt;/a&gt;&amp;nbsp;或&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174369%28v=vs.85%29.aspx"&gt;DrawIndexedPrimitive&lt;/a&gt;&amp;nbsp;方法将待绘制几何体的信息通过绘制流水线传输。这两个方法从顶点数据流中获取顶点信息，并从当前设定的索引缓存中提取索引信息。所有的绘制方法都必须在&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174350%28v=vs.85%29.aspx"&gt;BeginScene&lt;/a&gt;&amp;nbsp;和&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174375%28v=vs.85%29.aspx"&gt;EndScene&lt;/a&gt;&amp;nbsp;构成的方法对之间进行调用。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 class="p0"&gt;5.&amp;nbsp;D3DX&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;几何体&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;在代码中通过创建三角形单元来构建&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物体是非常繁琐的。&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DX&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;库提供了一些用于生成简单&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;几何体的网格数据的方法。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172752%28v=vs.85%29.aspx"&gt;D3DXCreateBox&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172795%28v=vs.85%29.aspx"&gt;D3DXCreateSphere&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172762%28v=vs.85%29.aspx"&gt;D3DXCreateCylinder&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172798%28v=vs.85%29.aspx"&gt;D3DXCreateTeapot&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172785%28v=vs.85%29.aspx"&gt;D3DXCreatePolygon&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172785%28v=vs.85%29.aspx"&gt;D3DXCreateTorus&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;这六个方法类似，都使用了&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DX&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;网格数据结构&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174069%28v=vs.85%29.aspx"&gt;ID3DXMesh&lt;/a&gt;&amp;nbsp;和&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205753%28v=vs.85%29.aspx"&gt;ID3DXBuffer&lt;/a&gt;&amp;nbsp;接口。使用这些方法生成网格数据后，用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205736%28v=vs.85%29.aspx"&gt;DrawSubSet&lt;/a&gt;&amp;nbsp;函数对其进行绘制。网格使用完毕后必须进行释放&lt;span style="font-family: Consolas;"&gt;(Release)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;h3 class="p0"&gt;6.&amp;nbsp;例程&lt;span style="font-family: Consolas;"&gt;(DrawCube)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;例程框架请看：&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;初涉：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;框架的搭建&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3DFrame&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类中添加两个变量，保存立方体的顶点和索引数据：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;IDirect3DVertexBuffer9*&amp;nbsp;&amp;nbsp;m_vb;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;顶点缓存&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;IDirect3DIndexBuffer9*&amp;nbsp;&amp;nbsp;&amp;nbsp;m_ib;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;索引缓存&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;在构造函数中初始化为空：&lt;/p&gt;&lt;p class="p0"&gt;this-&amp;gt;m_vb&amp;nbsp;=&amp;nbsp;NULL;&lt;/p&gt;&lt;p class="p0"&gt;this-&amp;gt;m_ib&amp;nbsp;=&amp;nbsp;NULL;&lt;/p&gt;&lt;p class="p0"&gt;定义顶点结构和该结构的灵活顶点格式。添加一个新文件&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Vertex.h&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文件内容如下：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#ifndef __VERTEX_H__&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __VERTEX_H__&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; Vertex&lt;br /&gt;{&lt;br /&gt;    Vertex(){}&lt;br /&gt;    Vertex(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; x, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; y, &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; z)&lt;br /&gt;    {&lt;br /&gt;        m_x = x;  &lt;br /&gt;        m_y = y;  &lt;br /&gt;        m_z = z;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; m_x;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; m_y;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; m_z;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD FVF;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; DWORD Vertex::FVF = D3DFVF_XYZ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __VERTEX_H_ */&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Setup&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;函数中创建顶点缓存和索引缓存，然后对缓存进行锁定，将构成立方体的顶点数据以及构成立方体的三角形单元的索引数据分别写入顶点缓存和索引缓存。然后将摄像机沿&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Z&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;轴负方向平移几个单位，以使绘制在世界坐标系原点的立方体处于摄像机的视场内。然后再实施投影变换。最终，将填充模式的绘制状态设为线框模式。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Setup()&lt;br /&gt;{&lt;br /&gt;    m_device-&amp;gt;CreateVertexBuffer(&lt;br /&gt;        &lt;span style="color: #800080;"&gt;8&lt;/span&gt; * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(Vertex), &lt;br /&gt;        D3DUSAGE_WRITEONLY,&lt;br /&gt;        Vertex::FVF,&lt;br /&gt;        D3DPOOL_MANAGED,&lt;br /&gt;        &amp;amp;m_vb,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    m_device-&amp;gt;CreateIndexBuffer(&lt;br /&gt;        &lt;span style="color: #800080;"&gt;36&lt;/span&gt; * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(WORD),&lt;br /&gt;        D3DUSAGE_WRITEONLY,&lt;br /&gt;        D3DFMT_INDEX16,&lt;br /&gt;        D3DPOOL_MANAGED,&lt;br /&gt;        &amp;amp;m_ib,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; define unique vertices:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    Vertex* vertices;&lt;br /&gt;    m_vb-&amp;gt;Lock(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;**)&amp;amp;vertices, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; vertices of a unit cube&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    vertices[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = Vertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = Vertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = Vertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = Vertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] = Vertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;] = Vertex(-&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] = Vertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;    vertices[&lt;span style="color: #800080;"&gt;7&lt;/span&gt;] = Vertex( &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,  &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    m_vb-&amp;gt;Unlock();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; define the triangles of the cube:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    WORD* indices = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    m_ib-&amp;gt;Lock(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;**)&amp;amp;indices, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; front side&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; back side&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;7&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;8&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;9&lt;/span&gt;]  = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;7&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;11&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; left side&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;12&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;13&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;14&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;15&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;17&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; right side&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;18&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;19&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;20&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;21&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;22&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;23&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;7&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; top&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;25&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;26&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;27&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;28&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;29&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; bottom&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    indices[&lt;span style="color: #800080;"&gt;30&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;31&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;    indices[&lt;span style="color: #800080;"&gt;33&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;34&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; indices[&lt;span style="color: #800080;"&gt;35&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;7&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    m_ib-&amp;gt;Unlock();&lt;br /&gt;&lt;br /&gt;    D3DXVECTOR3 position(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;5.0f&lt;/span&gt;);&lt;br /&gt;    D3DXVECTOR3 target(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    D3DXVECTOR3 up(&lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;);&lt;br /&gt;    D3DXMATRIX v;&lt;br /&gt;    D3DXMatrixLookAtLH(&amp;amp;v, &amp;amp;position, &amp;amp;target, &amp;amp;up);&lt;br /&gt;&lt;br /&gt;    m_device-&amp;gt;SetTransform(D3DTS_VIEW, &amp;amp;v);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set the projection matrix.&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;    D3DXMATRIX proj;&lt;br /&gt;    D3DXMatrixPerspectiveFovLH(&lt;br /&gt;            &amp;amp;proj,&lt;br /&gt;            D3DX_PI * &lt;span style="color: #800080;"&gt;0.5f&lt;/span&gt;, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 90 - degree&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_width / (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)m_height,&lt;br /&gt;            &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: #800080;"&gt;1000.0f&lt;/span&gt;);&lt;br /&gt;    m_device-&amp;gt;SetTransform(D3DTS_PROJECTION, &amp;amp;proj);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Switch to wireframe mode.&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;    m_device-&amp;gt;SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Display&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;方法有两项任务：更新场景和绘制场景。想让立方体旋转起来，必须在程序生成的每帧图像中给旋转角一定的增量，从而指定立方体的旋转方式。通过更新每帧图像中立方体的角度，立方体在每帧图像中被微微地旋转，从而产生转动的视觉效果。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Display(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m_device) { &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; spin the cube:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;        D3DXMATRIX rx, ry;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; rotate 45 degrees on x-axis&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        D3DXMatrixRotationX(&amp;amp;rx, &lt;span style="color: #800080;"&gt;3.14f&lt;/span&gt; / &lt;span style="color: #800080;"&gt;4.0f&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; incremement y-rotation angle each frame&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        D3DXMatrixRotationY(&amp;amp;ry, m_yRotAngle);&lt;br /&gt;        m_yRotAngle += timeDelta;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; reset angle to zero when angle reaches 2*PI&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( m_yRotAngle &amp;gt;= &lt;span style="color: #800080;"&gt;6.28f&lt;/span&gt; ) {&lt;br /&gt;            m_yRotAngle = &lt;span style="color: #800080;"&gt;0.0f&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; combine x- and y-axis rotation transformations.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        D3DXMATRIX p = rx * ry;&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;SetTransform(D3DTS_WORLD, &amp;amp;p);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; draw the scene:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;        m_device-&amp;gt;Clear(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, &lt;span style="color: #800080;"&gt;0xffffffff&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        m_device-&amp;gt;BeginScene();&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;SetStreamSource(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, m_vb, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(Vertex));&lt;br /&gt;        m_device-&amp;gt;SetIndices(m_ib);&lt;br /&gt;        m_device-&amp;gt;SetFVF(Vertex::FVF);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Draw cube.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        m_device-&amp;gt;DrawIndexedPrimitive(D3DPT_TRIANGLELIST, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;8&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;12&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        m_device-&amp;gt;EndScene();&lt;br /&gt;        m_device-&amp;gt;Present(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;m_yRotAngle 表示旋转角度，在 Direct3DFrame 中添加定义，在构造函数中初始化为 0.0f 。&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Cleanup&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中添加内存清理：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_vb-&amp;gt;Release();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m_ib-&amp;gt;Release();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m_device-&amp;gt;Release();&lt;/p&gt;&lt;p class="p0"&gt;运行效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011112018182943.jpg" alt="" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;本文由&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;&amp;nbsp;原创，转载请注明博客链接，谢谢！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** 小弟初学&amp;nbsp;&lt;span style="font-family: Times New Roman;"&gt;Direct3D&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文章中如果存在错误，烦请指证，不胜感激！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;参考书籍：《&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;时间：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2011.11.20&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2256331.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/20/2256331.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/11/15/2250420.html</id><title type="text">Direct3D 初涉：绘制流水线</title><summary type="text">绘制流水线(renderingpipeline)：从3D场景到2D场景，必须实施的一系列运算。局部坐标系-&gt;世界坐标系-&gt;观察坐标系-&gt;背面消隐-&gt;光照-&gt;裁剪-&gt;投影-&gt;视口坐标系-&gt;光栅化1.局部坐标系(localspace)局部坐标系(localspace)或者建模坐标系(modelingspace)，是用于建立构成物体的三角形单元列表的坐标系。采用局部坐标系的优势体现在它可以简化建模过程。个人理解：局部坐标系即以物体本身建模，假如你要为一个茶壶建模，那么局部坐标系的原点可以为茶壶中心；再如你要为一个球体建模，那么局部坐标系的原点可以为球的</summary><published>2011-11-15T14:46:00Z</published><updated>2011-11-15T14:46:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/15/2250420.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/15/2250420.html"/><content type="html">&lt;div class="Section0"&gt;&lt;p class="p0"&gt;绘制流水线(rendering&amp;nbsp;pipeline)&lt;span style="font-family: 宋体;"&gt;：从&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;场景到&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;场景，必须实施的一系列运算。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;局部坐标系&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;世界坐标系&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;观察坐标系&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;背面消隐&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;光照&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;裁剪&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;投影&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;视口坐标系&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;光栅化&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;1.&amp;nbsp;局部坐标系(local&amp;nbsp;space)&lt;/p&gt;&lt;p class="p0"&gt;局部坐标系(local&amp;nbsp;space)或者建模坐标系(modeling&amp;nbsp;space)，是用于建立构成物体的三角形单元列表的坐标系。采用局部坐标系的优势体现在它可以简化建模过程。&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;个人理解：局部坐标系即以物体本身建模，假如你要为一个茶壶建模，那么局部坐标系的原点可以为茶壶中心；再如你要为一个球体建模，那么局部坐标系的原点可以为球的中心。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;2.&amp;nbsp;世界坐标系&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;(world&amp;nbsp;space)&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;将所有建立在局部坐标系上的物体组织在一起构成世界坐标系。将局部坐标系变换到世界坐标系中，称为世界变换&lt;span style="font-family: Consolas;"&gt;(world&amp;nbsp;transform)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;通过&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174463%28v=vs.85%29.aspx"&gt;IDirect3DDevice9::SetTransform&lt;/a&gt;&amp;nbsp;方法进行变换。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;3.&amp;nbsp;观察坐标系&lt;/p&gt;&lt;p class="p0"&gt;为了简化运算，我们将摄像头变换至世界坐标系的原点，并将其旋转，使摄像机的光轴与世界坐标系&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;z&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;轴方向一致。&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个人理解：也就是相当于人站在坐标原点向&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;z&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;轴方向看&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这种变换称为取景变换&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(view&amp;nbsp;space&amp;nbsp;transformation)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，变换后的几何体位于观察坐标系&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(view&amp;nbsp;space)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;由&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205342%28v=vs.85%29.aspx"&gt;D3DXMatrixLookAtLH&lt;/a&gt;&amp;nbsp;函数计算得到。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;4.&amp;nbsp;背面消隐&lt;/p&gt;&lt;p class="p0"&gt;每个多边形都有两个侧面，其中一个侧面标记为正面&lt;span style="font-family: Consolas;"&gt;(front&amp;nbsp;side)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，另一个侧面标记为背面&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(back&amp;nbsp;side)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。通常多边形的背面是不可见的，这是由于场景中的多数物体都是封闭体。正面朝向的多边形称为正面朝向&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(front&amp;nbsp;facing)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;多边形，正面偏离摄像机的多边形称为背面朝向&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(back&amp;nbsp;facing)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;多边形。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;正面朝向多边形遮挡了位于其后面的背面朝向多边形。&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;利用这一点将背面朝向的多边形加以剔除，这称为背面消隐。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;为了实现背面消隐，&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;需要区分哪些多边形是正面朝向的，哪些多边形是背面朝向的。默认状态下，&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;认为顶点排列顺序为顺时针&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;观察坐标系中&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的三角形单元是正面朝向的，顶点排列顺序是逆时针&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;观察坐标系中&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的三角形单元式背面朝向的。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;如果由于某些原因默认的消隐方式不能满足应用的要求，我们可通过修改绘制状态&lt;span style="font-family: Consolas;"&gt;(render&amp;nbsp;state)&amp;nbsp;D3DRS_CULLMODE&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来达到目的。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;5.&amp;nbsp;光照&lt;/p&gt;&lt;p class="p0"&gt;光源是在世界坐标系中定义的，但必须经过取景变换至观察坐标系方可使用。在观察坐标系中，光源照亮了场景中的物体，从而可以获得较为逼真的显示效果。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;6.&amp;nbsp;裁剪&lt;/p&gt;&lt;p class="p0"&gt;将位于视域体以外的几何体剔除掉，这个过程称为裁剪&lt;span style="font-family: Consolas;"&gt;(clipping)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。个人理解：类似于用人的眼睛看外界事物，有些物体可以完全被看见&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;我面前的显示器&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，有些物体完全看不见&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;我背后的门&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，有些物体可以看到一部分&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;我右边的床，我只能看到床头&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;7.&amp;nbsp;投影&lt;/p&gt;&lt;p class="p0"&gt;在观察坐标系中，我们的任务是获取&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;场景的&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;表示。从&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;n&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;维变换为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;n-1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;维的过程称为投影。实现投影的方式有很多，我们只对其中一种感兴趣，即透视投影&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(perspective&amp;nbsp;projection)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。透视投影会产生&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&amp;ldquo;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;透视缩短&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&amp;rdquo;(foreshortenning)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的视觉效果，即近大远小。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;使用&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb205350%28v=vs.85%29.aspx"&gt;D3DXMatrixPerspectiveFovLH&lt;/a&gt;&amp;nbsp;来创建一个投影矩阵。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;8.&amp;nbsp;视口变换&lt;/p&gt;&lt;p class="p0"&gt;视口变换&lt;span style="font-family: Consolas;"&gt;(view&amp;nbsp;port&amp;nbsp;transform)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的任务是将顶点坐标从投影窗口转换到屏幕的一个矩形区域，该矩形区域称为视口&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(viewport)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。个人理解：视口就是电脑桌面上的窗体而已。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;，视口用结构&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172632%28v=vs.85%29.aspx"&gt;D3DVIEWPORT9&amp;nbsp;&lt;/a&gt;来表示。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;9.&amp;nbsp;光栅化&lt;/p&gt;&lt;p class="p0"&gt;顶点坐标变换为屏幕坐标后，我们就有了一个&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;2D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;三角形单元的列表。光栅化&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(rasterization)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的任务是为了绘制每个三角形单元，如何计算构成三角形单元的每个像素的颜色值。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;光栅化过程的计算量非常大，我们应借助专用图形卡的加速功能。光栅化的最终结果是现实屏幕上的一幅&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;2D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;图像。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;本文由&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;&amp;nbsp;原创，转载请注明博客链接，谢谢！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** 小弟初学&amp;nbsp;&lt;span style="font-family: Times New Roman;"&gt;Direct3D&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文章中如果存在错误，烦请指证，不胜感激！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;参考书籍：《&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;时间：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2011.11.15&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2250420.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/11/15/2250420.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html</id><title type="text">Direct3D 初涉： Direct3D 框架的搭建</title><summary type="text">《DirectX9.03D游戏开发编程基础》一书中在第II部分第一章初始化Direct3D中提供了一个DirectX框架（所谓框架，只是一个支撑，在这个支撑下，可以添加代码实现相应的操作），但是整体感觉比较乱（不知道您是否有这种感觉？）。我将Direct3D初始化、资源设置与清除、显示等操作全部封装到一个类中，希望可以让代码不再杂乱，便于理解。Direct3D的初始化过程可分解为如下步骤：（1）获取接口IDirect3D9的指针。该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevce9，该接口是一个C++对象，代表了我们用来显示3D图形的物理硬件设备。（2）检查设备性能（</summary><published>2011-10-27T16:22:00Z</published><updated>2011-10-27T16:22:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html"/><content type="html">&lt;p class="p0"&gt;《&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;一书中在第&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;II&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;部分&amp;nbsp;第一章&amp;nbsp;初始化&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中提供了一个&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;框架（所谓框架，只是一个支撑，在这个支撑下，可以添加代码实现相应的操作），但是整体感觉比较乱（不知道您是否有这种感觉？）。我将&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;初始化、资源设置与清除、显示等操作全部封装到一个类中，希望可以让代码不再杂乱，便于理解。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;Direct3D&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;的初始化过程可分解为如下步骤：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;（1）&amp;nbsp;获取接口&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;IDirect3D9&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的指针。该接口用于获取系统中物理硬件设备的信息并创建接口&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;IDirect3DDevce9&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，该接口是一个&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;C++&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对象，代表了我们用来显示&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;图形的物理硬件设备。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;（2）&amp;nbsp;检查设备性能（&lt;span style="font-family: Consolas;"&gt;D3DCAPS9&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;），判断主显卡（&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;primary&amp;nbsp;display&amp;nbsp;adapter&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;或者&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;primary&amp;nbsp;graphics&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）是否支持硬件顶点运算。为了创建接口&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;IDirect3DDevice9&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，我们必须明确显卡是否支持该功能。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;（3）&amp;nbsp;初始化&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DPRESENT_PARAMETERS&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;结构的一个实例。该结构由许多数据成员组成，我们可以通过这些变量来指定即将创建接口&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;IDirect3DDevice9&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的特性。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;（4）&amp;nbsp;利用已初始化的&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DPRESENT_PARAMETER&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;结构创建&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;IDirect3DDevice9&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对象（一个&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;C++&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对象代表了我们用来显示&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;图形的物理硬件设备）。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;源代码分为三个文件：&lt;span style="font-family: Consolas;"&gt;Direct3DFrame&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类的头文件&lt;/span&gt;(Direct3DFrame.h)与源文件(Direct3DFrame.cpp)，WinMain&lt;span style="font-family: 宋体;"&gt;所在源文件&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(WinMain.cpp)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。以下是代码：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; file.Direct3DFrame.h&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; once&lt;br /&gt;#include &amp;lt;d3d9.h&amp;gt;&lt;br /&gt;#include &amp;lt;d3dx9.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; comment(lib, "d3d9.lib")&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; comment(lib, "d3dx9.lib")&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; comment(lib, "winmm.lib")&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Direct3D 框架类，完成 Direct3D 的初始化等操作&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Direct3DFrame&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    Direct3DFrame(&lt;br /&gt;        LPCWSTR   wndName,&lt;br /&gt;        HINSTANCE hInstance,&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; width, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; height,&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; windowed,&lt;br /&gt;        D3DDEVTYPE deviceType);&lt;br /&gt;&lt;br /&gt;    ~Direct3DFrame(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; InitD3D();&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Setup() 设置资源，Cleanup() 清除资源&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Setup();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Cleanup();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Display(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, &lt;br /&gt;        WPARAM wParam, LPARAM lParam);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; EnterMsgLoop();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; CreateWin32Window(HWND&amp;amp; hWnd);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;:&lt;br /&gt;    LPCWSTR       m_wndName;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口名称&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    HINSTANCE     m_hInstance;  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 应用程序实例句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;           m_width;      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 后台缓冲大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;           m_height;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;          m_windowed;   &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口模式 (true) 或者全屏模式 (false)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DDEVTYPE    m_deviceType; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; HAL or REF&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    IDirect3DDevice9* m_device;&lt;br /&gt;};&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; file. Direct3DFrame.cpp&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;#include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct3DFrame.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Direct3DFrame::Direct3DFrame(&lt;br /&gt;            LPCWSTR   wndName,&lt;br /&gt;            HINSTANCE hInstance,&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; width, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; height,&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; windowed,&lt;br /&gt;            D3DDEVTYPE deviceType)&lt;br /&gt;{&lt;br /&gt;    m_wndName      = wndName;&lt;br /&gt;    m_hInstance    = hInstance;&lt;br /&gt;    m_width        = width;&lt;br /&gt;    m_height       = height;&lt;br /&gt;    m_windowed     = windowed;&lt;br /&gt;    m_deviceType   = deviceType;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;-&amp;gt;m_device = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Direct3DFrame::~Direct3DFrame(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::InitD3D()&lt;br /&gt;{&lt;br /&gt;    HWND hWnd;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!CreateWin32Window(hWnd)) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ---- Init D3D:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;br /&gt;    HRESULT hr = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Step 1: Create the IDirect3D9 object.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; IDirect3D9 用途: &lt;br /&gt;     *  (1) 设置枚举 ( device enumeration ) &lt;br /&gt;     *      -&amp;gt;指获取系统中可用的每块图形卡的性能、显示模式(display mode)、格式及其他信息&lt;br /&gt;     *  (2) 创建 IDirect3DDevice9 类型&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    IDirect3D9* d3d9 = NULL;&lt;br /&gt;    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!d3d9) {&lt;br /&gt;        ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct3DCreate9() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Step 2: Check for hardare vp.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DCAPS9 caps;&lt;br /&gt;    d3d9-&amp;gt;GetDeviceCaps(D3DADAPTER_DEFAULT, m_deviceType, &amp;amp;caps);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; vp = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (caps.DevCaps &amp;amp; D3DDEVCAPS_HWTRANSFORMANDLIGHT) {&lt;br /&gt;        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Step3 : Fill out the D3DPRESENT_PARAMETERS structure.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    D3DPRESENT_PARAMETERS d3dpp;&lt;br /&gt;    d3dpp.BackBufferWidth  = m_width;&lt;br /&gt;    d3dpp.BackBufferHeight = m_height;&lt;br /&gt;    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;&lt;br /&gt;    d3dpp.BackBufferCount  = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    d3dpp.MultiSampleType  = D3DMULTISAMPLE_NONE;&lt;br /&gt;    d3dpp.MultiSampleQuality = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;&lt;br /&gt;    d3dpp.hDeviceWindow    = hWnd;&lt;br /&gt;    d3dpp.Windowed         = m_windowed;&lt;br /&gt;    d3dpp.EnableAutoDepthStencil = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;    d3dpp.Flags                  = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;&lt;br /&gt;    d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Step 4: Create the device.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    hr = d3d9-&amp;gt;CreateDevice(&lt;br /&gt;        D3DADAPTER_DEFAULT, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; primary adapter&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        m_deviceType,      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; device type&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        hWnd,              &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; window assocated with device&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        vp,                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; vertex processing&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &amp;amp;d3dpp,            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; present parameters&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &amp;amp;m_device);        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; return created device&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (FAILED(hr)) {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; try again using a 16-bit depth buffer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;&lt;br /&gt;        hr = d3d9-&amp;gt;CreateDevice(&lt;br /&gt;            D3DADAPTER_DEFAULT,&lt;br /&gt;            m_deviceType,&lt;br /&gt;            hWnd,&lt;br /&gt;            vp,&lt;br /&gt;            &amp;amp;d3dpp,&lt;br /&gt;            &amp;amp;m_device);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (FAILED(hr)) {&lt;br /&gt;            d3d9-&amp;gt;Release();&lt;br /&gt;            ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CreateDevice() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    d3d9-&amp;gt;Release();  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; done with d3d9 object&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK Direct3DFrame::WndProc(HWND hWnd, UINT msg, &lt;br /&gt;    WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;(msg)&lt;br /&gt;    {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; WM_DESTROY:&lt;br /&gt;        ::PostQuitMessage(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; WM_KEYDOWN:&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (wParam == VK_ESCAPE)&lt;br /&gt;            ::DestroyWindow(hWnd);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ::DefWindowProc(hWnd, msg, wParam, lParam);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::CreateWin32Window(HWND&amp;amp; hWnd)&lt;br /&gt;{&lt;br /&gt;    WNDCLASS wc;&lt;br /&gt;    wc.style       = CS_HREDRAW | CS_VREDRAW;&lt;br /&gt;    wc.lpfnWndProc = (WNDPROC)WndProc;&lt;br /&gt;    wc.cbClsExtra  = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    wc.cbWndExtra  = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    wc.hInstance   = m_hInstance;&lt;br /&gt;    wc.hIcon       = LoadIcon(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, IDI_APPLICATION);&lt;br /&gt;    wc.hCursor     = LoadCursor(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, IDC_ARROW);&lt;br /&gt;    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);&lt;br /&gt;    wc.lpszMenuName  = NULL;&lt;br /&gt;    wc.lpszClassName = m_wndName;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!RegisterClass(&amp;amp;wc)) {&lt;br /&gt;        ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;RegisterClass() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    hWnd = ::CreateWindow(m_wndName, m_wndName, &lt;br /&gt;        WS_OVERLAPPEDWINDOW^WS_MAXIMIZEBOX , &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, m_width, m_height,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, m_hInstance, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!hWnd) {&lt;br /&gt;        ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CreateWindow() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ::ShowWindow(hWnd, SW_SHOW);&lt;br /&gt;    ::UpdateWindow(hWnd);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Display(&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m_device) { &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Instruct the device to set each pixel on the back buffer black - &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; D3DCLEAR_TARGET: 0x00000000 (black) - and to set each pixel on&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; the depth buffer to a value of 1.0 - D3DCLEAR_ZBUFFER: 1.0f&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        m_device-&amp;gt;Clear(&lt;br /&gt;            &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; pRect 数组中矩形数目&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,   &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 所要执行清除操作的屏幕矩形数组，选择性清除区域&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 指定要清除的表面&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;0x00000000&lt;/span&gt;, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 指定将绘制目标设置为何种颜色&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;1.0f&lt;/span&gt;,       &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 深度缓存所要设置的值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 模板缓存所要设定的值&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 提交后台缓存&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        m_device-&amp;gt;Present(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Direct3DFrame::EnterMsgLoop()&lt;br /&gt;{&lt;br /&gt;    MSG msg;&lt;br /&gt;    ::ZeroMemory(&amp;amp;msg, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(MSG));&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; lastTime = (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)timeGetTime();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (msg.message != WM_QUIT) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (::PeekMessage(&amp;amp;msg, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, PM_REMOVE)) {&lt;br /&gt;            ::TranslateMessage(&amp;amp;msg);&lt;br /&gt;            ::DispatchMessage(&amp;amp;msg);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; currTime = (&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;)timeGetTime();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt; timeDelta = (currTime - lastTime)*&lt;span style="color: #800080;"&gt;0.001f&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;-&amp;gt;Display(timeDelta);&lt;br /&gt;            lastTime = currTime;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; msg.wParam;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Direct3DFrame::Setup()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Direct3DFrame::Cleanup()&lt;br /&gt;{&lt;br /&gt;    m_device-&amp;gt;Release();&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; file.WinMain.cpp&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct3DFrame.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; WINAPI WinMain(HINSTANCE hInstance,&lt;br /&gt;                   HINSTANCE prevInstance,&lt;br /&gt;                   PSTR cmdLine,&lt;br /&gt;                   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; showCmd)&lt;br /&gt;{&lt;br /&gt;    Direct3DFrame d3dFrame(TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct3DFrame&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), hInstance,&lt;br /&gt;        &lt;span style="color: #800080;"&gt;640&lt;/span&gt;, &lt;span style="color: #800080;"&gt;480&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, D3DDEVTYPE_HAL);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!d3dFrame.InitD3D()) {&lt;br /&gt;        ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;InitD3D() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!d3dFrame.Setup()) {&lt;br /&gt;        ::MessageBox(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, TEXT(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Setup() - FAILED&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    d3dFrame.EnterMsgLoop();&lt;br /&gt;    d3dFrame.Cleanup();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;运行后截图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011102800175966.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;知识点：&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;1.&amp;nbsp;HAL&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;与&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;REF&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;（&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;和图形设备之间的中间环节）&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;HAL(Hardware&amp;nbsp;Abstraction&amp;nbsp;Layer&lt;span style="font-family: 宋体;"&gt;，硬件抽象层&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，指示设备完成某些操作的设备相关的代码集，按照这种方式，&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;就可不必了解设备的具体细节，其规范（&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;specification&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）的制定便可独立于具体的硬件。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;REF(Reference&amp;nbsp;Rasterizer&amp;nbsp;Deivce)&lt;span style="font-family: 宋体;"&gt;，以软件运算的方式完全支持&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;API&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。借助&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;REF&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备，可在代码中使用那些不为当前硬件所支持的特性，并对这些特性进行测试。&lt;/span&gt;REF&amp;nbsp;&lt;span style="font-family: 宋体;"&gt;速度十分缓慢，在测试以外的其他场合都很不实用。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;在程序代码中，使用&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;D3DDEVTYPE&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;枚举类型来标识&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;HAL&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备与&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;REF&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备。&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;HAL&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备使用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DDEVTYPE_HAL&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;REF&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;D3DDEVTYPE_REF&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来指定。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;2.&amp;nbsp;顶点运算、检验硬件顶点运算&lt;/p&gt;&lt;p class="p0"&gt;在&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;Direct3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中，可用两种不同的方式进行顶点运算&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(Vertex&amp;nbsp;Processing),&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;即软件顶点运算&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(software&amp;nbsp;vertex&amp;nbsp;process)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;和硬件顶点运算&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;(hardare&amp;nbsp;vertex&amp;nbsp;processing)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。软件顶点运算总是会被支持的，所以总是可以使用的。而硬件顶点运算只有得到图形卡的支持方可使用。应该优先使用硬件顶点运算，因为如果使用硬件专有的加速功能，程序的执行速度将会比软件运算方式快得多。而且，在硬件中进行顶点运算，可以不占用资源，也就意味着&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;CPU&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;可被解放出来进行其他运算。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;创建一个代表主显卡的&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;IDirect3DDevice9&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;类型对象时，必须指定使用该对象进行顶点运算的类型。如果可以，我们希望使用硬件顶点运算，但是由于并非所有的显卡都支持硬件顶点运算，我们必须首先检查图形卡是否支持该类型的运算。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;使用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174320%28v=vs.85%29.aspx"&gt;GetDeviceCaps&amp;nbsp;&lt;/a&gt;方法来检查设备性能。&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;3.&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb172588%28v=vs.85%29.aspx"&gt;D3DPRESENT_PARAMETERS&lt;/a&gt;&amp;nbsp;结构&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;4.&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb174352%28v=vs.85%29.aspx"&gt;IDirect3DDevice9::Clear&lt;/a&gt;&amp;nbsp;方法&lt;/p&gt;&lt;/div&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;本文由&amp;nbsp;&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;&amp;nbsp;原创，转载请注明博客链接，谢谢！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** 小弟初学&amp;nbsp;&lt;span style="font-family: Times New Roman;"&gt;Direct3D&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，文章中如果存在错误，烦请指证，不胜感激！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;参考书籍：《&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;DirectX&amp;nbsp;9.0&amp;nbsp;3D&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏开发编程基础》&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #ff0000;"&gt;** &lt;span style="font-family: 宋体;"&gt;时间：&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;2011.10.28&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span style="color: #008000;"&gt;/*******************************************************/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2227180.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/28/2227180.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/10/11/2207790.html</id><title type="text">Direct3D 初涉： 必备的数学基础</title><summary type="text">1. 齐次坐标 齐次坐标的理解——BigCoder2. 为什么Direct3D要采用四维坐标？矩阵运算------四维齐次空间 —— Guymon3. 向量的数量积与向量积 数量积 向量积未完待续……/*******************************************************/* 本文由 独酌逸醉 整理，部分内容来源于互联网* 转载请注明博客链接，谢谢！ * 时间：2011.10.10/*******************************************************/</summary><published>2011-10-11T13:31:00Z</published><updated>2011-10-11T13:31:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/11/2207790.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/11/2207790.html"/><content type="html">&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;1. 齐次坐标&lt;/span&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;&lt;a href="http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html"&gt; 齐次坐标的理解&amp;mdash;&amp;mdash;BigCoder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;2. 为什么Direct3D要采用四维坐标？&lt;/span&gt;&lt;span class="link_title"&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;&lt;a href="http://blog.csdn.net/rabbitguiming/article/details/3964140" title="矩阵运算------四维齐次空间"&gt;矩阵运算------四维齐次空间 &amp;mdash;&amp;mdash; Guymon&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;3. 向量的数量积与向量积&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;   &lt;a href="http://zh.wikipedia.org/wiki/%E6%95%B0%E9%87%8F%E7%A7%AF"&gt;数量积&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana,geneva; font-size: 16px;"&gt;   &lt;a href="http://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F%E7%A7%AF"&gt;向量积&lt;/a&gt;&lt;br /&gt;&lt;a href="http://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F%E7%A7%AF"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;未完待续&amp;hellip;&amp;hellip;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;* 本文由 &lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;独酌逸醉&lt;/a&gt; 整理，部分内容来源于互联网&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;* 转载请注明博客链接，谢谢！ &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;* 时间：2011.10.10&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;span class="link_title"&gt;&lt;br /&gt;&lt;a href="http://blog.csdn.net/rabbitguiming/article/details/3964140" title="矩阵运算------四维齐次空间"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2207790.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/11/2207790.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/10/10/2205878.html</id><title type="text">Unicode 与 ANSI 字符串转换</title><summary type="text">如果你经常在 Windows 平台下写程序的话，我相信你一定会遇到 Unicode 与 ANSI 字符串之间的转换（string&lt;-&gt;CString之类的）。要想实现 Unicode 和 ANSI 之间的转换，我之前的一篇文章中简单的介绍了一下：VS 系列 CString 转 string 方法，其实文中的方法是我蒙出来的，简单有效，至于原理我也不甚明了。大部分人使用的是以下两种函数来实现两者的转换：（1）ANSI-&gt;Unicodeint MultiByteToWideChar( __in UINT CodePage, // 标识了与多字节关联的一个代码页值 __in DWO</summary><published>2011-10-10T09:56:00Z</published><updated>2011-10-10T09:56:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/10/2205878.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/10/2205878.html"/><content type="html">&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;如果你经常在 &lt;span style="font-family: Consolas;" face="Consolas"&gt;Windows&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt; 平台下写程序的话，我相信你一定会遇到 &lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;Unicode&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt; 与 &lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;ANSI &lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;字符串之间的转换（&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&amp;lt;-&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;CString&lt;span style="font-family: 宋体;" face="宋体"&gt;之类的）。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;要想实现 &lt;span style="font-family: Consolas;" face="Consolas"&gt;Unicode&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt; 和&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt; ANSI &lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;之间的转换，我之前的一篇文章中简单&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;的介绍了&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;一下：&lt;/span&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2010/09/04/1818252.html"&gt;&lt;span style="text-decoration: underline; font-size: 10.5pt; font-family: 'Consolas';"&gt;VS&lt;span style="font-family: 宋体;" face="宋体"&gt; 系列 &lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;CString&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt; 转&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt; string&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt; 方法&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;，其实文中的方法是我蒙出来的，简单有效，至于原理我也不甚明了。大部分人使用的是以下两种函数来实现两者的转换：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（&lt;span style="font-family: Consolas;" face="Consolas"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;ANSI&amp;nbsp;-&amp;gt;&amp;nbsp;Unicode&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;int MultiByteToWideChar(&lt;br/&gt;  __in   UINT CodePage, // 标识了与多字节关联的一个代码页值&lt;br/&gt;  __in   DWORD dwFlags, // 允许我们进行额外的控制，它会影响带变音符号（比如重音）的字符。但是一般情况下不适用，赋为 0 即可。&lt;br/&gt;  __in   LPCSTR lpMultiByteStr, // 参数指定要转换的字符串&lt;br/&gt;  __in   int cbMultiByte,       // 指定要转换串长度的长度（字节数），如果参数值是-1，函数便可自动判断源字符串的长度&lt;br/&gt;  __out  LPWSTR lpWideCharStr,  // 指定转换后Unicode版本的字符串内存地址&lt;br/&gt;  __in   int cchWideChar        // 指定 lpWideCharStr 缓冲区的最大长度。&lt;br/&gt;                                // 如果传入0，函数不会进行转换，而是返回一个宽字符数（包括终止字符'\0'），&lt;br/&gt;// 只有当缓冲区能够容纳该数量的宽字符时，转换才会成功。&lt;br/&gt;);&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;转换步骤：&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（1）&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;调用&amp;nbsp;&lt;span style="font-family: Consolas;" face="Consolas"&gt;MultiByteToWideChar&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;pWideCharStr&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;参数传入&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;NULL&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，&amp;nbsp;为&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;cchWideChar&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;参数传入&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;0&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;cbMultiByte&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;参数传入&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;-1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（2）&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;分配一块足以容纳转换后的&amp;nbsp;&lt;span style="font-family: Consolas;" face="Consolas"&gt;Unicode&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;字符串的内容。它的大小是上一个&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;MultiByteToWideChar&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;调用的返回值乘以&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;sizeof(wchar_t)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（3）&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;再次调用&lt;span style="font-family: Consolas;" face="Consolas"&gt;MultiByteToWideChar&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，这一次将缓冲区地址作为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;pWideCharStr&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;参数的值传入，将第一次&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;MultiByteToWideChar&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;调用的返回值乘以&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;sizeof(wchar_t)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;后得到大小作为&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;cchWideChar&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;参数的值传入。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（4）&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;使用转换后的字符串&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;（5）&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;释放&amp;nbsp;&lt;span style="font-family: Consolas;" face="Consolas"&gt;Unicode&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;字符串占用的内存块。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;示例代码：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/* &lt;br/&gt; * Subject: Convert ANSI to Unicode&lt;br/&gt; * IDE: Visual Studio 2008&lt;br/&gt; * Auther: http://www.cnblogs.com/chinazhangjie&lt;br/&gt; * Mail: chinajiezhang@gmail.com&lt;br/&gt; * Date:2011/10/10&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;&lt;br/&gt;int main()&lt;br/&gt;{&lt;br/&gt;char *pANSI = "ANSI to Unicode, ANSI 转换到 Unicode";&lt;br/&gt;wchar_t *pUnicode = NULL;&lt;br/&gt;int nWideCharLen = 0;&lt;br/&gt;&lt;br/&gt;// step.1&lt;br/&gt;nWideCharLen = MultiByteToWideChar(CP_ACP, 0, pANSI, -1, NULL, 0);&lt;br/&gt;printf("nWideCharLen = %d\n", nWideCharLen);&lt;br/&gt;&lt;br/&gt;// step.2&lt;br/&gt;pUnicode = (wchar_t*)malloc(nWideCharLen * sizeof(wchar_t));&lt;br/&gt;&lt;br/&gt;// step.3&lt;br/&gt;MultiByteToWideChar(CP_ACP, 0, pANSI, -1, pUnicode, nWideCharLen * sizeof(wchar_t));&lt;br/&gt;&lt;br/&gt;// step.4&lt;br/&gt;MessageBoxW(NULL, pUnicode, TEXT("Unicode"), 0);&lt;br/&gt;&lt;br/&gt;// step.5&lt;br/&gt;free(pUnicode);&lt;br/&gt;&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;（&lt;span style="font-family: Consolas;" face="Consolas"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;Unicode-&amp;gt;ANSI&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;int WideCharToMultiByte(&lt;br/&gt;  __in   UINT CodePage,   // 标志了要与新转换的字符串关联的代码页&lt;br/&gt;  __in   DWORD dwFlags,   // 制定额外的转换控制，一般不需要进行这种程度的控制，而为 dwFlag 传入 0&lt;br/&gt;  __in   LPCWSTR lpWideCharStr, // 指定要转换的字符串的内存地址&lt;br/&gt;  __in   int cchWideChar,       // 指出该字符串的长度，如果传入 -1 ，则由函数来判断字符串的长度&lt;br/&gt;  __out  LPSTR lpMultiByteStr,  // 转换后的缓冲区&lt;br/&gt;  __in   int cbMultiByte,       // 指定 lpMultiByteStr 缓冲区的最大大小（字节数），如果传入 0 ，函数返回该目标缓冲区需要的大小&lt;br/&gt;  __in   LPCSTR lpDefaultChar,  &lt;br/&gt;  __out  LPBOOL lpUsedDefaultChar // 宽字符字符串中，如果至少有一个字符不能转换为对应的多字节形式，函数就会把这个变量设为 TRUE 。如果所有字符都能成功转换，就会把这个变量设为 FALSE。 通常将此函数传入 NULL 值。&lt;br/&gt;);&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;只有一个字符在 uCodePage 制定的代码页中没有对应的表示时，WideCharToMultiByte 才会使用后两个参数。在遇到一个不能转换的字符时，函数便使用 pDefaultChar 参数指向的字符。如果这个参数指向为 NULL ，函数就会使用一个默认的字符。这个默认的值通常是一个问号。这对文件操作是非常危险的，因为问号是一个通配符。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;转换步骤和&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Consolas';"&gt;ANSI&amp;nbsp;-&amp;gt;&amp;nbsp;Unicode&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;&amp;nbsp;相似，故不做赘述。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;示例代码：&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/* &lt;br/&gt; * Subject: Convert Unicode to ANSI&lt;br/&gt; * IDE: Visual Studio 2008&lt;br/&gt; * Auther: http://www.cnblogs.com/chinazhangjie&lt;br/&gt; * Mail: chinajiezhang@gmail.com&lt;br/&gt; * Date:2011/10/10&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;&lt;br/&gt;int main()&lt;br/&gt;{&lt;br/&gt;wchar_t *pUnicode = TEXT("Convert Unicode to ANSI, Unicode 转换为 ANSI");&lt;br/&gt;char    *pANSI    = NULL;&lt;br/&gt;int      nByte     = 0;&lt;br/&gt;&lt;br/&gt;// step.1&lt;br/&gt;nByte = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);&lt;br/&gt;&lt;br/&gt;// step.2&lt;br/&gt;pANSI = (char*)malloc(nByte);&lt;br/&gt;&lt;br/&gt;// step.3&lt;br/&gt;WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, pANSI, nByte, NULL, NULL);&lt;br/&gt;&lt;br/&gt;// step.4&lt;br/&gt;printf_s("ANSI = %s\n", pANSI);&lt;br/&gt;&lt;br/&gt;// step.5&lt;br/&gt;free(pANSI);&lt;br/&gt;&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt; * 本文由 &lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;独酌逸醉&lt;/a&gt; 原创，转载请注明博客链接，谢谢！&lt;br /&gt; * 参考书籍：《Windows核心编程（第5版）》&lt;br /&gt; * 时间：&lt;span style="color: #800080;"&gt;2011.10&lt;/span&gt;.&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2205878.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/10/10/2205878.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html</id><title type="text">MFC 框架技术简单研讨</title><summary type="text">引： 这篇博客是根据昨天的我们团队技术研讨会，我所讲的部分的内容（这句话读起来好纠结啊），由幻灯片改变而成的。因为我们团队在界面设计上缺陷很大，而我想对强一些（当然是我们团队之中了，我们都是大学生，所以我也强不到哪儿去）。为什么不直接讲MFC技术，而要简单讲框架。原因如下：个人认为MFC难学难用在于你不了解MFC的架构，如果你稍微有一些了解的话，用起来也就没那么复杂了。框架类型的东西往往如此，为程序员隐藏了太多的细节，通常都是知其然而不知其所以然。我准备了好长时间，但是讲解效果不好。意料之外，情理之中。一来看框架就要看源码，一个框架源码的复杂程度可想而知；二来大家都关心一些实用的技术，表面性.</summary><published>2011-09-19T16:45:00Z</published><updated>2011-09-19T16:45:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html"/><content type="html">&lt;p&gt;引：&lt;/p&gt;&lt;p&gt;这篇博客是根据昨天的我们团队技术研讨会，我所讲的部分的内容（这句话读起来好纠结啊），由幻灯片改变而成的。因为我们团队在界面设计上缺陷很大，而我想对强一些（当然是我们团队之中了，我们都是大学生，所以我也强不到哪儿去）。为什么不直接讲MFC技术，而要简单讲框架。原因如下：个人认为MFC难学难用在于你不了解MFC的架构，如果你稍微有一些了解的话，用起来也就没那么复杂了。框架类型的东西往往如此，为程序员隐藏了太多的细节，通常都是知其然而不知其所以然。我准备了好长时间，但是讲解效果不好。意料之外，情理之中。一来看框架就要看源码，一个框架源码的复杂程度可想而知；二来大家都关心一些实用的技术，表面性东西，比如怎么实现窗口透明之类的技术，而不愿意花费时间在框架性东西上。这是一件很悲剧的事情&amp;hellip;&amp;hellip;，我们园子里有大牛，当然我相信有很多学生，我想告诉大家的是学技术要专一要往深里学，不要浮躁，踏踏实实的。废话都多了&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;我要写一点声明，上面废话可以不看，声明一定要看。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;（1）博客参考了侯俊杰老师的《深入浅出MFC》，我用的是Visual Studio 2008，在源码上有一些不同。我学习了他分析问题的方法，在一些我自己搞不定的问题上，我摘了他书的原话。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;（2）除本文之外，其他链接跳转文章是我直接从wps doc中直接复制过去，难免有一些失真。我本想一点一点校正格式，但是由于文章比较长，所以格式上会有一些混乱。这一点请大家见谅。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;（3）小弟才疏学浅。如果看到本文的您是高手的话，您一定会发现文章的很多错误，希望您给我指出来。言辞表达不正，也欢迎您斧正。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;（4）文章由幻灯片改编，衔接可能不流畅。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;（4）本文为&lt;a href="http://www.cnblogs.com/chinazhangjie/"&gt;&lt;span style="color: #ff0000;"&gt;独酌逸醉&lt;/span&gt;&lt;/a&gt;原创，如果您需要转载的话，一定要标明文章参考了侯俊杰先生的《深入浅出MFC》，我个人事小。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;正文：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一讲 Win32 App&amp;nbsp; 和&amp;nbsp; MFC Framework&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Win32 App 程序生与死：&lt;br /&gt;（1）注册窗口&lt;br /&gt;（2）创建窗口&lt;br /&gt;（3）显示并更新窗口&lt;br /&gt;（4）消息循环( WM_QUIT 结束循环)&lt;br /&gt;（5）退出&lt;/p&gt;&lt;p&gt;实例代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;windows.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;ATOM  RegisterWndClass( HINSTANCE hInstance , LPCWSTR className);&lt;br /&gt;LRESULT CALLBACK WindowProc(HWND ,UINT, WPARAM, LPARAM);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; WinMain parameters:&lt;br /&gt; *  hInstance : A handle to the current instance of the application.&lt;br /&gt; *  hPrevInstance : A handle to the previous instance of the application. &lt;br /&gt; *                  This parameter is always NULL. ...&lt;br /&gt; *  lpCmdLine : The command line for the application, excluding（不包括） the program name. &lt;br /&gt; *             To retrieve（获取） the entire（全部） command line, use the GetCommandLine function.&lt;br /&gt; *  nCmdShow : Controls how the window is to be shown. eg. SW_HIDE, SW_MAXIMIZE&lt;br /&gt; *&lt;br /&gt; *  return value: If the function succeeds, terminating when it receives a WM_QUIT message, &lt;br /&gt; *                it should return the exit value contained in that message's wParam parameter. &lt;br /&gt; *                If the function terminates before entering the message loop, &lt;br /&gt; *                it should return zero.&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; CALLBACK WinMain(&lt;br /&gt;            __in  HINSTANCE hInstance,        &lt;br /&gt;            __in  HINSTANCE hPrevInstance,     &lt;br /&gt;            __in  LPSTR lpCmdLine,&lt;br /&gt;            __in  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nCmdShow )&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; （1）注册窗口&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    LPCWSTR className &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstWnd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;RegisterWndClass(hInstance, className)) {&lt;br /&gt;        ::MessageBox(NULL, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Register class failed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), &lt;br /&gt;            TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONEXCLAMATION);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; （2）创建窗口&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    HWND hWnd;  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    hWnd &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateWindow(&lt;br /&gt;        className,                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口类名称&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A simple Win32 Application&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口标题&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        WS_OVERLAPPEDWINDOW,          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口风格&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;,                          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口位置的 x 坐标 ， CW_USEDEFAULT&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;,                          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口位置的 y 坐标 ， CW_USEDEFAULT&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;400&lt;/span&gt;&lt;span style="color: #000000;"&gt;,                          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口的宽度 ， CW_USEDEFAULT&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&lt;span style="color: #000000;"&gt;,                          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口的高度 ， CW_USEDEFAULT&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        NULL,                         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 父窗口句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        NULL,                         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 菜单句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        hInstance,                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 应用程序句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        NULL);                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口创建数据指针， WM_CREATE lParam&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;hWnd) {&lt;br /&gt;        ::MessageBox(NULL, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Register class failed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), &lt;br /&gt;            TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONEXCLAMATION);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; （3）显示并更新窗口&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    ShowWindow(hWnd, nCmdShow);&lt;br /&gt;    UpdateWindow(hWnd);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; （4）进入消息循环&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    MSG  msg;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 如果 msg 消息为 WM_QUIT ， GetMessage 返回为 0 ，退出循环&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (GetMessage(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;msg, NULL, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)) {&lt;br /&gt;        TranslateMessage(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;msg);&lt;br /&gt;        DispatchMessage(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;msg);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 程序结束&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; msg.wParam;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 注册窗口&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ATOM  RegisterWndClass( HINSTANCE hInstance , LPCWSTR className)&lt;br /&gt;{&lt;br /&gt;    WNDCLASS wc;&lt;br /&gt;    wc.style       &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CS_HREDRAW &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; CS_VREDRAW &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; CS_DBLCLKS; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.lpfnWndProc &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (WNDPROC)WindowProc;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A pointer to the window procedure.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.cbClsExtra  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;                       &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.cbWndExtra  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;                       &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.hInstance   &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; hInstance;               &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.hIcon       &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; LoadIcon( hInstance, IDI_APPLICATION ); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A handle to the class icon.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.hCursor     &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; LoadCursor( NULL, IDC_ARROW );          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A handle to the class cursor.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.hbrBackground &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (HBRUSH)GetStockObject(BLACK_BRUSH);          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A handle to the class background brush.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.lpszMenuName  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;                  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The resource name of the class menu,&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    wc.lpszClassName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; className;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A pointer to a null-terminated string or is an atom.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterClass( &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;wc );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 窗口过程&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;LRESULT CALLBACK WindowProc(&lt;br /&gt;              __in  HWND hWnd,     &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A handle to the window. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;              __in  UINT uMsg,     &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The message.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;              __in  WPARAM wParam, &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Additional message information&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;              __in  LPARAM lParam  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Additional message information&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            )&lt;br /&gt;{&lt;br /&gt;    HDC hDC;&lt;br /&gt;    PAINTSTRUCT ps;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (uMsg) &lt;br /&gt;    {  &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; WM_PAINT:  &lt;br /&gt;        hDC &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; BeginPaint(hWnd, &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ps);&lt;br /&gt;        RECT rc;&lt;br /&gt;        rc.bottom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        rc.left &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        rc.right &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        rc.top &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;400&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        ::SetTextColor(hDC, RGB(&lt;/span&gt;&lt;span style="color: #800080;"&gt;255&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;        SetBkMode(hDC, TRANSPARENT);&lt;br /&gt;        ::TextOut(hDC, &lt;/span&gt;&lt;span style="color: #800080;"&gt;30&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;30&lt;/span&gt;&lt;span style="color: #000000;"&gt;, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;This is my first Win32 App !&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), &lt;br /&gt;            strlen(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;This is my first Win32 App !&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;        EndPaint(hWnd, &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ps);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; WM_DESTROY:  &lt;br /&gt;        MessageBox(NULL, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Window will be closed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK);&lt;br /&gt;        PostQuitMessage(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);  &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; WM_LBUTTONDOWN:&lt;br /&gt;        MessageBox(NULL, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;left button down&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;:  &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }  &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; DefWindowProc(hWnd, uMsg, wParam, lParam);  &lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;思考：&lt;/p&gt;&lt;p&gt;1. Console App 入口点 是&amp;nbsp; main&amp;nbsp; ； Win32 App 入口点是 WinMain ；那么 MFC 入口点在哪里 ？&lt;br /&gt;2.&amp;nbsp; 相对简洁的 Win32 App ，复杂的&amp;nbsp; MFC Framework&amp;nbsp; 强大在哪里 ？&amp;nbsp; &lt;br /&gt;3. 大量的虚函数、复杂的宏，或者说 MFC Framework 背着我们用户做了哪些事情 ？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;第二讲 MFC 六大关键技术&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;2.1 &lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/19/2181954.html"&gt;MFC 程序的初始化过程&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;2.2 &lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181983.html"&gt;RTTI（运行时类型识别）&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;2.3 Dynamic Creation（动态创建）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C++动态创建对象的困难在于，无法在程序执行期间，根据动态获得的一个类名称，要求程序产生一个对象。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 在 RTTI 中，CRuntimeClass 对象记录了类的 CreateObject&amp;nbsp; 函数，在程序执行期间获得类名称，遍历链表找到名称匹配项，调用 CreateObject ，产生新对象。&lt;/p&gt;&lt;p&gt;C++ 动态类型相关&lt;br /&gt;（1） typeid&amp;nbsp; 运算子&lt;br /&gt;（2）宏&amp;nbsp; [ RTTI ]&lt;br /&gt;（3）模板实参演绎&amp;nbsp; [STL iterator_traits]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; C++在动态对象创建上一直是一个缺陷，据我说知，C# 有一项技术支持（反射）。&lt;br /&gt;&lt;strong&gt;&amp;nbsp;2.4 Persistence（永久保存）机制&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Persistence：将对象永久保留下来（写入文件），Persistence 机制，也就是Serialize（数据读写）。&lt;/p&gt;&lt;p&gt;Persistence 简介&lt;/p&gt;&lt;p&gt;（1） MFC 提供 CObList 、CDWordArray 等类来支持 Persistence 。&lt;br /&gt;（2） MFC 利用 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_SERIAL/IMPLIMENT_SERIAL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 两个宏来实现&amp;nbsp; Persistence&amp;nbsp; 机制。&lt;br /&gt;（3）个人觉得，Persistence 只不过限定了一种文件格式来存储。普通程序员也可以很快设定一种文件格式来存储，不用受框架的限制，灵活性高且调试方便。&lt;br /&gt;&lt;strong&gt;&amp;nbsp;2.5 &lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181967.html"&gt;Message Mapping（消息映射）与Command Routing（命令传递）&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Windows 程序本质系事借着消息来维持脉动（消息驱动），并以 WM_ 开头的常量开表示。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 消息循着 Application Framework 规定的路线，游走于各个对象之间，直到找到它的归宿（消息处理函数）。找不到的话，Framework 最终把它交给 :DefWindowProc 函数处理。&lt;/p&gt;&lt;p&gt;MFC 消息分类&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 命令消息（WM_COMMAND）：&amp;ldquo;使用者命令程序做些操作&amp;rdquo;。凡是 UI 对象产生的消息都是这种命令消息，可能来自菜单或者加速键或工具栏按钮，并且都以 WM_COMMAND 呈现。SDK 程序主要靠 wParam 识别之，MFC 程序则主要靠菜单项的识别码（ menu ID）识别&amp;mdash;&amp;mdash;其实两者是一样的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 凡是派生自 CCmdTarget 的类，都由资格接受命令消息。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 标准消息：除 WM_COMMAND 之外，任何以 WM_ 开头的都算这一类，均可接受此消息。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control Notification：由控件产生，为的是向父类窗口通知某种情况。例如当你在 ListBox 上选择其中一个项目，ListBox 就会产生 LBN_SELCHANGE 传送给父窗口。这类消息是以 WM_COMMAND 形式呈现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三讲 MFC 多线程技术简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MFC 线程分类：Work Thread，UI Thread&lt;br /&gt;区别：Work Thread 没有消息循环&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UI Thread&amp;nbsp;&amp;nbsp; 有自己的消息和队列循环&lt;br /&gt;Work Thread：通常用来执行后台计算和维护任务，如冗长的计算过程，打印机的后台打印等&lt;br /&gt;UI&amp;nbsp; Thread：一般用于处理独立于其他线程执行之外的用户输入，响应用户及系统所产生的事件和消息等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.1 Work Thread的创建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CWinThread*&lt;br /&gt;AfxBeginThread(AFX_THREADPROC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pfnThreadProc,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVOID&amp;nbsp; pParam,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nPriority=THREAD_PRIORITY_NORMAL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT nStackSize=0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwCreateFlags=0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPSECURITY_ATTRIBUTES&amp;nbsp;&amp;nbsp; lpSecurityAttrs=NULL);&lt;br /&gt;线程函数类型：&lt;br /&gt;UINT ExecutingFunction(LPVOID pParam);&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.2 UI Thread的创建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nPriority=THREAD_PRIORITY_NORMAL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT nStackSize=0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwCreateFlags=0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);&lt;br /&gt;&lt;br /&gt;具体请看：&lt;a href="http://www.vckbase.com/document/viewdoc/?id=1706"&gt;多线程编程之二&amp;mdash;&amp;mdash;MFC中的多线程开发&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第五讲 MFC 常用技术&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;略（幻灯片中讲了一些，但是比较杂碎，就不在这里列出来了&amp;hellip;&amp;hellip;）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;本文完&amp;gt;&lt;/p&gt;&lt;p&gt;2011-09-20&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2181986.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181983.html</id><title type="text">MFC RTTI 探究</title><summary type="text">MFCRTTI探究张杰2011-09-17声明本文由张杰原创，参考了侯俊杰先生的《深入浅出MFC》，源码摘自MicrosoftVisualStudio9.0\VC。个人能力有限，文章必定存在很多错误。我的邮箱是：chinajiezhang@gmail.comchinajiezhang@163.com欢迎您来邮件斧正。当然您也可以加我msn:chinazhangjie@hotmail.com交流。本文可供传播、交流、学习使用，但请不要用于商业用途。转载请标明此声明，谢谢您的合作。DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE查看DECLARE_DYNCREATE定义（</summary><published>2011-09-19T16:37:00Z</published><updated>2011-09-19T16:37:00Z</updated><author><name>独酌逸醉</name><uri>http://www.cnblogs.com/chinazhangjie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181983.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181983.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="Section0"&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 36pt; font-family: 'Times New Roman';"&gt;MFC&amp;nbsp;RTTI&amp;nbsp;&lt;span style="font-family: 宋体;" face="宋体"&gt;探究&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 36pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;张杰&lt;/span&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;2011-09-17&lt;/span&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;span style="font-size: 24pt; font-family: 'Times New Roman';"&gt;声明&lt;/span&gt;&lt;span style="font-size: 36pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;本文由张杰原创，参考了侯&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '新宋体';"&gt;俊&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;杰先生的《深入浅出&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;MFC&lt;/span&gt;&lt;span style="font-family: 新宋体;" face="新宋体"&gt;》，源码摘自&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC&lt;/span&gt;&lt;span style="font-family: 新宋体;" face="新宋体"&gt;。&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;个人能力有限，文章必定存在很多错误。我的邮箱是：&lt;/span&gt;&lt;span&gt;&lt;a href="mailto:chinajiezhang@gmail.com"&gt;&lt;span class="15" style="color: #0000ff; text-decoration: underline; font-size: 14pt; font-family: 'Times New Roman';"&gt;chinajiezhang@gmail.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;a href="mailto:chinajiezhang@163.com"&gt;&lt;span class="15" style="color: #0000ff; text-decoration: underline; font-size: 14pt; font-family: 'Times New Roman';"&gt;chinajiezhang@163.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;欢迎您来邮件斧正。当然您也可以加我&amp;nbsp;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;msn:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;a href="mailto:chinazhangjie@hotmail.com"&gt;&lt;span class="15" style="color: #0000ff; text-decoration: underline; font-size: 14pt; font-family: 'Times New Roman';"&gt;chinazhangjie@hotmail.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;交流。&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;本文可供传播、交流、学习使用，但请不要用于商业用途。转载请标明此声明，谢谢您的合作。&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 15pt; font-family: 'Times New Roman';"&gt;DECLARE_DYNCREATE&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 15pt; font-family: '宋体';"&gt;&amp;nbsp;和&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 15pt; font-family: 'Times New Roman';"&gt;IMPLEMENT_DYNCREATE&lt;/span&gt;&lt;span style="font-size: 26pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;查看&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;DECLARE_DYNCREATE&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;定义（&lt;/span&gt;&lt;span style="font-style: italic; font-size: 14pt; font-family: 'Times New Roman';"&gt;c:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC\atlmfc\include\afx.h&lt;span style="font-family: 宋体;" face="宋体"&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;：&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;DECLARE_DYNCREATE(class_name)&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;DECLARE_DYNAMIC(class_name)&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CObject*&amp;nbsp;PASCAL&amp;nbsp;CreateObject();&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;查看&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;DECLARE_DYNAMIC&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;定义（&lt;/span&gt;&lt;span style="font-style: italic; font-size: 14pt; font-family: '宋体';"&gt;c:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC\atlmfc\include\afx.h&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;）：&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;DECLARE_DYNAMIC(class_name)&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;protected&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;:&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;_GetBaseClass();&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;public&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;:&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;##class_name;&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;GetThisClass();&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;virtual&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;GetRuntimeClass()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;;&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;不再有宏了，我们找个例子将代码展开看看效果（创建&amp;nbsp;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;MFC&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;单文档，命名为：&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;FirstMFCDemo&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;在&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 'Times New Roman';"&gt;FirstMFCDemoDoc&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: '宋体';"&gt;.h&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;下有行代码：&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;DECLARE_DYNCREATE(CFirstMFCDemoDoc)&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;展开代码为：&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;protected:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;_GetBaseClass();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;public:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&amp;nbsp;const&amp;nbsp;CRuntimeClass&amp;nbsp;classCFirstMFCDemoDoc;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;GetThisClass();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;virtual&amp;nbsp;CRuntimeClass*&amp;nbsp;GetRuntimeClass()&amp;nbsp;const;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&amp;nbsp;CObject*&amp;nbsp;PASCAL&amp;nbsp;CreateObject();&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;先不管代码的具体含义，把&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;IMPLEMENT_DYNCREATE&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;宏定义看了再说（&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 14pt; font-family: 'Times New Roman';"&gt;c:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC\atlmfc\include\afx.h&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;）：&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;IMPLEMENT_DYNCREATE(class_name,&amp;nbsp;base_class_name)&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CObject*&amp;nbsp;PASCAL&amp;nbsp;class_name::CreateObject()&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;class_name;&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;IMPLEMENT_RUNTIMECLASS(class_name,&amp;nbsp;base_class_name,&amp;nbsp;0xFFFF,&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;class_name::CreateObject,&amp;nbsp;NULL)&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;继续查看&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;IMPLEMENT_RUNTIMECLASS&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;定义（&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 14pt; font-family: 'Times New Roman';"&gt;c:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC\atlmfc\include\afx.h&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;）：&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;IMPLEMENT_RUNTIMECLASS(class_name,&amp;nbsp;base_class_name,&amp;nbsp;wSchema,&amp;nbsp;pfnNew,&amp;nbsp;class_init)&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;class_name::_GetBaseClass()&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;RUNTIME_CLASS(base_class_name);&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;AFX_COMDAT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass&amp;nbsp;class_name::&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;##class_name&amp;nbsp;=&amp;nbsp;{&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#class_name,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;sizeof&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;class_name),&amp;nbsp;wSchema,&amp;nbsp;pfnNew,&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;amp;class_name::_GetBaseClass,&amp;nbsp;NULL,&amp;nbsp;class_init&amp;nbsp;};&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;class_name::GetThisClass()&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;_RUNTIME_CLASS(class_name);&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;class_name::GetRuntimeClass()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;_RUNTIME_CLASS(class_name);&amp;nbsp;}&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;查看&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;RUNTIME_CLASS&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;和&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;_RUNTIME_CLASS&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;宏定义：&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;RUNTIME_CLASS(class_name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;(class_name::GetThisClass())&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#define&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;_RUNTIME_CLASS(class_name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;\&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: '宋体';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;((CRuntimeClass*)(&amp;amp;class_name::&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;##class_name))&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;在&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;FirstMFCDemoDoc&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;.cpp&amp;nbsp;&lt;span style="font-family: 宋体;" face="宋体"&gt;找到代码：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-style: normal; font-size: 12pt; font-family: 'Courier New';"&gt;IMPLEMENT_DYNCREATE(CFirstMFCDemoDoc,&amp;nbsp;CDocument)&lt;/span&gt;&lt;span style="font-style: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;展开后为：&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CObject*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::CreateObject()&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;return&amp;nbsp;new&amp;nbsp;CFirstMFCDemoDoc;&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::_GetBaseClass()&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;return&amp;nbsp;CDocument::GetThisClass();&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;AFX_COMDAT&amp;nbsp;const&amp;nbsp;CRuntimeClass&amp;nbsp;CFirstMFCDemoDoc::classCFirstMFCDemoDoc&amp;nbsp;=&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;#CFirstMFCDemoDoc,&amp;nbsp;sizeof(class&amp;nbsp;CFirstMFCDemoDoc),&amp;nbsp;0xFFFF,&amp;nbsp;CFirstMFCDemoDoc::CreateObject,&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;amp;CFirstMFCDemoDoc::_GetBaseClass,&amp;nbsp;NULL,&amp;nbsp;NULL&amp;nbsp;};&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::GetThisClass()&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;return&amp;nbsp;(CRuntimeClass*)(&amp;amp;CFirstMFCDemoDoc::classCFirstMFCDemoDoc);&amp;nbsp;}&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;CFirstMFCDemoDoc::GetRuntimeClass()&amp;nbsp;const&amp;nbsp;\&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;return&amp;nbsp;(CRuntimeClass*)(&amp;amp;CFirstMFCDemoDoc::classCFirstMFCDemoDoc);&amp;nbsp;}&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;好乱的团代码啊，我们来理理：&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;DECLARE_DYNCREATE&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;和&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;IMPLEMENT_DYNCREATE&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;为类&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;CFirstMFCDemoDoc&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;添加了&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;3&lt;span style="font-family: 宋体;" face="宋体"&gt;个静态函数&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;个虚函数&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;静态&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;CRuntimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;类型常量，以及代码实现体。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;分别为：&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;public&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;virtual&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CObject*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;CreateObject&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CFirstMFCDemoDoc;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;protected&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;_GetBaseClass&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CDocument::GetThisClass();&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;AFX_COMDAT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CFirstMFCDemoDoc::&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;classCFirstMFCDemoDoc&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;=&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;#CFirstMFCDemoDoc,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;sizeof&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CFirstMFCDemoDoc),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;0xFFFF,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CFirstMFCDemoDoc::CreateObject,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;amp;CFirstMFCDemoDoc::_GetBaseClass,&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;NULL,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;NULL&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;};&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;CFirstMFCDemoDoc::&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;GetThisClass&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: '宋体';"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;eturn&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;(CRuntimeClass*)(&amp;amp;CFirstMFCDemoDoc::classCFirstMFCDemoDoc);&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;CFirstMFCDemoDoc::&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;GetRuntimeClass&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;(CRuntimeClass*)(&amp;amp;CFirstMFCDemoDoc::classCFirstMFCDemoDoc);&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;想要知道这些代码到底在干什么，就必须了解&amp;nbsp;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;CRunTimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;是干什么的？&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: '宋体';"&gt;废话不说，直接上&amp;nbsp;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;CRuntimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;源码（&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: italic; font-size: 14pt; font-family: '宋体';"&gt;c:\Program&amp;nbsp;Files\Microsoft&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;9.0\VC\atlmfc\include\afx.h&lt;span style="font-family: 宋体;" face="宋体"&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: '宋体';"&gt;：&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: '宋体';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;struct&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;Attributes&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;LPCSTR&amp;nbsp;m_lpszClassName;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;int&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;m_nObjectSize;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;UINT&amp;nbsp;m_wSchema;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;schema&amp;nbsp;number&amp;nbsp;of&amp;nbsp;the&amp;nbsp;loaded&amp;nbsp;class&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CObject*&amp;nbsp;(PASCAL*&amp;nbsp;m_pfnCreateObject)();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;NULL&amp;nbsp;=&amp;gt;&amp;nbsp;abstract&amp;nbsp;class&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#ifdef&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;_AFXDLL&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;(PASCAL*&amp;nbsp;m_pfnGetBaseClass)();&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#else&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #808080; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #808080; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;m_pBaseClass;&lt;/span&gt;&lt;span style="color: #808080; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;#endif&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;Operations&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CObject*&amp;nbsp;CreateObject();&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;BOOL&amp;nbsp;IsDerivedFrom(&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;pBaseClass)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;dynamic&amp;nbsp;name&amp;nbsp;lookup&amp;nbsp;and&amp;nbsp;creation&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;FromName(LPCSTR&amp;nbsp;lpszClassName);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;FromName(LPCWSTR&amp;nbsp;lpszClassName);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CObject*&amp;nbsp;PASCAL&amp;nbsp;CreateObject(LPCSTR&amp;nbsp;lpszClassName);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CObject*&amp;nbsp;PASCAL&amp;nbsp;CreateObject(LPCWSTR&amp;nbsp;lpszClassName);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;Implementation&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;void&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;Store(CArchive&amp;amp;&amp;nbsp;ar)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;CRuntimeClass*&amp;nbsp;PASCAL&amp;nbsp;Load(CArchive&amp;amp;&amp;nbsp;ar,&amp;nbsp;UINT*&amp;nbsp;pwSchemaNum);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;CRuntimeClass&amp;nbsp;objects&amp;nbsp;linked&amp;nbsp;together&amp;nbsp;in&amp;nbsp;simple&amp;nbsp;list&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;CRuntimeClass*&amp;nbsp;m_pNextClass;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;//&amp;nbsp;linked&amp;nbsp;list&amp;nbsp;of&amp;nbsp;registered&amp;nbsp;classes&lt;/span&gt;&lt;span style="color: #008000; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;const&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;&amp;nbsp;AFX_CLASSINIT*&amp;nbsp;m_pClassInit;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; background: none repeat scroll 0% 0% #c0c0c0; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;};&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;查看&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;AFX_CLASSINIT&amp;nbsp;&lt;span style="font-family: 宋体;" face="宋体"&gt;类型定义：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;struct&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;AFX_CLASSINIT&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&amp;nbsp;AFX_CLASSINIT(CRuntimeClass*&amp;nbsp;pNewClass)&amp;nbsp;{&amp;nbsp;AfxClassInit(pNewClass);&amp;nbsp;}&amp;nbsp;};&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;继续查看&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;AfxClassInit&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: '宋体';"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;定义：&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #0000ff; font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;void&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&amp;nbsp;AFXAPI&amp;nbsp;AfxClassInit(CRuntimeClass*&amp;nbsp;pNewClass)&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;AFX_MODULE_STATE*&amp;nbsp;pModuleState&amp;nbsp;=&amp;nbsp;AfxGetModuleState();&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;AfxLockGlobals(CRIT_RUNTIMECLASSLIST);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;pModuleState-&amp;gt;m_classList.AddHead(pNewClass);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;由此看出，&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;AFX_CLASSINIT&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;结构完成了链表的链接操作，我们不做深究。&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;MFC&amp;nbsp;&lt;span style="font-family: 宋体;" face="宋体"&gt;每个类基本都有一个&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;CRuntimeClass&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;类型的对象，这些对象构成了一个链表。链表的头是谁呢？答案是&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;CObject&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，它是&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;MFC&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;所有类的祖先类。这个链表记录了类的名称、链表的&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;Next&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;指针、类的基类指针等等操作。我们可以用这些记录来比较，&amp;nbsp;以达到&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;RTTI&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;的能力。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;我百度了几张图片&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: '宋体';"&gt;（事实上，这是《深入浅出&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;MFC&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;》中的图片，至少长的很像，&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;O(&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;&amp;cap;&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;_&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;&amp;cap;&lt;/span&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;)O~&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;，便于理解&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: '宋体';"&gt;&amp;nbsp;RTTI&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;：&lt;/span&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011092000360860.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/153357/2011092000361794.jpg" alt="" /&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;br /&gt;&lt;span style="font-weight: normal; font-style: normal; font-size: 12pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;好吧，就讲到这里了。能力有限，再深也就看你们的了。&lt;/span&gt;&lt;span style="font-weight: normal; font-size: 14pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinazhangjie/aggbug/2181983.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181983.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
