﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-hoodlum1980 ( 發發 ) 的技术博客</title><link>http://www.cnblogs.com/hoodlum1980/</link><description>——浙江大学 112 周年 （ 1897 - 2009 ） , C/C++, C#; WindowsMobile, ATL, COM, .NET FRAMEWORK, 数字图像处理;</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 20:27:30 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 20:27:30 GMT</pubDate><ttl>60</ttl><item><title>[非原创] 哈夫曼（Huffman ）编码</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/02/06/1665112.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Sat, 06 Feb 2010 11:56:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/02/06/1665112.html</guid><description><![CDATA[<p>阅读: 24 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-02-06 19:56 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/06/1665112.html" target="_blank">原文链接</a></p>&nbsp; 
<p>　　====================================================</p>
<p>　　前言：</p>
<p>　　本文是源于我在（上海交大）饮水思源BBS 的VC版解答其他网友提出的帮助请求。这是德国 DARMSTADT 工业大学C++作业题目之一，属于非计算机系的题目，题目本身要求完成的那几个辅助函数难度并不高。我在BBS上给出了这道题目的解答，但是同时我也想根据这个题目的说明文档，来仔细回顾一下 Huffman 编码。因此本文是以该题目的说明文档为基本框架的。我将对该文档中的主要部分转用中文叙述，当然里面可能还增加有我个人的理解。同时该文档将一并作为附件提供。<br /></p>
<p>　　该文档是：</p>
<p>　　PD Dr. Ulf Lorenz, 《Introduction to Mathematical Software Examination Sheet (winter term 2009/2010) 》， Department of Mathematics, TECHNISCHE UNIVERSITY DARMSTADT.<br /></p>
<p>&nbsp;　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--hoodlum1980</p>
<p>　　 =====================================================</p>
<p>&nbsp;　　Hufmann coding 是最古老，以及最优雅的数据压缩方法之一。它是以最小冗余编码为基础的，即如果我们知道数据中的不同符号在数据中的出现频率，我们就可以对它用一种占用空间最少的编码方式进行编码，这种方法是，对于最频繁出现的符号制定最短长度的编码，而对于较少出现的符号给较长长度的编码。哈夫曼编码可以对各种类型的数据进行压缩，但在本文中我们仅仅针对字符进行编码。<br /></p>
<p>&nbsp;</p>
<p>　　1. 压缩数据。</p>
<p>　　压缩数据由以下步骤组成：</p>
<p>　　a）检查字符在数据中的出现频率。</p>
<p>　　b）构建哈夫曼树。<br /></p>
<p>　　c）创建哈夫曼编码表。</p>
<p>　　d）生成压缩后结果，由一个文件头和压缩后的数据组成。 <br /></p>
<p>&nbsp;</p>
<p>&nbsp;　　下面介绍这些步骤的一些细节。</p>
<p>&nbsp;</p>
<p>　　a）字符出现的频率：</p>
<p>　　我们对要压缩的文本进行扫描，然后记录下各个字符出现的次数（在这里我们的输入文本将仅仅有 ascii 字符构成） ，扫描完成后我们就得到了一个字符的频率表。这个频率表也是后面的文件头的重要组成部分。为了降低文件头的尺寸，我们对字符频率压缩到用一个字节来表示。【注意】，等比例缩小字符频率时，不能把在文本中出现的字符的频率缩小成0！<br /></p>
<p>&nbsp;</p>
<p>　　由以下方法来完成：我们首先提供一个用于填充频率结果的数组（unsigned int freqs[NUM_CHARS]，注意尽管这个数组是UINT类型，但是填充数据必须在0~255之间），元素在这个数组中的索引就代表了该字符的 ascii 码。例如填充完毕后，字符&#8216;a&#8217;的出现频率即为 freqs['a'];<br /></p>
<p>　　unsigned char* string: 输入的文本。</p>
<p>　　unsigned int size：输入文本的字符数。 <br /></p>
<p>　　</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('fe885a0c-564c-4b8a-8b8f-4f471fe141de')"><img class="code_img_closed" id="code_img_closed_fe885a0c-564c-4b8a-8b8f-4f471fe141de" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_fe885a0c-564c-4b8a-8b8f-4f471fe141de" style="display: none" onclick="cnblogs_code_hide('fe885a0c-564c-4b8a-8b8f-4f471fe141de',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_create_freq_array</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_fe885a0c-564c-4b8a-8b8f-4f471fe141de">
<div><!--{cps..0}--><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">给定一个字符串，把字符的出现频率保存到freqs数组中<br /></span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">Hint:&nbsp;Be&nbsp;carefull&nbsp;that&nbsp;you&nbsp;don&#8217;t&nbsp;scale&nbsp;any&nbsp;frequencies&nbsp;to&nbsp;zero&nbsp;for&nbsp;symbols&nbsp;that&nbsp;do&nbsp;appear&nbsp;in&nbsp;the&nbsp;string!</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;create_freq_array(unsigned&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;freqs[NUM_CHARS],&nbsp;unsigned&nbsp;</span><span style="color: rgb(0,0,255)">char</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">,&nbsp;unsigned&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i,&nbsp;maxfreq&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">初始化成0</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;memset(freqs,&nbsp;</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(0,0,255)">sizeof</span><span style="color: rgb(0,0,0)">(unsigned&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;NUM_CHARS);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">size;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freqs[</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">[i]]</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(freqs[</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">[i]]&nbsp;</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;maxfreq)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxfreq&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;freqs[</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">[i]];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">把字符频率压缩到一个字节。&nbsp;scaled&nbsp;freqs&nbsp;to&nbsp;(0~255)</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(maxfreq&nbsp;</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">0xff</span><span style="color: rgb(0,0,0)">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">NUM_CHARS;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(freqs[i])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freqs[i]&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">)(freqs[i]&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">255.0</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">&nbsp;maxfreq&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">0.5</span><span style="color: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">要确保不会被缩小成0！</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(freqs[i]&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freqs[i]&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">1</span><span style="color: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div></div>
<p><br /></p>
<p>&nbsp;</p>
<p>　　b）构建哈夫曼树（huffman Tree）；</p>
<p>　　哈夫曼编码的核心部分就在于构建哈夫曼树，它是一个二叉树。同时它的贪心策略也现在构建哈夫曼树的方法中。 <br /></p>
<p>　　哈夫曼树用下面的方式构建：首先，我们把所有出现的字符作为一个单节点数，在节点上标识一个数字代表字符出现频率。 <br /></p>
<p>　　例如如果我们要对字符串&#8220;aabbbccccdddddd" 进行编码，则字符频率表如下所示：</p>
<p>　　 ----------------------------</p>
<p>　　| &nbsp; &nbsp;&nbsp; a &nbsp; &nbsp; &nbsp; b &nbsp; &nbsp; &nbsp; c &nbsp; &nbsp; &nbsp; d &nbsp;&nbsp; |</p>
<p>&nbsp;　　----------------------------</p>
<p>　　| &nbsp; &nbsp;&nbsp; 2&nbsp; &nbsp; &nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; |<br /></p>
<p>&nbsp; &nbsp; &nbsp; ----------------------------</p>
<p>&nbsp;</p>
<p>　　一共有4个字符出现，因此最初我们有 4 个单节点的树。然后就是体现贪心策略之处，每次我们选取具有最低频率的两个树，并将他们合并，把两个树的频率相加，赋给新树的根节点。重复这个步骤，直到最后只剩下一棵树，就是最终我们需要的哈夫曼树。合并过程如下图所示：<br />　　</p>
<p>　　　　<img height="526" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/huffman_01.jpg" width="370" border="0" />&nbsp;</p>
<p>　　最终的编码方式是，每个 叶子节点代表了一个在原文中出现的字符。每个字符的编码就是从根节点到该叶子节点的路径。由于字节中的每一位由0，1两种状态，这也正是二叉树尤其重要和常用的原因。从根节点出发，如果进入左子树，则在编码上填0，如果进入右子树，则在编码上填1，直到到达叶子节点，就完成了该字符的编码。从上面的哈夫曼树可见，最终的哈夫曼编码表如下：</p>
<p>　　=======================</p>
<p>　　&nbsp; 字符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 频率&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 码长</p>
<p>　　------------------------------------</p>
<p>　　　a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</p>
<p>　　========================&nbsp;</p>
<p>&nbsp;</p>
<p>　　哈夫曼编码是一种前缀码，即任一个字符的编码都不是其他字符编码的前缀。从我们的编码过程中可以很容易看到这一点，因为所有字符都是哈夫曼树中的叶子节点，所以每个字符所在的叶子节点的路径都不会有重叠部分（即代表字符的节点之间不存在以下关系：某节点是另一节点的祖先或后代）。这个特征能够保证解码的唯一性，不会产生歧义（在解码时只需要找到叶子节点即可完成当前字符的解码）。</p>
<p>　　</p>
<p>　　可以看出，出现频率最高的字符，使用最短的编码，字符出现频率越低，编码逐渐增长。这样不同字符在文档中出现的频率差异越大，则压缩效果将会越好。字符的出现频率差异影响了它们最终在哈夫曼树中的深度。</p>
<p>&nbsp;</p>
<p>　　因此字符出现频率越大，我们希望给它的编码越短（在哈夫曼树中的深度越浅），即我们希望更晚的将它所在的树进行合并。反之，字符频率越低，我们希望给他的编码最长（在哈夫曼树中的深度越深），因此我们希望越早的将它所在的树进行合并。因此，哈夫曼编码的贪心策略就体现在合并树的过程中，我们每一次总是选择根节点频率最小的两个树先合并，这样就能达到我们所希望的编码结果。</p>
<p>&nbsp;</p>
<p>　　在合并树的过程中，为了抽取最小频率的树，我们需要一种重要的数据结构作为辅助：优先级队列（Priority Queue）（最小堆）。什么是优先级队列？优先级队列是指一种维护一组元素的数据结构，它的常用操作是从这些元素中抽取最小的元素，和插入新元素。即他维护了一个动态的元素集合，同时要求插入和抽取尽可能的快。实现优先级队列使用的是数据结构中的堆（Heap）（注意：和内存管理中的堆的概念区别）。</p>
<p>&nbsp;</p>
<p>　　最小堆是一个数据结构，在存储方式上使用的是一维线性表（一维数组）存储元素，这些元素在逻辑上组成一个二叉树。</p>
<p>　　最小堆要求满足以下特征：</p>
<p>　　对任何节点：左子 &lt;= 根 &lt;= 右子。</p>
<p>&nbsp;</p>
<p>　　最小堆的数组是以 1 为起始索引的，注意，而不是 C / C++ 中管用的 0-based 数组，因此在 C/C++中，第一个元素（索引为0）通常被浪费。其目的完全是为了能够用下面的简便方式在树节点中导航：</p>
<p>&nbsp;</p>
<p>　　对最小堆中的某个节点 x[i] &nbsp;来，可通过以下方式方面的获取到他的相关节点：</p>
<p>　　根节点： x[1]; 　父： x[i/2]；&nbsp; 左子：x[i*2];&nbsp; &nbsp;右子:&nbsp;&nbsp;x[i*2+1];</p>
<p>&nbsp;</p>
<p>　　一个最小堆的逻辑二叉树范例如下图所示：</p>
<p>　　</p>
<p>　　<img height="163" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/huffman_02.jpg" width="419" border="0" />　　</p>
<p>&nbsp;</p>
<p>　　因此最小堆的最小元素就是根节点。由于最小堆需要经常性的做抽取最小元素和插入操作，因此实际上为了维持堆的特征，每次插入和抽取都要进行节点的调整，因此抽取和插入操作都耗时O（log n）。</p>
<p>&nbsp;</p>
<p>　　对于优先级队列来说，主要需要实现两种基本操作：插入新元素，抽取最小元素。他们的步骤如下：</p>
<p>　　（1）插入新元素：把该元素放在二叉树的末端，然后从该新元素开始，向根节点方向进行交换，直到它到达最终位置。</p>
<p>　　（2）抽取最小元素：把根节点取走。然后把二叉树的末端节点放到根节点上，然而把该节点向子结点反复交换，直到它到达最终位置。</p>
<p>&nbsp;</p>
<p>　　实现优先级队列的类代码如下所示：</p>
<p>&nbsp;</p>
<p>　　</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('2351b92f-eea4-4717-ae76-7003f80b17dc')"><img class="code_img_closed" id="code_img_closed_2351b92f-eea4-4717-ae76-7003f80b17dc" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_2351b92f-eea4-4717-ae76-7003f80b17dc" style="display: none" onclick="cnblogs_code_hide('2351b92f-eea4-4717-ae76-7003f80b17dc',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_PriorityQueue</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_2351b92f-eea4-4717-ae76-7003f80b17dc">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">&nbsp;This&nbsp;class&nbsp;is&nbsp;used&nbsp;in&nbsp;the&nbsp;construction&nbsp;of&nbsp;the&nbsp;Huffman&nbsp;tree.<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;优先级队列</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HuffNodePriorityQueue<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;HuffNodes[NUM_CHARS];<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;heapify(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,r,smallest;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l</span><span style="color: #000000">=</span><span style="color: #800080">2</span><span style="color: #000000">*</span><span style="color: #000000">i;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">left&nbsp;child</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r</span><span style="color: #000000">=</span><span style="color: #800080">2</span><span style="color: #000000">*</span><span style="color: #000000">i</span><span style="color: #000000">+</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">right&nbsp;child</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((l&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;size)</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">(HuffNodes[l]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;HuffNodes[i]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smallest</span><span style="color: #000000">=</span><span style="color: #000000">l;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smallest</span><span style="color: #000000">=</span><span style="color: #000000">i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((r&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;size)</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">(HuffNodes[r]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;HuffNodes[smallest]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smallest</span><span style="color: #000000">=</span><span style="color: #000000">r;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(smallest</span><span style="color: #000000">!=</span><span style="color: #000000">i)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">exchange&nbsp;to&nbsp;maintain&nbsp;heap&nbsp;property</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000">=</span><span style="color: #000000">HuffNodes[smallest];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNodes[smallest]</span><span style="color: #000000">=</span><span style="color: #000000">HuffNodes[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNodes[i]</span><span style="color: #000000">=</span><span style="color: #000000">tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heapify(smallest);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addItem(HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;node)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,parent;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;size</span><span style="color: #000000">+</span><span style="color: #800080">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;size</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">/</span><span style="color: #800080">2</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">find&nbsp;the&nbsp;correct&nbsp;place&nbsp;to&nbsp;insert</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(&nbsp;(i&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(HuffNodes[parent]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;node</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNodes[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;HuffNodes[parent];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">/</span><span style="color: #800080">2</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNodes[i]</span><span style="color: #000000">=</span><span style="color: #000000">node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;extractMin(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;max;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(isEmpty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max</span><span style="color: #000000">=</span><span style="color: #000000">HuffNodes[</span><span style="color: #800080">0</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNodes[</span><span style="color: #800080">0</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">HuffNodes[size</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size</span><span style="color: #000000">=</span><span style="color: #000000">size</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heapify(</span><span style="color: #800080">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;max;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;isEmpty(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;size</span><span style="color: #000000">==</span><span style="color: #800080">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;isFull(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;NUM_CHARS;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};</span></div></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　在上面的代码中，使用的是　heapify 成员函数，将指定的节点交换到最终位置。</p>
<p>&nbsp;</p>
<p>　　构建哈夫曼树的步骤如下：</p>
<p>　　a）把所有出现的字符作为一个节点（单节点树），把这些树组装成一个优先级队列；</p>
<p>　　b）从该优先级队列中连续抽取两个频率最小的树分别作为左子树，右子树，将他们合并成一棵树（频率=两棵树频率之和），然后把这棵树插回队列中。</p>
<p>　　c）重复步骤b，每次合并都将使优先级队列的尺寸减小1，直到最后队列中只剩一棵树为止，就是我们需要的哈夫曼树。</p>
<p>&nbsp;</p>
<p>　　相关代码如下：</p>
<p>　　</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('da2a41b1-5dff-4851-897f-edc5408c8720')"><img class="code_img_closed" id="code_img_closed_da2a41b1-5dff-4851-897f-edc5408c8720" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /><img class="code_img_opened" id="code_img_opened_da2a41b1-5dff-4851-897f-edc5408c8720" style="display: none" onclick="cnblogs_code_hide('da2a41b1-5dff-4851-897f-edc5408c8720',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_build_Huffman_tree</span>
<div class="cnblogs_code_hide" id="cnblogs_code_open_da2a41b1-5dff-4851-897f-edc5408c8720">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;the&nbsp;Huffman&nbsp;tree&nbsp;from&nbsp;the&nbsp;array&nbsp;of&nbsp;frequencies<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;returns&nbsp;a&nbsp;pointer&nbsp;to&nbsp;the&nbsp;root&nbsp;node&nbsp;of&nbsp;the&nbsp;Huffman&nbsp;tree<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;根据字符频率数组，创建一个huffman树。返回根节点。</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;build_Huffman_tree(unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;freqs[NUM_CHARS])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;priority&nbsp;queue</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;HuffNodePriorityQueue&nbsp;priority_queue;<br />&nbsp;&nbsp;&nbsp;&nbsp;priority_queue.init();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;NUM_CHARS;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(freqs[i]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;node&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HuffNode;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="color: #000000">-&gt;</span><span style="color: #000000">c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;freqs[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="color: #000000">-&gt;</span><span style="color: #000000">left&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="color: #000000">-&gt;</span><span style="color: #000000">right&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;priority_queue.addItem(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000">"</span><span style="color: #800000">number&nbsp;of&nbsp;characters:&nbsp;%d\n</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;priority_queue.size);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;the&nbsp;Huffman&nbsp;tree</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(priority_queue.size&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;left&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;priority_queue.extractMin();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;right&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;priority_queue.extractMin();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HuffNode</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HuffNode;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;left</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;right</span><span style="color: #000000">-&gt;</span><span style="color: #000000">freq;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root</span><span style="color: #000000">-&gt;</span><span style="color: #000000">left&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root</span><span style="color: #000000">-&gt;</span><span style="color: #000000">right&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;priority_queue.addItem(root);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;return&nbsp;pointer&nbsp;to&nbsp;the&nbsp;root&nbsp;of&nbsp;the&nbsp;Huffman&nbsp;tree</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;priority_queue.extractMin();<br />}</span></div></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　d) 压缩数据；</p>
<p>　　我们已经建立了哈夫曼树，并根据哈夫曼树建立了字符的哈夫曼编码表，因此现在压缩数据的方法将是很显而易见的，我们遍历输入的文本，对每个字符，根据编码表依次把当前字符的编码写入到编码结果中去。为了能够解压缩，我们还需要在编码时写入一个文件头，这样我们在解码时能够重建（和编码时同样的）哈夫曼树。最终的文件格式定义如下：</p>
<p>&nbsp;</p>
<p>　　File Header（文件头）：</p>
<p>　　　　unsigned int size; 被编码的文本长度（字符数）；</p>
<p>　　　　unsigned char freqs[ NUM_CHARS ]; 字符频率表</p>
<p>&nbsp;</p>
<p>　　compressed; (Bits: 压缩后的数据）；</p>
<p>&nbsp;</p>
<p>　　注意：压缩后的Bits实际上必须以字节为最小单位。因此 Bits 需要向上取整到整数字节。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　2. 解压缩数据；</p>
<p>　　解压缩数据的过程是：</p>
<p>　　e) 读取文件头；</p>
<p>　　f）根据文件头重建哈夫曼树；（和压缩数据时的步骤一致，代码是复用的）</p>
<p>　　g）根据哈夫曼树读取并逐个字符解码；</p>
<p>&nbsp;</p>
<p>　　e) 读取文件头：</p>
<p>　　这一部是处于文件头的信息，文件头由输入文本的字节数和（已等比例压缩到一个字节）字符频率表组成。根据这些信息构建出字符频率表，这一步骤和压缩数据时一样。</p>
<p>　　g) 解码：</p>
<p>　　我们遍历编码后的Bits，每一次都从哈夫曼树的根节点出发，遇到0时，进入节点的左子树，遇到1时进入节点的右子树，直到到达叶子节点为止，并取得最终的字符。重复这一过程，知道所有字符都已经解码。</p>
<p>&nbsp;</p>
<p>　　最后，提供已经补充完整的代码文件和原PDF文档：</p>
<p>　　<a title="http://files.cnblogs.com/hoodlum1980/Huffman.rar" href="http://files.cnblogs.com/hoodlum1980/Huffman.rar" target="_blank">http://files.cnblogs.com/hoodlum1980/Huffman.rar</a></p>
<p>　　</p>
<p>　　当我们使用上面的代码对&#8220;aabbbccccdddddd&#8221;进行哈夫曼编码时，程序产生的输出如下：</p>
<p>　　<strong>size of input: 15<br /></strong>　　char: a freq: 2<br />　　char: b freq: 3<br />　　char: c freq: 4<br />　　char: d freq: 6</p>
<p>　　number of characters: 4</p>
<p>&nbsp;</p>
<p>　　<strong>character encodings:<br /></strong>　　char: a code: 110<br />　　char: b code: 111<br />　　char: c code: 10<br />　　char: d code: 0</p>
<p>&nbsp;</p>
<p>　　<strong>compressed string: (size: 32 bit) //注意后三个Bit 不携带信息，仅为了补齐成 8 Bits 整数倍；<br /></strong>　　11011011111111110101010000000101</p>
<p><br />&nbsp;</p>
<p>　　size of compressed string: 15<br />　　number of characters: 4<br /></p>
<p>　　<strong>uncompressed string: (size: 120 bit)</strong></p>
<p>　　aabbbccccdddddd</p>
<p><br />&nbsp;</p>
<p>　　【备注】程序也可以接收一个命令行参数（文本文件的文件名）作为输入，在编码后保存成一个二进制文件，然后再从该二进制文件解码并保存到另一个新的文本文件。<br /></p> <img src="http://www.cnblogs.com/hoodlum1980/aggbug/1665112.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/06/1665112.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/06/1665112.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>制作一个倒计时窗口</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664541.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Fri, 05 Feb 2010 08:57:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664541.html</guid><description><![CDATA[<p>阅读: 16 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-02-05 16:57 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664541.html" target="_blank">原文链接</a></p><p>　　这一次我来讲解一个非常简单的倒计时效果（没太大技术含量，所以最初原文发于我的QQZone中）。它的应用场景是这样的，它是一个&#8220;全局&#8221;性质的提醒，以一种醒目的方式告知用户某个重要事件即将发生，同时不打断用户的当前操作。视觉效果是在屏幕的正中间显示一个正在倒数的数字，如下：</p>
<p>　　　　<img height="261" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/CountDownDlg.jpg" width="430" border="0" /></p>
<p>&nbsp;</p>
<p>　　</p>
<p>　　然后我们随便用VC创建一个win32应用程序项目，倒计时的数字实际上是用一个窗口来呈现的，也就是在程序中的一个对话框。因此在资源中插入一个对话框，删除掉对话框上的任何控件，然后设置它的属性为 toolwindow，边框为 none。</p>
<p>&nbsp;</p>
<p>　　我们可以使用 GDI 在窗口上绘制出倒计时的数字，如果像我一样想要追求更漂亮点的显示效果，我使用了自定义的图片，包括两张位图，一个是绘制了0~9所有我们需要的数字的图片，另一个是窗口的背景（边框）。如下图所示(图片有所缩小)：</p>
<p>&nbsp;</p>
<p>　　背景： <img height="52" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/IDB_COUNTDOWNBKGND.jpg" width="69" border="0" />&nbsp;</p>
<p>　　数字： <img height="47" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/IDB_COUNTDOWN.jpg" width="300" border="0" /></p>
<p>　　</p>
<p>　　倒计时窗口需要有以下窗口样式： </p>
<p>&nbsp;　　</p>
<p>　　WS_EX_TOOLWINDOW: 这个可以在设置窗口属性中打钩设置好。toolwindow的本意通常是指那些可以浮动的工具栏窗口，它们的特点是标题栏比普通窗口要窄，标题栏的标题字体也比普通窗口的标题字体小。最关键的特征是，这种窗口不会在任务栏上显示按钮，也不会出现在Alt-Tab窗口列表中。这正是我们需要这个样式的原因。　</p>
<p>&nbsp;</p>
<p>　　WS_EX_LAYERED: 图层窗口。这样我们就可以指定窗口的透明度和透明色。比如背景位图中的圆角处我们使用洋红填充，这样窗口上具有透明色的地方就不会显示出来。同时可以设置窗口使它们具有半透明效果。</p>
<p>&nbsp;</p>
<p>　　WS_EX_TRANSPARENT: &#8220;透明&#8221;的窗口。这个透明不是说视觉上，而是在于鼠标事件上透明。也就是说，我们的窗口不希望接收鼠标事件，不希望拥有焦点，因为倒计时窗口仅仅用于显示信息，不希望干扰用户的正常操作（比如他们正在聊天或者编辑文档）。这样，鼠标在窗口上移动或者点击时，消息都将被发送到下面的窗口。</p>
<p>&nbsp;</p>
<p>　　WS_EX_TOPMOST: 顶层窗口。这个简单了，就是永远在最上面的窗口。这个属性我们本质上通过SetWindowPos API 函数设置上去。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　在原文中我还讲解了很多很基本的东西，比如函数中的 static 的局部变量， QQMUSIC的歌词窗口的实现等。由于这些东西很简单，就不详细陈列了。</p>
<p>以下是其中一条：</p>
<p>　</p>
<p>　　假设有一个大矩形 rcBig，一个小矩形 rcSmall，我们把小矩形居中的放在大矩形中央，那么小矩形的左上角坐标（以大矩形的左上角为原点）是多少？答案是： </p>
<p>&nbsp;</p>
<p>　　left = (rcBig.width - rcSmall.widht) /2;</p>
<p>　　top = (rcBig.height - rcSmall.height)/2;</p>
<p>　　</p>
<p>　　这个计算式在界面布局时经常用到。同理，在上面的绘制代码中我们也是用这种方法定位每个数字的左上角坐标的。也是用这个方法去设置窗口在屏幕上居中的。　　</p>
<p>　　下面我们补充一下源代码的下载连接：</p>
<p>　　<a title="http://files.cnblogs.com/hoodlum1980/StretchBlt.rar" href="http://files.cnblogs.com/hoodlum1980/StretchBlt.rar" target="_blank">http://files.cnblogs.com/hoodlum1980/StretchBlt.rar</a></p>
<p>&nbsp;</p>
<p>　　========================================</p>
<p>　　补充一则：把一个 int 数字 n &nbsp;格式化成16进制的字符串(前面补零成0位)：</p>
<p>&nbsp;</p>
<p>　　例如，输入n=10，要求输出 0x0000000A;</p>
<p>&nbsp;</p>
<p>　　C++:&nbsp; sprintf( buffer, "0x%08X", n);</p>
<p>　　C#:&nbsp;&nbsp;&nbsp; string s = string.Format( "0x{0:X08}", n);</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1664541.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664541.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664541.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>使用 ADO 向数据库中存储一张图片</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664481.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Fri, 05 Feb 2010 07:57:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664481.html</guid><description><![CDATA[<p>阅读: 9 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-02-05 15:57 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664481.html" target="_blank">原文链接</a></p><p>　　我们将向一个典型SQL数据库中的某表的 Image 类型的字段（假设字段名称为&#8220;PHOTO&#8221;）存储一副图片，实际上 Image 字段是一种二进制流，它是由应用程序负责解释的。因此在这里我们是将其当作 jpg 图像文件。换句话说，把 jpg 文件的原始字节流存储到 Image 字段中去。由于通过内存中转，显然，这种文件的尺寸不宜过大。</p>
<p>　　我们假设在一个CImage对象中已经加载的就是要保存的图片，同时也打开了相应表的一个用于插入记录的记录集指针 （_RecordsetPtr ）。<br /></p>
<p>　　则相关代码如下：</p>
<p>　　</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('72dfedc1-61f7-42f8-8e34-01a887dd730d')"><img class="code_img_closed" id="code_img_closed_72dfedc1-61f7-42f8-8e34-01a887dd730d" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_72dfedc1-61f7-42f8-8e34-01a887dd730d" style="display: none" onclick="cnblogs_code_hide('72dfedc1-61f7-42f8-8e34-01a887dd730d',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">代码</span>
<div class="cnblogs_code_hide" id="cnblogs_code_open_72dfedc1-61f7-42f8-8e34-01a887dd730d">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">存储图片</span><span style="color: #008000"><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;SaveImage(CImage&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">lpImg,&nbsp;_RecordsetPtr&nbsp;pRecordset,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;errormsg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">估算图像需要的内存大小，这里当作&nbsp;BMP&nbsp;格式来估算的，所以结果比实际需要的更大。</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SIZE_T&nbsp;buffersize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetWidth()&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;lpImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetHeight()&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;lpImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP()</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(BITMAPINFO);<br />&nbsp;&nbsp;&nbsp;&nbsp;HGLOBAL&nbsp;hMem&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GlobalAlloc(GMEM_FIXED,&nbsp;buffersize);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(hMem&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IStream</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateStreamOnHGlobal(hMem,&nbsp;FALSE,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pStream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pStream&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULARGE_INTEGER&nbsp;fileLength;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.QuadPart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Save(pStream);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">写入内存流<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取当前文件的位置</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStream</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Seek(temp,&nbsp;STREAM_SEEK_CUR,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">fileLength);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;nLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(ULONG)(fileLength.QuadPart</span><span style="color: #000000">+</span><span style="color: #800080">1</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFEARRAY</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;psa;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFEARRAYBOUND&nbsp;rgsabound[</span><span style="color: #800080">1</span><span style="color: #000000">];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgsabound[</span><span style="color: #800080">0</span><span style="color: #000000">].lLbound&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgsabound[</span><span style="color: #800080">0</span><span style="color: #000000">].cElements&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nLength;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">VT_UI1&nbsp;:&nbsp;Variable&nbsp;type&nbsp;is&nbsp;unsigned&nbsp;char.&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;psa&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SafeArrayCreate(VT_UI1,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;rgsabound);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">锁定内存</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">lpBytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(BYTE</span><span style="color: #000000">*</span><span style="color: #000000">)GlobalLock(hMem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">lpTemp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBytes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(LONG&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;nLength;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SafeArrayPutElement&nbsp;(psa,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">i,&nbsp;lpTemp</span><span style="color: #000000">++</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">解锁内存</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hMem);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARIANT&nbsp;varBLOB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varBLOB.vt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;VT_ARRAY&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;VT_UI1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varBLOB.parray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;psa;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">存储</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRecordset</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Fields</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetItem(</span><span style="color: #800000">"</span><span style="color: #800000">PHOTO</span><span style="color: #800000">"</span><span style="color: #000000">)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AppendChunk(varBLOB);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStream</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SafeArrayDestroyData(psa);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hMem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(errormsg,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">CreateStreamOnHGlobal&nbsp;Failed</span><span style="color: #800000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">释放全局内存</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hMem);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(errormsg,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">GlobalAlloc&nbsp;Failed!</span><span style="color: #800000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />}</span></div></div></div>
<p>&nbsp;</p>
<p>　　下面再列举一下，如何从 image 字段中读取内容，并把它保存到一个磁盘上的普通文件。假设表具有一个自增的数字主键（&#8220;ID&#8221;）。</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('4017287f-f8f6-4e6b-b3c3-63baf9bf7c93')"><img class="code_img_closed" id="code_img_closed_4017287f-f8f6-4e6b-b3c3-63baf9bf7c93" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /><img class="code_img_opened" id="code_img_opened_4017287f-f8f6-4e6b-b3c3-63baf9bf7c93" style="display: none" onclick="cnblogs_code_hide('4017287f-f8f6-4e6b-b3c3-63baf9bf7c93',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">代码_ReadImage</span>
<div class="cnblogs_code_hide" id="cnblogs_code_open_4017287f-f8f6-4e6b-b3c3-63baf9bf7c93">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">id：主键</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ReadImg(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;_RecordsetPtr&nbsp;pRs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_ConnectionPtr&nbsp;pConnection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp;varChunk;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">连接字符串</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_bstr_t&nbsp;strCnn(</span><span style="color: #800000">"</span><span style="color: #800000">Provider=SQLOLEDB;Server=...;Database=...;User&nbsp;ID=...;Password=...;</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Open&nbsp;a&nbsp;connection&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pConnection.CreateInstance(__uuidof(Connection));&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pConnection</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Open(strCnn,</span><span style="color: #800000">""</span><span style="color: #000000">,</span><span style="color: #800000">""</span><span style="color: #000000">,NULL);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRs.CreateInstance(__uuidof(Recordset));&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">表名略</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;cmdText[</span><span style="color: #800080">128</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(cmdText,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">select&nbsp;PHOTO&nbsp;from&nbsp;...&nbsp;where&nbsp;ID&nbsp;=&nbsp;%d</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRs</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Open(cmdText,_variant_t((IDispatch&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)&nbsp;pConnection,</span><span style="color: #0000ff">true</span><span style="color: #000000">),adOpenKeyset,adLockOptimistic,adCmdText);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">read&nbsp;data&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;lPhotoSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pRs</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Fields</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetItem(</span><span style="color: #800000">"</span><span style="color: #800000">PHOTO</span><span style="color: #800000">"</span><span style="color: #000000">)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ActualSize;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;llsRead&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp;varChunk;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;buf[ChunkSize];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000">"</span><span style="color: #800000">lDatalength&nbsp;=&nbsp;%ld\n</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;lPhotoSize);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">保存到C盘</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;filename[</span><span style="color: #800080">128</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(filename,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">C:\\ID_%d.jpg</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fopen(filename,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">wb</span><span style="color: #800000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(lPhotoSize&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;llsRead&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lPhotoSize&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;ChunkSize</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;ChunkSize:lPhotoSize;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varChunk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pRs</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Fields</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetItem(</span><span style="color: #800000">"</span><span style="color: #800000">PHOTO</span><span style="color: #800000">"</span><span style="color: #000000">)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetChunk(llsRead);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;index&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;index&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;llsRead;&nbsp;index</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SafeArrayGetElement(varChunk.parray,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">index,&nbsp;buf</span><span style="color: #000000">+</span><span style="color: #000000">index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(buf,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;llsRead,&nbsp;stream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lPhotoSize&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;llsRead;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(stream);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000">"</span><span style="color: #800000">Save&nbsp;File&nbsp;Complete:&nbsp;%s\n</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRs</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Close();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pConnection</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Close();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(_com_error&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Notify&nbsp;the&nbsp;user&nbsp;of&nbsp;errors&nbsp;if&nbsp;any.&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bstr_t&nbsp;bstrSource(e.Source());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bstr_t&nbsp;bstrDescription(e.Description());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;sError;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sError.Format(_T(</span><span style="color: #800000">"</span><span style="color: #800000">Source&nbsp;:&nbsp;%s&nbsp;\n&nbsp;Description&nbsp;:&nbsp;%s\n</span><span style="color: #800000">"</span><span style="color: #000000">),(LPCSTR)bstrSource,(LPCSTR)bstrDescription);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">AfxMessageBox(sError);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">printf("%s\n",&nbsp;sError);</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div></div>
<p>&nbsp;</p>
<p><br />&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1664481.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664481.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/02/05/1664481.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>解决 StretchBlt 产生的像素堆积问题</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Tue, 26 Jan 2010 14:50:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html</guid><description><![CDATA[<p>阅读: 33 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-01-26 22:50 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html" target="_blank">原文链接</a></p><p>　　==========================================================</p>
<p>　　补充说明： 　　-- hoodlum1980 2010年1月28日<br /></p>
<p>　　========================================================== <br /></p>
<p>　　我很快发现这篇文章实际上意义不大了。因为这是因为没有设置我们需要的拉伸模式导致的问题。</p>
<p>　　图像失真是由于 StretchBlt 的默认模式是 BLACKONWHITE：（对产生重叠的像素进行AND操作）导致的。事实上解决这个问题的正确方式是在 StretchBlt 之前调用 SetStretchBltMode 函数设置模式，下文中采用的方法实际上是 COLORONCOLOR 模式（即删除像素），这种模式将完全舍弃那些产生重叠的行列信息。下面解释一下这些模式：（内容来自 MSDN）</p>
<p>　　</p>
<p><strong>BLACKONWHITE</strong></p>
<p>　　在保留像素和损失像素之间执行逻辑与（AND）操作。如果图片是单色位图，则被舍弃的黑色像素会在被保留的白色像素上保持黑色。 <br /></p>
<p>&nbsp;</p>
<p><strong>COLORONCOLOR</strong></p>
<p>　　删除像素。不保留那些被舍弃行列上的像素信息。 （备注：即本文后面采用的下采样方式）<br /></p>
<p>&nbsp;</p>
<p><strong>HALFTONE</strong></p>
<p>　　把源矩形中的像素映射到目标矩形时，使像素的平均值近似相同。使用这种模式，应用程序必须然后调用<strong>&nbsp; SetBrushOrgEx</strong> 校正画刷起始点，否则可能产生偏差。<br /></p>
<p>&nbsp;</p>
<p><strong>WHITEONBLACK</strong></p>
<p>　　在保留像素和损失像素之间执行逻辑或（OR）操作。如果图片是单色位图，则被舍弃的白色像素会在被保留的黑色像素上保持白色。 <br /></p>
<p><br /></p>
<p>　　在拉伸绘制时，我们应该先进行模式设置：<br /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; &nbsp; hdc = BeginPaint(hWnd, &amp;ps);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; &nbsp; <strong>SetStretchBltMode</strong>( hdc,&nbsp; <span style="color: red">HALFTONE </span>);<br />&nbsp;&nbsp;&nbsp;&nbsp; HDC hMemDC = CreateCompatibleDC(hdc);<br />&nbsp;&nbsp;&nbsp;&nbsp; SelectObject(hMemDC, m_Bitmap);<br />&nbsp;&nbsp;&nbsp;&nbsp; <strong>StretchBlt</strong>( hdc, 0, 0, 102, 136, hMemDC, 0, 0, 331,372, SRCCOPY );<br />&nbsp;&nbsp;&nbsp;&nbsp; DeleteDC(hMemDC);</p>
<p>　　EndPaint(hWnd, *ps); <br /></p>
<p>&nbsp;</p>
<p>　　以下是原文内容： <br /></p>
<p>　　======================<br /></p>
<p>&nbsp;</p>
<p>　　本文所提到的问题是一个在实际项目中遇到的问题，在 VC 中，通过 StretchBlt 函数来完成缩小位图，将导致像素堆积（效果可参考下图）。具体体现就是 GDI 可能在 StretchBlt 的实现是比较简单的，导致使用拉伸绘制后的图像分辨率严重失真，以至于不能符合应用的要求。因此我们必须解决这个问题。（PS：在我印象中，可能在 GDI+ 中是不存在这个问题的。）</p>
<p>　　问题出现时，最开始我以为是在保存过程中的图像压缩质量导致的问题，但我把图像质量设置到 100% 时，图像质量依然没有任何改善，然后我发现其实图像质量的降低是发生在 StretchBlt 这一步，（DestRect 比原图小）一旦做了这个操作 ，则图像就变得面目全非，难以辨认细节。因此我很快的在网上搜索一些资料，也想过是不是要放弃CImage，该用网上的开源的CxImage。最终我采用的是在《<strong>CTreeCtrl和CListCtrl复杂控件的综合使用</strong>》一文中使用的方法：在matlab中叫做重采样（上采样-updample，下采样-downsample）。<br /></p>
<p>　　在GDI中，如果是放大的拉伸绘制，产生的结果就是像素被线性放大，将出现明显锯齿，实际上问题不大。（一般的应用程序在放大图像时， 会在像素方格内进行线性插值来柔和图像。）因此本文主要讨论的是缩小的拉伸绘制。</p>
<p>　　缩小的拉伸绘制的原理非常简单，就是把图像缩小以后，我们把目标图像上的每个像素，按缩放比例去原图中选取相应像素，拷贝到目标图像中。 为了加快操作，我们使用图像的数据块进行操作。（在.NET中对应的大概是Bitmap.LockBits）<br /></p>
<p>　　代码如下：</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('46b7a216-3cc2-446f-aa9b-00a3018290e8')"><img class="code_img_closed" id="code_img_closed_46b7a216-3cc2-446f-aa9b-00a3018290e8" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_46b7a216-3cc2-446f-aa9b-00a3018290e8" style="display: none" onclick="cnblogs_code_hide('46b7a216-3cc2-446f-aa9b-00a3018290e8',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_stretchbltfast</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_46b7a216-3cc2-446f-aa9b-00a3018290e8">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">缩放复制</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;StretchBltFast(CImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pDest,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;xDest,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;yDest,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cxDest,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cyDest,&nbsp;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pSrc,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;xSrc,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ySrc,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cxSrc,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cySrc)<br /></span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,j,k;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pBitsSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)(pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBits());&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据块起始位置</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pBitsDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)(pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBits());</span><span style="color: #008000">//</span><span style="color: #008000">数据块起始位置</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pixAddrSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBitsSrc;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pixAddrDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBitsDest;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;strideSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetPitch();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">pitch有时为负</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;strideDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetPitch();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bytesPerPixelSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP()</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bytesPerPixelDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP()</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;cyDest;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;cxDest;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixAddrSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBitsSrc&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;(j&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cySrc&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;cyDest)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;strideSrc&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cxSrc&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;cxDest)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;bytesPerPixelSrc;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixAddrDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBitsDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;strideDest&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;j&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;bytesPerPixelDest;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">复制当前像素</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(k&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;k&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;bytesPerPixelDest;&nbsp;k</span><span style="color: #000000">++</span><span style="color: #000000">,&nbsp;pixAddrDest</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pixAddrDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pixAddrSrc;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">是否可以移动到下一个通道？</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(k&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;bytesPerPixelSrc&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)&nbsp;pixAddrSrc</span><span style="color: #000000">++</span><span style="color: #000000">;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">}</span></div></div></div>
<p><br /></p>
<p>　　使用上面的重采样方法和GDI的StretchBlt方法绘制的图像效果如下：（可见重采样方法的效果是要好过StretchBlt）</p>
<p>　　<img height="157" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/CImage_StretchBlt.jpg" width="257" /> <br /></p>
<p><br /></p>
<p>　　补充一些其他讨论：</p>
<p>　　（1）MSDN中提到CImage可以使用32bpp的图片进行 alpha 合成， 即使用第四个通道作为每个像素的 alpha 值。本质上是通过调用 AlphaBlend 来实现的。根据 AlphaBlend 函数的要求，在绘制（draw）前必须预先把alpha通道应用到位图的RGB通道上（RGB*Alpha/255); 绘制结果如下所示：</p>
<p><br />&nbsp;</p>
<p>　　<img height="297" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/155252/o_CImage_Channels02.jpg" width="500" border="0" /></p>
<p>&nbsp;</p>
<p>　　预先应用alpha通道将改变RGB通道中的数据，代码如下所示：</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('53f356d1-382f-46f0-9957-e52cb251c50f')"><img class="code_img_closed" id="code_img_closed_53f356d1-382f-46f0-9957-e52cb251c50f" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_53f356d1-382f-46f0-9957-e52cb251c50f" style="display: none" onclick="cnblogs_code_hide('53f356d1-382f-46f0-9957-e52cb251c50f',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">Code_PreMultiplied</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_53f356d1-382f-46f0-9957-e52cb251c50f">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">对CImage预先应用alpha通道</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;PreMultiplied(CImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pImg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pPixel;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">必须是32bpp</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">32</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pBytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBits();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;stride&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetPitch();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;width&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetWidth();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;height&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetHeight();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(j</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">height;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">width;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBytes&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;stride&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">4</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixel[</span><span style="color: #800080">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(BYTE)((UINT)pPixel[</span><span style="color: #800080">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pPixel[</span><span style="color: #800080">3</span><span style="color: #000000">]</span><span style="color: #000000">/</span><span style="color: #800080">0xff</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixel[</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(BYTE)((UINT)pPixel[</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pPixel[</span><span style="color: #800080">3</span><span style="color: #000000">]</span><span style="color: #000000">/</span><span style="color: #800080">0xff</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixel[</span><span style="color: #800080">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(BYTE)((UINT)pPixel[</span><span style="color: #800080">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pPixel[</span><span style="color: #800080">3</span><span style="color: #000000">]</span><span style="color: #000000">/</span><span style="color: #800080">0xff</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div></div>
<p>&nbsp;</p>
<p>　　在上图中，左上角是一个32bpp的图像绘制结果。 在下方我分别绘制了 0，1，2，3 每个通道的图像（转变成灰度图像），其中RGB通道是在应用Alpha通道前的数据。（可以事先创建一个24bpp的同等大小图像去接收某个通道数据）<br /></p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('15f2d6c7-3a57-45ee-8fc7-a6c652e13666')"><img class="code_img_closed" id="code_img_closed_15f2d6c7-3a57-45ee-8fc7-a6c652e13666" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_15f2d6c7-3a57-45ee-8fc7-a6c652e13666" style="display: none" onclick="cnblogs_code_hide('15f2d6c7-3a57-45ee-8fc7-a6c652e13666',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_getchannel</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_15f2d6c7-3a57-45ee-8fc7-a6c652e13666">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">获取指定的通道，填充到pDest中（灰度图像）</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GetChannel(CImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pDest,&nbsp;CImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pSrc,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;channel)<br /></span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;j,&nbsp;k;</span></div>
<div><span style="color: #000000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pPixelDest,&nbsp;pPixelSrc;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pBytesDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBits();<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;pBytesSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBits();</span></div>
<div><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;strideDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetPitch();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;strideSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetPitch();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;width&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetWidth();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;height&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetHeight();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bppDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDest</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bppSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSrc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBPP();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(j</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">height;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">width;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixelSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBytesSrc&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;strideSrc&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">*</span><span style="color: #000000">bppSrc</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;channel;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixelDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBytesDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;strideDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">*</span><span style="color: #000000">bppDest</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(k</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;k&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;bppDest</span><span style="color: #000000">/</span><span style="color: #800080">8</span><span style="color: #000000">;&nbsp;k</span><span style="color: #000000">++</span><span style="color: #000000">,&nbsp;pPixelDest</span><span style="color: #000000">++</span><span style="color: #000000">)<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pPixelDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pPixelSrc;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000">}</span></div></div>&nbsp;<br /></div>
<p><br /></p>
<p>&nbsp;</p>
<p>&nbsp;　　本文参考以下资料：</p>
<p>　　（1） <a title="CTreeCtrl和CListCtrl复杂控件的综合使用" href="http://www.comprg.com.cn/detail.asp?hw_id=7259" target="_blank">CTreeCtrl和CListCtrl复杂控件的综合使用</a> ； <br /></p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1657098.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>为应用程序制作帮助文件</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/01/13/1645977.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Tue, 12 Jan 2010 17:05:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/01/13/1645977.html</guid><description><![CDATA[<p>阅读: 153 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-01-13 01:05 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/13/1645977.html" target="_blank">原文链接</a></p><p>　　本文简要介绍如何为应用程序制作一个帮助文件。</p><p>　　我们需要借助的工具软件清单如下：</p><p>　　（1）支持Rtf格式的文字处理软件，例如 Office 中的Word。</p><p>　　（2）Help WorkShop。（由VC6携带安装的一个工具）<br /></p><p>&nbsp;</p><p>　　步骤1：用文字处理软件编辑你的帮助文件（*.rtf)，这个文件定义你的帮助文件中的一些主题（Topic），每个topic实际上就是用WinHelp显示的一个页面。这一部本质上就属于文字处理了，只是你需要在保存的时候选择rtf格式。需要特别掌握的是以下几点：<br /></p><p>&nbsp; <br /></p><p>　　每个topic结束后追加一个分页符。 在每个topic的最前面可以添加以下脚注（添加的脚注请使用以下编号）：<br /></p><p>　　#：你的topic的一个唯一标识符，它是必须的，也是做链接时需要用到的。<br /></p><p>　　K：定义该topic的关键字，用英文分号分割；</p><p>　　$：定义该topic的标题，它将显示在winhelp的历史窗口，查找等地方。 <br /></p><p>&nbsp;</p><p>　　制作链接时，把链接的文本用双下划线格式，然后在文本后面添加一段隐藏文本，输入要链接的topic的唯一标示符。 <br /></p><p>&nbsp;</p><p>　　制作出来的rtf文档效果如下图所示： 下图显示的是帮助文件的目录，里面包含了到每个topic的链接。 <br /></p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_01.jpg" width="348" height="277" /> <br /></p><p>&nbsp;</p><p>　　下图显示的是为某个topic添加的脚注：</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_02.jpg" width="279" height="185" /> <br /></p><p>　　（2）创建一个Help项目：打开 Microsoft help workshop 软件， 点击File -&gt; New -&gt;选择 Help Project；<br /></p><p>　　建立好项目以后，我们可以使用右侧的那些按钮去设置这个项目的一些信息，过程很简单，这里就不详细介绍了， 细节可以查阅 help workshop 的帮助文件。设置好的项目如下图所示：<br /></p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_03.jpg" width="592" height="375" /> <br /></p><p>&nbsp;</p><p>　　（3）先把项目保存，然后我们用help workshop 创建帮助文件的内容文件（*.cnt)。 使用菜单 File-&gt;New-&gt; 选择help Contents。然后我们添加目录（Head，一本书的图标）和Topic（文件图标），使用 MoveLeft 和 MoveRight 按钮可以修改缩进。做好的 Contents 效果如下图所示：<br /></p><p>&nbsp;</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_04.jpg" width="479" height="375" /> <br /></p><p>&nbsp;</p><p>　　（4）把 contents文件保存，然后打开刚才的help Project， 在Options的 Files 标签页中填加 Contents 文件。如下图所示：<br /></p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_05.jpg" width="344" height="397" /> <br /></p><p>&nbsp;</p><p>　　然后我们点击&#8220; Save and compile &#8221; 按钮编译帮助文件，编译成功以后，通过菜单 File -&gt; Run Winhelp 可以看到我们做的帮助文件的效果如下图所示：<br /></p><p>&nbsp;</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_06.jpg" width="418" height="294" /> <br /></p><p>&nbsp;</p><p>　　帮助文件基本做好了，现在我们为我们的应用程序添加对帮助的支持，首先我们在资源中打开窗口的菜单资源，在帮助菜单下添加下面几项：<br /></p><p>　　帮助主题（IDM_HELPCONTENTS), 内容（IDM_HELPCONTENTS），搜索帮助（IDM_HELPSEARCH），然后我们在窗口过程中处理WM_COMMAND消息时添加对这几个菜单的处理，相关代码如下：<br /></p><p>&nbsp;</p><div class="cnblogs_code" onclick="cnblogs_code_show('06c935ae-0adb-45d9-b7d3-d0ca45b97b93')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_06c935ae-0adb-45d9-b7d3-d0ca45b97b93"  alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_06c935ae-0adb-45d9-b7d3-d0ca45b97b93" onclick="cnblogs_code_hide('06c935ae-0adb-45d9-b7d3-d0ca45b97b93',event)" style="display: none;"><span class="cnblogs_code_collapse">code_wndproc</span><div id="cnblogs_code_open_06c935ae-0adb-45d9-b7d3-d0ca45b97b93" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000;">//</span><span style="color: #008000;">获取和程序位于同一个目录下文件的绝对路径</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;GetAppFolderFileName(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buffer,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;shortFileName)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pChar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;GetModuleFileName(NULL,&nbsp;buffer,&nbsp;MAX_PATH);<br />&nbsp;&nbsp;&nbsp;&nbsp;pChar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strrchr(buffer,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">\\</span><span style="color: #800000;">'</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pChar&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pChar&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1</span><span style="color: #000000;">,&nbsp;shortFileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />LRESULT&nbsp;CALLBACK&nbsp;WndProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;message,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;ctlId,&nbsp;wmEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(message)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_HELP:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">F1</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取和程序位于同一个目录下文件的绝对路径</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[MAX_PATH];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAppFolderFileName(buffer,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">RFCARD.HLP</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WinHelp&nbsp;(hWnd,&nbsp;buffer,&nbsp;HELP_CONTENTS,(DWORD)</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_COMMAND:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctlId&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LOWORD(wParam);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmEvent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;HIWORD(wParam);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(ctlId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;IDM_HELPTOPICS:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"Help&nbsp;Topics..."</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[MAX_PATH];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAppFolderFileName(buffer,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">RFCARD.HLP</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WinHelp&nbsp;(hWnd,&nbsp;buffer,&nbsp;HELP_FINDER,(DWORD)</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;IDM_HELPCONTENTS:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"Contents"</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[MAX_PATH];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAppFolderFileName(buffer,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">RFCARD.HLP</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WinHelp&nbsp;(hWnd,&nbsp;buffer,&nbsp;HELP_CONTENTS,(DWORD)</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;IDM_HELPSEARCH:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"Search&nbsp;for&nbsp;Help&nbsp;On..."</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[MAX_PATH];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAppFolderFileName(buffer,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">RFCARD.HLP</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WinHelp(hWnd,&nbsp;buffer,&nbsp;HELP_PARTIALKEY,&nbsp;(DWORD)(LPSTR)</span><span style="color: #800000;">""</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;DefWindowProc(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span></div></div></div><p><br /></p><p>　　然后我们重新编译我们的应用程序，成功以后，可以在应用程序处于前台时按下F1键（程序将收到WM_HELP消息），或者点击帮助下面的菜单，查看效果可能如下图所示：<br /></p><p>&nbsp;　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_08.jpg" width="434" height="404" /></p><p>&nbsp;</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_07.jpg" width="434" height="404" /> <br /></p><p>&nbsp;</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/myhelp_10.jpg" width="475" height="329" /> <br /></p><p>&nbsp;</p><p>　　本文参考以下资料：</p><p>　　（1）崔晓阳，实例简述Hlp帮助文件的制作，《农业网络信息》2007年第9期。</p><p>　　（2）MSDN：ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/dnwui/html/msdn_generic.htm</p><p>　　　　Robert B. Hess, Generic: Anatomy of a Simple Win32 Application, Windows User Interface Technical Articles, October 17, 1994;　</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1645977.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/13/1645977.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/13/1645977.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>对“一道刁钻面试题”的VC解答</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/01/11/1643833.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Mon, 11 Jan 2010 01:53:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/01/11/1643833.html</guid><description><![CDATA[<p>阅读: 249 评论: 5 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-01-11 09:53 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/11/1643833.html" target="_blank">原文链接</a></p><p>　　　　该题目的出处是：<a title="&#8220;一道比较刁的面试题&#8221;" href="http://www.cnblogs.com/tandly/archive/2010/01/08/1642609.html" target="_blank">&#8220;一道比较刁的面试题&#8221;</a>，<a href="http://www.cnblogs.com/tandly/archive/2010/01/08/1642609.html" target="_blank">http://www.cnblogs.com/tandly/archive/2010/01/08/1642609.html</a>　　</p>
<p>　　　　要求：</p>
<p>　　　　1.任何语言 任何形式（web,winform,flash,flex,silverlight）等等。。</p>
<p>　　　　2.实现内容</p>
<p>　　　　　　a.初始化一个面板，面板内随机分布着一些按钮&nbsp; 按钮上有一些随机的数字。</p>
<p>　　　　　　b.有一个按钮 名字叫&#8220;新增节点&#8221; 点击 该按钮后 可以向面板内随机添加新的 按钮。</p>
<p>　　　　　　c.任意顺序点击面板内的按钮。按顺序将所点按钮用线条连接。并且将按钮的 数值进行累加 显示到 文本框。</p>
<p>　　　　　　d.回放 功能。 有一个名叫 &#8220;回放的按钮&#8221; 点击该按钮后 将所有操作慢动作回放。包括增加节点 和 连接 的一切操作。完整再现。</p>
<p>&nbsp;</p>
<p>　　　　我在前几天看到这个题目，自觉是不难，也有一些人说到用到链表，这是不错的。而且这些实现起来并不是那么难，只是需要一定的耐心。而吸引我要把它用VC实现出来的，并不是这几个功能本身，而是如何在两个按钮之间绘制一个箭头型的连线，吸引了我的兴趣。为什么这么说呢，因为按钮随机出现，因此最简单的方法，我在两个按钮的中心点绘制一条线段就可以了，这样当然是最简单的。不过我还想让显示效果更理想化一点，也就是在被指向按钮的线段端点绘制一个三角形的箭头，并且：这个箭头不能覆盖到按钮上，也就是我希望箭头连接到按钮的矩形边框上面，做好的程序如下图所示：</p>
<p>&nbsp;</p>
<p>　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/Rebar_01.jpg" border="0" /></p>
<p>&nbsp;</p>
<p>　　　　在上图中，可以看到实际上每个箭头都是连接按钮的中心点的，而且箭头被准确的绘制在合适的位置（上图的按钮有些小，所以效果不够明显）。因此，这里的关键是要计算出连接线和按钮边框的交点。我是这样来做的：首先，在创建按钮时，我以按钮的中心点为圆点，计算出中心点到四个顶点的四条射线的角度，由于我是使用 atan 函数来计算两个按钮连线的角度，因此射线的角度也使他落在（-90~270）范围。如下图示意：</p>
<p>&nbsp;</p>
<p>　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/Rebar_02.jpg" width="381" border="0" height="277" /></p>
<p>&nbsp;</p>
<p>　　　　上图的圆周范围是从-90到270度，采用的坐标都是计算机的屏幕坐标为准（Y正方向向下，和数学中的笛卡尔坐标的Y轴方向相反），角度的正方向也是顺时针（也是和数学中的方向反向）。为了简单直观，上面的角度都使用角度表示，在实际代码中都是采用弧度。大致方法是：</p>
<p>　　　　（1）首先计算出两个按钮中心连线的夹角（-90~270）；</p>
<p>　　　　（2）根据夹角和按钮信息中的 四个对角线射线角 （angle[4]）的大小关系，判断出连线和按钮相交与哪一个边缘。</p>
<p>　　　　（3）由于按钮边缘上的x，y至少有一个是可知的，因此根据 alpha 角度计算出交点坐标的位置。</p>
<p>&nbsp;</p>
<p>　　　　大概过程如上，因此代码也就会很直观了：</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('041fbb45-5d48-4aca-bc78-215f1a05a478')"><img class="code_img_closed" id="code_img_closed_041fbb45-5d48-4aca-bc78-215f1a05a478" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_041fbb45-5d48-4aca-bc78-215f1a05a478" style="display: none;" onclick="cnblogs_code_hide('041fbb45-5d48-4aca-bc78-215f1a05a478',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">CODE_BUTTON_AND_LINE</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_041fbb45-5d48-4aca-bc78-215f1a05a478">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000;">//</span><span style="color: #008000;">描述一个按钮</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CNumButton<br />{<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,top,right,bottom;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">按钮的对角线的4个角度</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;angle[</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br />...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">指定按钮的中心点和高度，宽度，数字</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Init(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cx,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cy,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;number)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cx&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cy&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cx&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bottom&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cy&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;number;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">计算对角线角度</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;atan(((</span><span style="color: #0000ff;">double</span><span style="color: #000000;">)height)</span><span style="color: #000000;">/</span><span style="color: #000000;">width);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle[</span><span style="color: #800080;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle[</span><span style="color: #800080;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle[</span><span style="color: #800080;">2</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;M_PI&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle[</span><span style="color: #800080;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;M_PI&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />};<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">描述两个按钮的连接线</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CLine<br />{<br /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x0,&nbsp;y0;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">From，出发点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x1,&nbsp;y1;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">To，指向点<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">三角箭头的点数组</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;ptsArrow[</span><span style="color: #800080;">3</span><span style="color: #000000;">];<br /><br /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">计算角度&nbsp;from&nbsp;POINT0&nbsp;-&gt;&nbsp;to&nbsp;POINT1</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;GetAngle(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x0,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y0,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x1,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;angle;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(x1</span><span style="color: #000000;">==</span><span style="color: #000000;">x0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(y1</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">y0)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;M_PI_2;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">90&nbsp;度</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800080;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;M_PI_2);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">270</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;atan(((</span><span style="color: #0000ff;">double</span><span style="color: #000000;">)(y1</span><span style="color: #000000;">-</span><span style="color: #000000;">y0))</span><span style="color: #000000;">/</span><span style="color: #000000;">(x1</span><span style="color: #000000;">-</span><span style="color: #000000;">x0));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(x1&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;x0)&nbsp;angle&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;M_PI;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果to在from左侧，则需要增加180度</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;angle;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取连线与按钮边缘相交的点坐标</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;GetSidePoint(CNumButton</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;btn,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;angle,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pX,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pY)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;angle&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">angle[</span><span style="color: #800080;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;angle&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">angle[</span><span style="color: #800080;">3</span><span style="color: #000000;">])&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">上边缘</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">top;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCX()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetHeigth()</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tan(M_PI_2</span><span style="color: #000000;">-</span><span style="color: #000000;">angle)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(angle&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">angle[</span><span style="color: #800080;">1</span><span style="color: #000000;">])&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">右边缘</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetWidth()</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tan(angle)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(angle&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">angle[</span><span style="color: #800080;">2</span><span style="color: #000000;">])&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">下边缘</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">bottom;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetHeigth()</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tan(M_PI_2</span><span style="color: #000000;">-</span><span style="color: #000000;">angle)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(angle&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">angle[</span><span style="color: #800080;">3</span><span style="color: #000000;">])&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">左边缘</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCY()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(btn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetWidth()</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tan(angle)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Init(CNumButton</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fromBtn,&nbsp;CNumButton</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;toBtn)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;arrowsize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">20</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">箭头大小</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;angle0,&nbsp;angle1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cx0&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fromBtn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCX();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cy0&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fromBtn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCY();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cx1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;toBtn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCX();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cy1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;toBtn</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCY();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle0&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetAngle(cx0,&nbsp;cy0,&nbsp;cx1,&nbsp;cy1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetAngle(cx1,&nbsp;cy1,&nbsp;cx0,&nbsp;cy0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取线段两个端点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSidePoint(fromBtn,&nbsp;angle0,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">x0,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">y0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSidePoint(toBtn,&nbsp;angle1,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">x1,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">y1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设置箭头</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">0</span><span style="color: #000000;">].x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">0</span><span style="color: #000000;">].y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取三角形箭头的其他两个端点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">1</span><span style="color: #000000;">].x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(arrowsize&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;cos(angle1</span><span style="color: #000000;">-</span><span style="color: #000000;">M_PI</span><span style="color: #000000;">/</span><span style="color: #800080;">12</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">1</span><span style="color: #000000;">].y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(arrowsize&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;sin(angle1</span><span style="color: #000000;">-</span><span style="color: #000000;">M_PI</span><span style="color: #000000;">/</span><span style="color: #800080;">12</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">2</span><span style="color: #000000;">].x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(arrowsize&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;cos(angle1</span><span style="color: #000000;">+</span><span style="color: #000000;">M_PI</span><span style="color: #000000;">/</span><span style="color: #800080;">12</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsArrow[</span><span style="color: #800080;">2</span><span style="color: #000000;">].y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(arrowsize&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;sin(angle1</span><span style="color: #000000;">+</span><span style="color: #000000;">M_PI</span><span style="color: #000000;">/</span><span style="color: #800080;">12</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0.5</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />...<br />};</span></div></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　 
</p><div class="cnblogs_code_hide"><span style="color: #000000;"><br /></span></div>　　　　此外，在题目要求中提到的一些功能，我定义了一个类：CSolution，用它辅助Windows程序完成演示，绘制等大部分功能。在Solution中保存了一个按钮链表，一个动作记录链表。其中按钮链表的每个节点都一定包含一个按钮，每个按钮节点还包含一个连接线的指针（CLine* line，初始为NULL），只有当这个按钮被点击且能和之前的按钮建立连接关系，我们就为这个按钮的CLine*分配指向相应的对象。换句话说，除了第一次点击时，无法建立CLine*的指向，之后的每次点击都能为按钮分配CLine*的指向。 
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　　　在前面讲了太多和这个题考察内容无关的方面，下面还是再说说这道题考察的关键部分吧（尽管问题很直观）。</p>
<p>&nbsp;</p>
<p>　　　　首先我们需要定义了两个链表来保存信息：</p>
<p>　　　　Buttons链表：实际上保存了窗口上所有的按钮和连接线对象。每个节点都包含一个指向 Button 和一个指向 Line 的指针。注意，每个节点的Button一定存在，而Line可能为NULL。</p>
<p>　　　　Actions链表：保存了当前动作的可重现信息：包括，当前动作类型（增加按钮/点击按钮），当前的Sum值（按钮数字总和）等等。</p>
<p>&nbsp;</p>
<p>　　　　链表的节点定义如下：&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('bd60998b-2b33-40c5-9333-ecc6f60559f3')"><img class="code_img_closed" id="code_img_closed_bd60998b-2b33-40c5-9333-ecc6f60559f3" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_bd60998b-2b33-40c5-9333-ecc6f60559f3" style="display: none;" onclick="cnblogs_code_hide('bd60998b-2b33-40c5-9333-ecc6f60559f3',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">CODE_SOLUTION</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_bd60998b-2b33-40c5-9333-ecc6f60559f3">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000;">//</span><span style="color: #008000;">动作类型</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ACTION_ADDBUTTON&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">增加按钮</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;ACTION_CLICKBUTTON&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">按按钮</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">保存绘制对象的节点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_BUTTON<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CLine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">相关联的线</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CNumButton&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">btn;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">按钮</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_BUTTON&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">prev;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">双向链表</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_BUTTON&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">next;<br />}&nbsp;NUMBUTTON,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">LPNUMBUTTON;<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">记录动作的节点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_ACTION<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">动作类型</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">回放时应该显示的总和</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CLine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">相关联的线</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CNumButton&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">btn;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">相关联的按钮</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_ACTION&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">prev;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_NODE_ACTION&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">next;<br />}&nbsp;NUMACTION;<br /><br />...<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">解决问题</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CSolution<br />{<br /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CNumButton&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">lastBtn;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">最后点击的按钮（连线的尾部节点）</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;NumList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">NUMBUTTON</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;buttons;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存所有按钮的链表</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;NumList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">NUMACTION</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;actions;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存所有动作的链表</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nSum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">数字的总和</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;bDrawRegion;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">是否绘制region（按钮的可出现位置）</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;bPlaying;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">是否正在回放？</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />...<br />};</span></div></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　　　此外剩余的主要技巧基本都是使用 Platform SDK 的传统Windows 开发技术。特别的，这个例子最初的目的如其名称，它也展示和练习了 Rebar ，ToolBar, StatuBar 等 CommonCtrl 的使用。在工具栏上使用了 CHEVRON （&#8220;&gt;&gt;&#8221;）按钮。该按钮的显示控制是由系统的Rebar窗口已经实现的。当Rebar的Band小于它的理想宽度时，ReBar就会在这个Band的边缘显示&#8220;&gt;&gt;"按钮。点击&#8220;&gt;&gt;&#8221;按钮时应用程序需要弹出一个上下文菜单来显示那些显示不完全的项目。在这里为了给菜单项目显示左侧的图标，我又对上下文菜单使用了自定义绘制（菜单和工具栏使用的是同一个ImageList）。效果如下图所示：</p><p>&nbsp;</p><p>　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/Rebar_03.jpg" width="464" height="456" /></p><p>&nbsp;</p>
<p>　　　　有一点不是很好的是，当我对客户区整个刷新时，我发现 Rebar 的显示同时也失效了（Rebar上的Bands会显示不正常），为了不强制rebar重绘，我只好把客户区的画布的顶端向下增加足够的高度。</p><p>&nbsp;</p>
<p>　　　　最后任务栏上有一个按钮，是&#8220;显示Region&#8221;，它是CSolution内维护的一个HRGN（区域），主要目的，是我在添加一个按钮后，在画布中把这个按钮占据的区域删去，这样尽可能使增加按钮时，他们不至于很快重叠在一起。</p><p>&nbsp;</p>
<p>　　　　当（元素）按钮重叠时，这里又有一个小的技巧。即，我们按照 Z 次序 绘制他们，但是在鼠标点击去尝试捕获对象时，则要沿着和绘制相反的顺序捕获。例如，我在这里绘制按钮，是从链表头部 绘制到 链表的尾部，（按照添加顺序），但是在尝试捕获时，则需要从链表尾部检索到头部，这是因为位于最上面的元素是最后绘制的，但是也是最可能被最首先点击到的。</p>
<p>&nbsp;</p>

<p>&nbsp;</p>
<p>　　　　最后是源代码的下载链接（修复了NumList模板类定义中的一个BUG，该BUG导致获取List的元素个数不正确）：</p>
<p>　　　　<a title="http://files.cnblogs.com/hoodlum1980/Rebar3.rar" href="http://files.cnblogs.com/hoodlum1980/Rebar3.rar" target="_blank">http://files.cnblogs.com/hoodlum1980/Rebar3.rar</a></p><p>&nbsp;</p><p>　　　　BUG修复： </p><p>　　　　（1）修复了NumList模板类定义中的一个BUG，该BUG导致获取List的元素个数不正确。</p><p>　　　　（2）修复在回放过程中，有些动作中，记录Sum值 的TextBox没有及时刷新的 BUG。<br /></p>
<p><a href="http://files.cnblogs.com/hoodlum1980/Rebar3.rar" target="_blank"></a>&nbsp;</p>
<p>&nbsp;</p>
<p>　　　　【附加另一道题目】：为了防止影响对方公司的面试，这里就隐去该题目的出处。这道题目非常基础和简单，这里作为一种练习。题目要求是：</p>
<p>　　　　<span style="font-family: 宋体;">使用</span>Win32 ( <span style="font-family: 宋体;">不用</span>MFC )<span style="font-family: 宋体;">，写一个Windows程序，实现功能</span>: </p>
<p><span>　　　　(1) </span><span style="font-family: 宋体;">窗口启动时最大化 ；</span><span>(2) </span><span style="font-family: 宋体;">窗口的背景色为指定颜色；</span>(3) <span style="font-family: 宋体;">左上角显示鼠标客户区坐标；</span>(4) <span style="font-family: 宋体;">显示一张牌</span>, <span style="font-family: 宋体;">按方向键随之一动，每次移动1像素，并保证不移出窗口。</span>(5) <span style="font-family: 宋体;">点击换牌。</span></p>
<p><span style="font-family: 宋体;">　　　　程序运行效果截图是：</span></p>
<p><span style="font-family: 宋体;">　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/ShowPoke_01.jpg" width="302" border="0" height="212" /></span></p>
<p>　　　　这个程序的关键是在于如何防止卡片移动时的闪烁，实际上这里我采用了一种不能应用于普通情况，而仅适用与该题题意的比较投机的方法去防闪烁（因为这个题目中窗口背景是纯色的，在实际应用中未必有这么好的条件）。&#8220;闪烁&#8221;是windows程序在绘制方面（GDI）的一个经典话题了。当你使用GDI，（而非DirectX，OPENGL之类），那么不可能不接触到它。当然，如何防止闪烁主要取决于开发人员对窗口绘制的相关消息和过程的理解和掌握，也就是首先要弄清楚闪烁是如何引起的，然后有针对性的尽最大可能减少闪烁的发生。而不应该仅只知道一些 double buffer 之类的术语（却不知所以）。</p>
<p>&nbsp;</p><p><span style="font-family: 宋体;">　　　　原代码：<a title="http://files.cnblogs.com/hoodlum1980/ShowPokeCard.rar" href="http://files.cnblogs.com/hoodlum1980/ShowPokeCard.rar" target="_blank"></a></span>http://files.cnblogs.com/hoodlum1980/ShowPokeCard.rar</p><p>&nbsp;</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1643833.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/11/1643833.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/11/1643833.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>QQ表情选择面板的VC实现</title><link>http://www.cnblogs.com/hoodlum1980/archive/2010/01/09/1642732.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Fri, 08 Jan 2010 23:41:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2010/01/09/1642732.html</guid><description><![CDATA[<p>阅读: 265 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2010-01-09 07:41 <a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/09/1642732.html" target="_blank">原文链接</a></p><p>　　==========================================================================</p><p>　　补充： <br /></p><p>　　（1）为了在预览图中显示动态的 GIF 图片，我舍弃了 CImage， 而引用了 CxImage 类库的代码。这样可以看到动态的 GIF 动画。 <br /></p><p>　　（2）改进了绘制方法，改为使用内存位图绘制，并把 WM_ERASEBKGND 合并到 WM_PAINT 中，以降低闪烁。</p><p>　　（3）修改了鼠标位于表情网格（Cells）的最右边缘时，错误的认为选中表情是下一行的第一个 Cell 的BUG。该 BUG 会导致鼠标在<br /></p><p>　　　　最右侧移入移出时在右上角有强烈闪烁感。<br /></p><p>　　　　　　　　　　　　　　　　　　　　　　　　--hoodlum1980 　　2010年1月29日<br /></p><p>　　========================================================================== <br /></p><p>&nbsp;</p><p>　　最近有好多篇帖子是关于QQ的选择表情的那个窗口实现的。最初以为这是一个比较简单的功能，不过做起来还是发现做了整个一晚上才做的差不多做好。做完我想为什么有很多人愿意尝试它呢？可能是基于它的那个&#8220;预览图&#8221;对鼠标的&#8220;躲藏&#8221;功能是它的一个亮点，所以可能是因为这个原因引起很多人的兴趣来实现它。前人已经采用了很多种方式实现，例如 C# 的 winform，等等。在这里是使用 VC 实现的。在这个范例中也展示了如何定制一个特殊外观的窗口，以及自定义绘制（OWNER DRAW）按钮（1/2，上一页，下一页按钮），如何遍历一个文件夹下的所有文件等基本方法。</p><p>&nbsp;</p><p>　　不过这个例子仅仅是模仿QQ的UI，实际上这也是这个例子的唯一意义。由于VC里面对于存在多帧的 gif 格式并没有特别好的支持，包括 CImage 尽管支持大多数图像格式，但是却仅能加载 gif 的一帧，而要展示动画形式的gif，则通常要求助于第三方代码，例如 CxImage 等。因此这里我就仅仅模拟这个界面，实际上在预览框里面我仅仅绘制一下而已。而并没有去真正的做 gif 动画的预览。<br /></p><p>&nbsp;</p><p>　　当鼠标在窗口上移动时，需要绘制一个蓝色小边框反应当前选中的是哪一个cell，而且预览图会尽可能惰性的&#8220;远离&#8221;鼠标。所谓惰性，是指仅在它发觉鼠标有向它逼近时，它的位置才会突变。例如当预览框位于左上角（跨度占据0，1，2列），而鼠标从右侧首次进入第4列时， 它是不动的，但鼠标在第4列继续移动时，它才会突然移动到右侧。因此为了检测鼠标的这种行为，实际上在范例中我记录了鼠标最近两次的停留位置，即 lastSelection，currentSelection（二者的逻辑关系实际上是一个仅包含两个元素的队列）。<br /></p><p>&nbsp;</p><p>&nbsp;　　效果如下图所示：</p><p>　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/QQFace001.jpg" /> <br /></p><p>&nbsp; <br /></p><p>　　这个范例在UI方面基本是采用对QQ2009的表情选择窗口的截图来制作的， 使用的表情文件夹是来自于qq2008的 &#8220;Face2&#8221; 。但该范例还是和真正的QQ有一些出入的地方，例如：<br /></p><p> <br /></p><p>　　（1）QQ的表情选择窗口弹出来时，qq表情按钮是呈现按下状态的。范例为了简单期间，只是弹出模态对话框，所以这里不如QQ的 UI 自定义的那么彻底。</p><p>　　（2）QQ的表情选择窗口和其父窗口是非模态性的关系，而范例是模态关系，所以在没有加载任何图片的情况下，为了使窗口能够关闭，我做了一点特殊处理，也就是在范例中可以通过点击&#8220;空白处&#8221;的表情退出，而在QQ中点击空白位置是没有回应的。<br /></p><p>　　（3）QQ的表情选择窗口有Tooltip，不过我不觉得这个功能很必要，估计很少会有人去关注这个功能，而且它还挡住了窗口的一部分。实现起来是很简单的，所以范例中没有tooltip了。</p><p>　　（4）QQ的表情选择窗口能自动调节自己的出现位置，尽可能靠近触发按钮，并且保证自身的可见性（完全位于屏幕范围以内）。操作中很多弹出式的窗口具有这种功能，例如 ToolTip ， ComboBox， DateTimePicker 类控件的下拉窗口等。这个功能看起来简单，但是实现起来还是需要一定技巧和复杂度。范例中仅仅让窗口的位置固定出现在按钮上方。<br /></p><p>　　（5）QQ的表情选择窗口对用户自己添加的表情在绘制时，使用了拉伸绘制。在范例中为了简单，没有考虑表情图片的大小。 <br /></p><p>&nbsp;</p><p>　　本范例使用的代码都属于比较传统的技术，所以并没有什么特别需要单独列出和讲解的地方。由于最近该类实现的文章较多，所以将本文发于首页候选区。<br /></p><p>&nbsp;</p><p>　　在这里仅提供本范例的源代码下载连接：（可执行程序位于Debug目录中）</p><p>&nbsp;</p><p>　　<a target="_blank" title="http://files.cnblogs.com/hoodlum1980/QQFaceVC.rar" href="http://files.cnblogs.com/hoodlum1980/QQFaceVC.rar">http://files.cnblogs.com/hoodlum1980/QQFaceVC.rar</a>&nbsp; <br /></p><p>&nbsp;</p><p>　　--hoodlum1980 <br /></p><p>&nbsp;</p><p>　　参考资料： <br /></p><p>　　【1】 本文代码中，关于 GIF 图片的解码和展示引用了 CxImage 中的代码。关于 CxImage 的介绍地址：<br /></p><p>　　<a target="_blank" href="http://www.codeproject.com/KB/graphics/cximage.aspx">http://www.codeproject.com/KB/graphics/cximage.aspx</a> <br /></p><p>　　 <br /></p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1642732.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/09/1642732.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2010/01/09/1642732.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>【COM范例】WM上获取短信内容，AcitiveX控件调用页面JS方法</title><link>http://www.cnblogs.com/hoodlum1980/archive/2009/12/30/1635702.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Wed, 30 Dec 2009 01:38:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2009/12/30/1635702.html</guid><description><![CDATA[<p>阅读: 94 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2009-12-30 09:38 <a href="http://www.cnblogs.com/hoodlum1980/archive/2009/12/30/1635702.html" target="_blank">原文链接</a></p><p>　　COM 是 WIN32 系统中最复杂和晦涩，最重要的技术。</p>
<p>&nbsp;</p>
<p>　　【备注：以下是个人看法】COM 是比传统的 API 提供方式（*.h, *.lib, *.dll) 更&#8221;高&#8220;层次的服务标准， 从某种意义上说，COM也是一种&#8221;API&#8220;，但它的使用和实现都要比传统API复杂的多。COM 的宗旨是提供这样的一种标准，使操作系统，独立软件开发商之间以一种标准方式提供交互性服务。COM 相比传统API合作方式相比：两者本质上都提供的二进制代码（编译后产品），前者是基于有组织的，语言中立的 具有面向对象特性的标准。后者是零散的，语言相关，面向过程的方式。前者的显著优点是，它的组件是共享式的安装在系统上的一种服务，组件位置对用户是透明的，因此它仅需要在每个客户端部署一份（甚至部署在一台远程计算机）。而后者位置不透明因此未必能够做到这一点。COM 技术使用推出新接口实现升级，以降低对客户端的影响。而传统 API 提供方式有可能在升级时导致DLL版本混乱。<br /></p>
<p>&nbsp;</p>
<p>　　由于对语言中立性的追求以及COM的标准，COM 的代码相比普通的 C/C++ 可读性更低，但也具有一定规律性。ATL中提供了一些辅助类来降低 COM 代码的使用难度。<br /></p>
<p>&nbsp;</p>
<p>　　这里是两个例子。 <br /></p>
<p>&nbsp;</p>
<p>　　【例子1】： 在 Windows Mobile 上获取收件箱中的短信内容。<br /></p>
<p>&nbsp;</p>
<p>　　（1）每个帐户对应的是一个MsgStore。每个MsgStore可包含一组文件夹。</p>
<p>　　（2）提供EntryID，用 OpenEntry 方法打开MAPI对象。<br /></p>
<p>　　（3）MAPI容器 使用 GetContentTable 获取容器内内容的描述表。<br /></p>
<p>　　（4）MAPI Table 使用SetColumns 设定要查询的字段。</p>
<p>　　（5）使用 MAPI 提供的函数释放相关查询信息分配的内存。<br /></p>
<p>　　更多细节参考 相关SDK 文档。<br /></p>
<p>&nbsp;</p>
<p>　　下面是代码。当打开收件箱以后，短信是按照时间升序排列的，因此使用 SeekRow 方法把游标游动到最后一行读出既是最近收到的短信。<br /></p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('aba24949-e2b6-4ad7-ad6f-1f74d26a7c98')"><img class="code_img_closed" id="code_img_closed_aba24949-e2b6-4ad7-ad6f-1f74d26a7c98" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_aba24949-e2b6-4ad7-ad6f-1f74d26a7c98" style="display: none" onclick="cnblogs_code_hide('aba24949-e2b6-4ad7-ad6f-1f74d26a7c98',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">Code_GetLastMessage</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_aba24949-e2b6-4ad7-ad6f-1f74d26a7c98">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">获取SMS的最近收到的短信，返回为&#8220;发件人：内容&#8221;的格式。</span><span style="color: #008000"><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetLastMessage(TCHAR&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bufferSize)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICEMAPISession&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSession&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMsgStore&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pMsgStore&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMAPIFolder&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pFolder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMessage&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pMsg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">和Table有关的MAPI对象</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;IMAPITable&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pTable&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;SRowSet&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pRows&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPropValue&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSProps&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;ulObjType;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">对象类型</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;cCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;remainLength,&nbsp;subjectLength;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">字符串长度</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置MsgStore表的要查询字段</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SizedSPropTagArray(</span><span style="color: #800080">2</span><span style="color: #000000">&nbsp;,&nbsp;Columns1)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR_ENTRYID,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Store的Entry&nbsp;ID</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR_DISPLAY_NAME&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Store的Display&nbsp;Name&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置收件箱内容表要查询的字段</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SizedSPropTagArray(</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;Columns2)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR_ENTRYID&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取每个消息的EntryID</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CoInitializeEx(NULL,&nbsp;COINIT_MULTITHREADED);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAPIInitialize(NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">failed&nbsp;at:&nbsp;MAPIInitialize</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAPILogonEx(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;NULL,&nbsp;NULL,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;(LPMAPISESSION&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pSession);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">failed&nbsp;at:&nbsp;MAPILogonEx</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pSession</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetMsgStoresTable(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pTable);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">failed&nbsp;at:&nbsp;GetMsgStoresTable</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumns((LPSPropTagArray)</span><span style="color: #000000">&amp;</span><span style="color: #000000">Columns1,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(SUCCEEDED(pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryRows(</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pRows)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pRows&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">cRows&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">开始一条条记录查询,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">pRows-&gt;aRow[0].lpProps[0]代表了第一个查询属性，即Entry&nbsp;ID,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">pRows-&gt;aRow[0].lpProps[1]则表示Display&nbsp;Name。&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_tcsicmp(pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">aRow[</span><span style="color: #800080">0</span><span style="color: #000000">].lpProps[</span><span style="color: #800080">1</span><span style="color: #000000">].Value.lpszW,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">SMS</span><span style="color: #800000">"</span><span style="color: #000000">))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果是SMS，则获取Store对象&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pSession</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OpenEntry(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">aRow[</span><span style="color: #800080">0</span><span style="color: #000000">].lpProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.cb,&nbsp;(LPENTRYID)pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">aRow[</span><span style="color: #800080">0</span><span style="color: #000000">].lpProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.lpb,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;MAPI_BEST_ACCESS,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ulObjType,(LPUNKNOWN</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pMsgStore<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeProws(pRows);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRows&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pRows&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeProws(pRows);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pTable&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pMsgStore&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">Cannot&nbsp;Open&nbsp;MsgStore&nbsp;of&nbsp;SMS.</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">查询&#8220;收件箱&#8221;的ENTRYID</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;STags[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;PR_CE_IPM_INBOX_ENTRYID&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMsgStore</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetProps((SPropTagArray</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">STags,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">cCount,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pSProps);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">Cannot&nbsp;Get&nbsp;Inbox's&nbsp;EntryID.</span><span style="color: #800000">"</span><span style="color: #000000">));</span></div>
<div><span style="color: #000000">　　&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">(pSProps&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL) MAPIFreeBuffer(pSProps);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">打开收件箱文件夹</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMsgStore</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OpenEntry(pSProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.cb,&nbsp;(LPENTRYID)pSProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.lpb,NULL,</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ulObjType,&nbsp;(IUnknown&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pFolder);</span></div>
<div><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">(pSProps&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAPIFreeBuffer(pSProps);</span></span></div>
<div><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">Cannot&nbsp;Open&nbsp;Folder&nbsp;Of&nbsp;Inbox.</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取收件箱的内容表。</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pFolder</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContentsTable(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pTable);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">尝试移动到最后一行（最近收到的短信）</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;rowCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetRowCount(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rowCount);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr)&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;rowCount&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTable&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">收件箱：没有新的消息。</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;TAG_CLEAR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SeekRow(BOOKMARK_BEGINNING,&nbsp;rowCount&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumns((LPSPropTagArray)</span><span style="color: #000000">&amp;</span><span style="color: #000000">Columns2,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">要查询的消息属性：发件人，主题（短信内容）</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;pMsgPropTags[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">,&nbsp;PR_SENDER_EMAIL_ADDRESS,&nbsp;PR_SUBJECT&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(SUCCEEDED(pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryRows(</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pRows)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">通过OpenEntry获取IMessage对象</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pFolder</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OpenEntry(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">aRow[</span><span style="color: #800080">0</span><span style="color: #000000">].lpProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.cb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPENTRYID)pRows</span><span style="color: #000000">-&gt;</span><span style="color: #000000">aRow[</span><span style="color: #800080">0</span><span style="color: #000000">].lpProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.bin.lpb,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Message's&nbsp;EntryID</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAPI_BEST_ACCESS,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ulObjType,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPUNKNOWN</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pMsg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这里拿到每个IMessage对象就代表了Folder里面的每一条Message,可以通过对它的操作来获取想要的信息。</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMsg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetProps((SPropTagArray</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pMsgPropTags,&nbsp;MAPI_UNICODE,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">cCount,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pSProps);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(SUCCEEDED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pSProps[</span><span style="color: #800080">0</span><span style="color: #000000">].ulPropTag&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;PR_SENDER_EMAIL_ADDRESS)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;pSProps[</span><span style="color: #800080">0</span><span style="color: #000000">].Value.lpszW);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscat_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">:&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer[</span><span style="color: #800080">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\0</span><span style="color: #800000">'</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pSProps[</span><span style="color: #800080">1</span><span style="color: #000000">].ulPropTag&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;PR_SUBJECT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remainLength&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bufferSize&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;wcslen(buffer)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subjectLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;wcslen(pSProps[</span><span style="color: #800080">1</span><span style="color: #000000">].Value.lpszW);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(remainLength&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;subjectLength)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscat_s(buffer,&nbsp;bufferSize,&nbsp;pSProps[</span><span style="color: #800080">1</span><span style="color: #000000">].Value.lpszW);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">截断字符串，并用三个点表示省略。</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcsncpy_s(buffer&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;wcslen(buffer),&nbsp;bufferSize,&nbsp;pSProps[</span><span style="color: #800080">1</span><span style="color: #000000">].Value.lpszW,&nbsp;remainLength&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscat_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">...</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy_s(buffer,&nbsp;bufferSize,&nbsp;_T(</span><span style="color: #800000">"</span><span style="color: #800000">Cannot&nbsp;Get&nbsp;Message.</span><span style="color: #800000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pSProps&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAPIFreeBuffer(pSProps);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">仅仅读取一条Message</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pRows&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeProws(pRows);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRows&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pTable&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTable&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />TAG_CLEAR:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pMsg&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pMsg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pFolder&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pFolder</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pMsgStore&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pMsgStore</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pSession&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pSession</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Logoff(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pSession</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;MAPIUninitialize();<br />&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />}</span></div></div></div>
<p>&nbsp;</p>
<p>　　本段代码已运用于 LedScreen插件V2.0 中：　　<br />　　</p>
<p>　　　　<img height="317" alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/LedScrV2.jpg" width="480" border="0" /></p>
<p>&nbsp;</p>
<p>　　【例子2】：在ActiveX控件中调用页面上的 JavaScrpt 方法。 <br /></p>
<p>&nbsp;</p>
<p>　　（1）IE调用ActiveX控件的方法，本质上是通过控件的 IDispatch 接口调用的，该技术也就是自动化技术。该技术绑定时间比自定义接口最晚，因此效率不如通过自定义接口调用，但是也最灵活。 当我们在ActiveX 控件中调用页面的脚本时，我们同样通过脚本对象的 IDispatch 接口调用。<br /></p>
<p>&nbsp;</p>
<p>　　（2）假设 ActiveX 控件事先知道页面上的方法的参数列表，（相当于我们已知一个C#委托或者C++函数指针定义），如果不这样假定，则实在意义不大。<br /></p>
<p>&nbsp;</p>
<p>　　 (3)&nbsp; 我们在控件接口中添加一个方法，称为InvokeJS。在这个方法里我们试图调用 页面上的一个指定名称的javascript方法。并且我们给这个方法一个字符串参数，内容是&#8221;hello world&#8220;。代码如下：<br /></p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('8fad2150-68e1-4ff8-b339-541c1860daa6')"><img class="code_img_closed" id="code_img_closed_8fad2150-68e1-4ff8-b339-541c1860daa6" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_8fad2150-68e1-4ff8-b339-541c1860daa6" style="display: none" onclick="cnblogs_code_hide('8fad2150-68e1-4ff8-b339-541c1860daa6',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_InvokeJS</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_8fad2150-68e1-4ff8-b339-541c1860daa6">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">调用JS方法（无参数）</span><span style="color: #008000"><br /></span><span style="color: #000000">STDMETHODIMP&nbsp;CMyControl::InvokeJS(BSTR&nbsp;funName)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(m_document&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;S_OK;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CComPtr</span><span style="color: #000000">&lt;</span><span style="color: #000000">IHTMLDocument2</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;pHtmlDoc;<br />&nbsp;&nbsp;&nbsp;&nbsp;CComPtr</span><span style="color: #000000">&lt;</span><span style="color: #000000">IDispatch</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;pScript;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">CComPtr：会自动调用Release();</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr;<br />&nbsp;&nbsp;&nbsp;&nbsp;CComBSTR&nbsp;bstrMember;<br />&nbsp;&nbsp;&nbsp;&nbsp;DISPID&nbsp;dispid;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">DISPID即LONG（int32），接口函数的数字序号。<br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;bstrMember.AssignBSTR(funName);<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_document</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryInterface(IID_IHTMLDocument2,&nbsp;(</span><span style="color: #0000ff">void</span><span style="color: #000000">**</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pHtmlDoc);<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pHtmlDoc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">get_Script(</span><span style="color: #000000">&amp;</span><span style="color: #000000">pScript);<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pScript</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetIDsOfNames(IID_NULL,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">bstrMember,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;LOCALE_SYSTEM_DEFAULT,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">dispid);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用脚本对象的Invoke方法执行脚本函数：</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DISPPARAMS&nbsp;dispparams;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dispparams,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">&nbsp;dispparams);<br />&nbsp;&nbsp;&nbsp;&nbsp;dispparams.cArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;dispparams.rgvarg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;VARIANT[dispparams.cArgs];<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dispparams.cArgs;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CComBSTR&nbsp;bstr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">hello&nbsp;world</span><span style="color: #800000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;back&nbsp;reading</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bstr.CopyTo(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dispparams.rgvarg[i].bstrVal);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispparams.rgvarg[i].vt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;VT_BSTR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;dispparams.cNamedArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EXCEPINFO&nbsp;excepInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">excepInfo,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">&nbsp;excepInfo);<br />&nbsp;&nbsp;&nbsp;&nbsp;CComVariant&nbsp;vaResult;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nArgErr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(UINT)</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;initialize&nbsp;to&nbsp;invalid&nbsp;arg</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pScript</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Invoke(dispid,&nbsp;IID_NULL,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;DISPATCH_METHOD,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">dispparams,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">vaResult,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">excepInfo,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">nArgErr);<br /></span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;S_OK;<br />}</span></div></div></div>
<p><br /></p>
<p>　　浏览器对象实际上我们是在控件的 SetClientSite 方法中获取的， 该方法在创建控件时由容器调用，以给ActiveX控件一个时机去获取一些容器信息。则在MSDN文档中有专门介绍。控件的SetClientSite代码如下：<br /></p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('b5cd2cfb-86d1-4902-aa89-c4391695da86')"><img class="code_img_closed" id="code_img_closed_b5cd2cfb-86d1-4902-aa89-c4391695da86" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_b5cd2cfb-86d1-4902-aa89-c4391695da86" style="display: none" onclick="cnblogs_code_hide('b5cd2cfb-86d1-4902-aa89-c4391695da86',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_setClientSite</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_b5cd2cfb-86d1-4902-aa89-c4391695da86">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008000">//</span><span style="color: #008000">以下是控件的两个成员变量：</span><span style="color: #008000"><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;IWebBrowser2</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_browser;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">浏览器对象</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;IDispatch</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_document;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">文档对象</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /><br />STDMETHODIMP&nbsp;CMyControl::SetClientSite(IOleClientSite</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pClientSite)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;IServiceProvider&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">isp,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">isp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">BSTR&nbsp;url;</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">pClientSite)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMRELEASE(m_browser);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pClientSite</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryInterface(IID_IServiceProvider,&nbsp;reinterpret_cast</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**&gt;</span><span style="color: #000000">(</span><span style="color: #000000">&amp;</span><span style="color: #000000">isp));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;cleanup;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;isp</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryService(SID_STopLevelBrowser,&nbsp;IID_IServiceProvider,&nbsp;reinterpret_cast</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**&gt;</span><span style="color: #000000">(</span><span style="color: #000000">&amp;</span><span style="color: #000000">isp2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;cleanup;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;isp2</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryService(SID_SWebBrowserApp,&nbsp;IID_IWebBrowser2,&nbsp;reinterpret_cast</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**&gt;</span><span style="color: #000000">(</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_browser));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;cleanup;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取文档对象</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_browser</span><span style="color: #000000">-&gt;</span><span style="color: #000000">get_Document(</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_document);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_document&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">m_browser-&gt;get_LocationURL(&amp;url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">MessageBox((LPCTSTR)url,&nbsp;_T(""),&nbsp;MB_OK);</span><span style="color: #008000"><br /></span><span style="color: #000000">cleanup:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Free&nbsp;resources.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMRELEASE(isp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMRELEASE(isp2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;S_OK;<br />}</span></div></div></div>
<p><br /></p>
<p>&nbsp;　　（4）假设在页面上具有这样一个JS方法：当我们点击按钮时，页面首先通过IDispatch接口找到控件的InvokeJS方法，然后在控件中又通过IDispatch接口找到脚本的AlertMessage方法，弹出一个MessageBox。</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('877b97b2-dcd3-42c0-a174-99956f5dec62')"><img class="code_img_closed" id="code_img_closed_877b97b2-dcd3-42c0-a174-99956f5dec62" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_877b97b2-dcd3-42c0-a174-99956f5dec62" style="display: none" onclick="cnblogs_code_hide('877b97b2-dcd3-42c0-a174-99956f5dec62',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">code_HTML</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_877b97b2-dcd3-42c0-a174-99956f5dec62">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TITLE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">对象测试页</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">TITLE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br /></span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;AlertMessage(info)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;alert(info);<br />}<br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">OBJECT&nbsp;</span><span style="color: #ff0000">ID</span><span style="color: #0000ff">="MyControl"</span><span style="color: #ff0000">&nbsp;CLASSID</span><span style="color: #0000ff">="CLSID:......"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">OBJECT</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">button&nbsp;</span><span style="color: #ff0000">onclick</span><span style="color: #0000ff">="MyControl.InvokeJS('AlertMessage');"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">InvokeJavaScript</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">button</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span></div></div></div>
<p><br /></p>
<p>&nbsp;　　【例子3】：通过 ITaskBar 对象隐藏或显示任务栏按钮。<br /></p>
<p>　　</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('e3e0ebea-b507-44f1-a7c3-10ae8200543a')"><img class="code_img_closed" id="code_img_closed_e3e0ebea-b507-44f1-a7c3-10ae8200543a" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_e3e0ebea-b507-44f1-a7c3-10ae8200543a" style="display: none" onclick="cnblogs_code_hide('e3e0ebea-b507-44f1-a7c3-10ae8200543a',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">Code_ShowInTaskBar</span> 
<div class="cnblogs_code_hide" id="cnblogs_code_open_e3e0ebea-b507-44f1-a7c3-10ae8200543a">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ShowInTaskbarList(HWND&nbsp;hWnd,&nbsp;BOOL&nbsp;bShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITaskbarList</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pTaskbarList;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CoInitialize(NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CoCreateInstance(CLSID_TaskbarList,&nbsp;NULL,&nbsp;CLSCTX_INPROC_SERVER,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_ITaskbarList,&nbsp;(</span><span style="color: #0000ff">void</span><span style="color: #000000">**</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pTaskbarList);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">==============&nbsp;&nbsp;HrInit();==================<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Initializes&nbsp;the&nbsp;taskbar&nbsp;list&nbsp;object.&nbsp;This&nbsp;method&nbsp;must&nbsp;be&nbsp;called&nbsp;before&nbsp;any&nbsp;other&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ITaskbarList&nbsp;methods&nbsp;can&nbsp;be&nbsp;called.&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pTaskbarList</span><span style="color: #000000">-&gt;</span><span style="color: #000000">HrInit();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(bShow)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTaskbarList</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddTab(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTaskbarList</span><span style="color: #000000">-&gt;</span><span style="color: #000000">DeleteTab(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;pTaskbarList</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Release();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br />}</span></div></div></div>
<p><br /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;　　参考内容：</p>
<p>　　<span style="font-family: '微软雅黑','黑体',Arial,Helvetica,Sans-Serif">《Mapi实例</span> 》：http://bingqingwu5799.blog.163.com/blog/static/338365512009320111114912/<br /></p>
<p>　　MSDN &amp; Windows Mobile 6 SDK Documents； </p>
<p>　　CSDN 关于 ActiveX 调用页面脚本的文章。（原连接未记录）</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1635702.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/12/30/1635702.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/12/30/1635702.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[临时]单源最短路径（Dijkstra算法）</title><link>http://www.cnblogs.com/hoodlum1980/archive/2009/10/22/1588334.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Thu, 22 Oct 2009 13:49:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2009/10/22/1588334.html</guid><description><![CDATA[<p>阅读: 119 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2009-10-22 21:49 <a href="http://www.cnblogs.com/hoodlum1980/archive/2009/10/22/1588334.html" target="_blank">原文链接</a></p><p>　　因为没有原创内容，相当于看书笔记，因此本打算发在QQZone，但因为QQ空间日志忽然服务器繁忙，大骂腾讯无奈还是把此日志临时发布在自己的博客上。</p><p>　　参考资料：《计算机算法设计与分析》（第三版）。<br />　　条件：<br />　　（1）带权有向图 G = (V, E); 任意边的权 &gt;= 0;<br /><br />　　算法：<br />　　贪心法。体现在从源节点开始，每次从集合S外&#8220;选一个最近的节点&#8221;添加到S中，然后对dist数组做更新。<br /></p><p>&nbsp;　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/dijkstra_1.jpg" width="213" height="204" />　　 <br /></p><p>　　参数说明：</p><p>　　T：模板参数，权值类型。（计量长度的数据类型） <br /></p><p>　　int n; 图的节点数；　　</p><p>　　int v; 出发节点（源节点）的索引。</p><p>　　T dist[];&nbsp; dist[i]表示当前条件下 v 到 i 节点之间的最短距离。求解过程中这个数组随着集合S的扩充而动态变化。</p><p>　　int prev[]; prev[i]表示从 v 到 i 节点之间的最短距离路径上的前一个节点。可以通过这个数组反塑获取到完整路径。</p><p>　　T *c; 图的矩阵表示。c[i][j]表示边（i，j）的权。当无通路时为一个大数。&nbsp; </p><p>&nbsp;=========================　　</p><p>　　　　　　代码：</p><p>=========================&nbsp;</p><p>&nbsp;<img id="Code_Closed_Image_214640" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_214640').style.display='none'; document.getElementById('Code_Open_Image_214640').style.display='inline'; document.getElementById('Code_Open_Text_214640').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img id="Code_Open_Image_214640" style="display: none;" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_214640').style.display='none'; getElementById('Code_Closed_Image_214640').style.display='inline'; getElementById('Code_Closed_Text_214640').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_214640" class="cnblogs_code_Collapse">Code_Dijkstra</span><span id="Code_Open_Text_214640" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Dijkstra.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br /></span><span style="color: #008000;">//<br /></span><span style="color: #000000;"><br /></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">stdafx.h</span><span style="color: #800000;">"</span><span style="color: #000000;"><br /></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxint&nbsp;0x7fffffff</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">dijkstra&nbsp;算法&nbsp;，索引是从1开始的</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br /></span><span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Dijkstra(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v,&nbsp;T&nbsp;dist[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;prev[],&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;c)<br /></span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;j,&nbsp;temp,&nbsp;u;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;newdist;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">bool&nbsp;s[6];</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(n</span><span style="color: #000000;">*</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">));<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">sizeof(bool)&nbsp;=&nbsp;%d&nbsp;bytes.&nbsp;\n</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1&nbsp;bytes;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[0]&nbsp;初始化</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c[v</span><span style="color: #000000;">*</span><span style="color: #000000;">n</span><span style="color: #000000;">+</span><span style="color: #000000;">i];&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">c[v][i]</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]</span><span style="color: #000000;">=</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">在集合S外</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dist[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;maxint)&nbsp;prev[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;prev[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">把节点v放入集合S中</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;dist[v]</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;s[v]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向S集合中依次添加其他（n-1）个节点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;(n</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">);&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;maxint;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[1]&nbsp;选出S集合外的距离最近的一个点u</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">s[j]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(dist[j]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;temp))<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dist[j];<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[2]&nbsp;把u放入S集合；</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[3]&nbsp;调整dist数组和prev数组</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查看&nbsp;u&nbsp;到&nbsp;j&nbsp;节点之间有通路？？？</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">s[j]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;c[u</span><span style="color: #000000;">*</span><span style="color: #000000;">n</span><span style="color: #000000;">+</span><span style="color: #000000;">j]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;maxint&nbsp;)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if(&nbsp;!s[j]&nbsp;&amp;&amp;&nbsp;c[u][j]&nbsp;&lt;&nbsp;maxint&nbsp;)</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newdist&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dist[u]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;c[u</span><span style="color: #000000;">*</span><span style="color: #000000;">n</span><span style="color: #000000;">+</span><span style="color: #000000;">j];&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">newdist&nbsp;=&nbsp;dist[u]+&nbsp;c[u][j];</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(newdist&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;dist[j])<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;newdist;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev[j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">u;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;free(s);<br /></span><span style="color: #000000;">}<br /><br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br /></span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;dist[</span><span style="color: #800080;">5</span><span style="color: #000000;">],&nbsp;prev[</span><span style="color: #800080;">5</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;c[</span><span style="color: #800080;">5</span><span style="color: #000000;">][</span><span style="color: #800080;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">10</span><span style="color: #000000;">,&nbsp;maxint,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">30</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">100</span><span style="color: #000000;">&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">0</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">10</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">50</span><span style="color: #000000;">,&nbsp;maxint,&nbsp;maxint&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;maxint,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">50</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">20</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">10</span><span style="color: #000000;">&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">2</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">30</span><span style="color: #000000;">,&nbsp;maxint,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">20</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">60</span><span style="color: #000000;">&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">3</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">100</span><span style="color: #000000;">,&nbsp;maxint,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">10</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">60</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">4</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">调用算法&nbsp;节点数=5，出发节点=0</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Dijkstra</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #800080;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dist,&nbsp;prev,&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">)c);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">【1】打印节点1到其他节点的最短距离</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">dist:&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">5</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d,</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dist[i]);<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">【2】打印prev数组，记录从出发点到本节点的最短路径的上一个节点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">prev:&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">5</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d,</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;prev[i]);<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">【3】打印从0到4的最短路径</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">0-&gt;4&nbsp;Path:&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;stack[</span><span style="color: #800080;">5</span><span style="color: #000000;">],&nbsp;top</span><span style="color: #000000;">=-</span><span style="color: #800080;">1</span><span style="color: #000000;">;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;stack[</span><span style="color: #000000;">++</span><span style="color: #000000;">top]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">4</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">逆向追溯节点（入栈）</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[top</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;prev[stack[top]];<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">栈顶是否已经是出发点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(stack[top]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">节点依次出栈</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(;top</span><span style="color: #000000;">&gt;</span><span style="color: #800080;">0</span><span style="color: #000000;">;top</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d&nbsp;-&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;stack[top]);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">栈中最后一个节点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;stack[top]);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br /></span><span style="color: #000000;">}</span></span></p><p>=========================<br />　　　　　　输出：<br />=========================<br />sizeof(bool) = 1 bytes.<br />dist: 0,10,50,30,60,<br />prev: 0,0,3,0,2,<br />0-&gt;4 Path: 0 - 3 - 2 - 4&nbsp;</p><p>&nbsp;</p><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1588334.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/10/22/1588334.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/10/22/1588334.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>魔方——操作阶数实验</title><link>http://www.cnblogs.com/hoodlum1980/archive/2009/09/27/1575339.html</link><dc:creator>hoodlum1980</dc:creator><author>hoodlum1980</author><pubDate>Sun, 27 Sep 2009 15:27:00 GMT</pubDate><guid>http://www.cnblogs.com/hoodlum1980/archive/2009/09/27/1575339.html</guid><description><![CDATA[<p>阅读: 232 评论: 0 作者: <a href="http://www.cnblogs.com/hoodlum1980/" target="_blank">hoodlum1980</a> 发表于 2009-09-27 23:27 <a href="http://www.cnblogs.com/hoodlum1980/archive/2009/09/27/1575339.html" target="_blank">原文链接</a></p>这是我徒弟请教我的一个问题，是一个C++的作业题，题目是：<br />　　从一个已复原的魔方开始，重复某一个操作序列，必然会在有限次重复操作之后又复原，设计程序，输入任意一个操作序列，输入它的复原重复次数。<br />　　操作有18个：<br />　　L，L'，L"：分别为左面顺时针转90度、逆时针转90度和180度翻转；<br />　　R，R'，R"：分别为右面顺时针转90度、逆时针转90度和180度翻转；<br />　　T，T'，T"：分别为顶面顺时针转90度、逆时针转90度和180度翻转；<br />　　D，D'，D"：分别为底面顺时针转90度、逆时针转90度和180度翻转；<br />　　F，F'，F"：分别为前面顺时针转90度、逆时针转90度和180度翻转；<br />　　B，B'，B"：分别为背面顺时针转90度、逆时针转90度和180度翻转。<br />　　在实验报告中记录如下事项：<br />　　输入L，则输出4。<br />　　输入L"，则输出2。<br />　　输入D" R，则输出30。<br />　　输入D R，则输出105。以及其它自定的操作序列。<br />　　======================================================================<br />　　<br />　　看到这个题目，感觉尽管自觉不难，但是编码上一定要有很大的技巧性。我设想魔方一共有六个面，保持它的中心不动不旋转，那么每个面的中间一格也是永远不动的，而周围8个格子随着操作而变换。因此我用这样一个数组 cells[6][8]， 来记录六个面。每个面有8个格子，我按照从正上方看过去顺时针方向对这8个格子编排索引。如下图（图中格子上的数字代表它在自己所在面的数组中的索引）：<br /><br />　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/hoodlum1980/MagicCube.jpg" width="382" height="344" /><br /><br />　　解题的过程实际上就是魔方的旋转建模，因此我们继续完成这个模型。我们考虑上面描述的所有操作本质上都属于以一个主平面旋转，同时影响与它相邻的四个面的边缘三个格子。因此我们引入一个辅助函数：(getinfo) 用来对每一种旋转获取一个角度值和主旋转面，四个受影响面，并把面的索引存放到参数指定的数组中。<br />　　然后我们针对旋转写一个函数：rotate；它根据三种角度，完成（1）对主旋转面的内部旋转；（2）对四个受影响面的格子轮换；<br />　　最后我完成的C代码如下：<br /><br />　　<br /><div class="cnblogs_code"><img id="Code_Closed_Image_231915" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_231915').style.display='none'; document.getElementById('Code_Open_Image_231915').style.display='inline'; document.getElementById('Code_Open_Text_231915').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img id="Code_Open_Image_231915" style="display: none;" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_231915').style.display='none'; getElementById('Code_Closed_Image_231915').style.display='inline'; getElementById('Code_Closed_Text_231915').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_231915" class="cnblogs_code_Collapse">Code_magicCube</span><span id="Code_Open_Text_231915" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">#include&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">stdafx.h</span><span style="color: #800000;">"</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />魔方&#8212;&#8212;操作阶数实验<br />从一个已复原的魔方开始，重复某一个操作序列，必然会在有限次重复操作之后又复原，设计程序，输入任意一个操作序列，<br />输入它的复原重复次数。<br />操作有18个：<br />L，L'，L"：分别为左面顺时针转90度、逆时针转90度和180度翻转；<br />R，R'，R"：分别为右面顺时针转90度、逆时针转90度和180度翻转；<br />T，T'，T"：分别为顶面顺时针转90度、逆时针转90度和180度翻转；<br />D，D'，D"：分别为底面顺时针转90度、逆时针转90度和180度翻转；<br />F，F'，F"：分别为前面顺时针转90度、逆时针转90度和180度翻转；<br />B，B'，B"：分别为背面顺时针转90度、逆时针转90度和180度翻转。<br />在实验报告中记录如下事项：<br />输入L，则输出4。<br />输入L"，则输出2。<br />输入D"&nbsp;R，则输出30。<br />输入D&nbsp;R，则输出105。<br />以及其它自定的操作序列。<br /></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">面索引</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_LEFT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_FRONT&nbsp;&nbsp;1</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_RIGHT&nbsp;&nbsp;2</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_BACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_TOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;P_BOTTOM&nbsp;5</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">六个面,&nbsp;<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[0]:&nbsp;Left<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[1]:&nbsp;Front<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[2]:&nbsp;Right<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[3]:&nbsp;Back<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[4]:&nbsp;Top<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">cells[5]:&nbsp;Bottom<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">面内索引：<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;0&nbsp;1&nbsp;2<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;7&nbsp;*&nbsp;3<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;6&nbsp;5&nbsp;4<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">================</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;cells[</span><span style="color: #800080;">6</span><span style="color: #000000;">][</span><span style="color: #800080;">8</span><span style="color: #000000;">];<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">初始化魔方</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">6</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[i][j]</span><span style="color: #000000;">=</span><span style="color: #000000;">i;<br />}<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">复原了吗？</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isdone()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">6</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cells[i][j]&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />}<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">获取旋转的信息</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;getinfo(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;mode,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;angle,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;sides)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取角度</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(mode[</span><span style="color: #800080;">1</span><span style="color: #000000;">])<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">angle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">90</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">\</span><span style="color: #800000;">''</span><span style="color: #800000;">:&nbsp;</span><span style="color: #800000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">angle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #800080;">90</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">"</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">angle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">180</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取五个受影响的面，第一个是主面，其他四个是从主面看过去的顺时针顺序影响面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(mode[</span><span style="color: #800080;">0</span><span style="color: #000000;">])<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">L</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">左</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_TOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_FRONT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BOTTOM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BACK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">R</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">右</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_RIGHT;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">主旋转面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_TOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BACK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BOTTOM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_FRONT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">T</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">顶面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_TOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BACK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_RIGHT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_FRONT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">D</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">底面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BOTTOM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_FRONT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_RIGHT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BACK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">F</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">前面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_FRONT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_TOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_RIGHT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BOTTOM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">B</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">背面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BACK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_TOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_BOTTOM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">P_RIGHT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">传入一个操作字符串，进行相应操作</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;rotate(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;mode)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;temp[</span><span style="color: #800080;">8</span><span style="color: #000000;">],temp2[</span><span style="color: #800080;">3</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;angle,&nbsp;sides[</span><span style="color: #800080;">5</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取角度和5个面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getinfo(mode,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">angle,&nbsp;sides);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复制主面到一个临时备份</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[&nbsp;sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]&nbsp;][i];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(angle)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">90</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">顺时针旋转90,&nbsp;offset&nbsp;=&nbsp;6<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[1]主面内部旋转</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]][i]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp[(i</span><span style="color: #000000;">+</span><span style="color: #800080;">6</span><span style="color: #000000;">)</span><span style="color: #000000;">%</span><span style="color: #800080;">8</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">备份影响面的数字</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">4个受影响面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #800080;">90</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">逆时针旋转90,&nbsp;offset&nbsp;=&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[1]主面内部旋转</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]][i]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp[(i</span><span style="color: #000000;">+</span><span style="color: #800080;">2</span><span style="color: #000000;">)</span><span style="color: #000000;">%</span><span style="color: #800080;">8</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">备份影响面的数字</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">4个受影响面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">180</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">翻转180,&nbsp;offset&nbsp;=&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">[1]主面内部旋转</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #800080;">8</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">0</span><span style="color: #000000;">]][i]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp[(i</span><span style="color: #000000;">+</span><span style="color: #800080;">4</span><span style="color: #000000;">)</span><span style="color: #000000;">%</span><span style="color: #800080;">8</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">备份影响面的数字<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">上下对换</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">5</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">1</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">3</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">左右对换</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">4</span><span style="color: #000000;">]][</span><span style="color: #800080;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">7</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells[sides[</span><span style="color: #800080;">2</span><span style="color: #000000;">]][</span><span style="color: #800080;">6</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">temp2[</span><span style="color: #800080;">2</span><span style="color: #000000;">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /></span><span style="color: #008000;">//<br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;token</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;step[</span><span style="color: #800080;">128</span><span style="color: #000000;">][</span><span style="color: #800080;">4</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;line[</span><span style="color: #800080;">512</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;length&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">每一次有几步操作</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;init();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gets(line);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用空格分割</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;token</span><span style="color: #000000;">=</span><span style="color: #000000;">strtok(line,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复制动作</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(token</span><span style="color: #000000;">!=</span><span style="color: #000000;">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(step[length</span><span style="color: #000000;">++</span><span style="color: #000000;">],&nbsp;token);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strtok(NULL,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">执行一次动作序列</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">length;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotate(step[i]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复原了吗?</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isdone())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;result);<br />&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br />}<br /></span></span></div><br />　　总结一下，上面的代码中，主旋转面的旋转已经被统一起来。对4个受影响面的格子的交换代码还是略显 &#8220;hard&#8221; 和&#8220;笨拙&#8221;，自觉感觉还是有改进的余地。因为四个受影响面中，每个面提供三个格子，连接组成了一个环形（共12个格子），因此我们可以用一个char[12]线性数组去完成相应的旋转，而且我们看到，针对特定主旋转面，其他12个元素在各自面内的索引相同，这就为我们改进这部分硬代码提供了理论保证。因此我们的getinfo的任务不变，还是需要提供4个受影响面，然后就可以把cells从二维数组看作一格一维线性表，根据面索引和格子索引在cells中定位到这个元素，然后把这12个元素作一个相应角度的轮转即可。这将把对4个受影响面的旋转也统一起来，从而使上面代码进一步简化。有时间的时候我将补充改进后的代码。<br /><br /><img src="http://www.cnblogs.com/hoodlum1980/aggbug/1575339.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/09/27/1575339.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/hoodlum1980/archive/2009/09/27/1575339.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>