﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-KISS(Keep It Simple, Standard)</title><link>http://www.cppblog.com/QUIRE-0216/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 13 Mar 2026 07:27:49 GMT</lastBuildDate><pubDate>Fri, 13 Mar 2026 07:27:49 GMT</pubDate><ttl>60</ttl><item><title>关于Dijkstra算法我的理解（下）</title><link>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42356.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Fri, 01 Feb 2008 09:09:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42356.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/42356.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42356.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/42356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/42356.html</trackback:ping><description><![CDATA[<img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=197 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/2.jpg" width=591 border=2><br>这步还有句要说的就是：（<u style="COLOR: red"><span style="COLOR: red">在把ＯＰＥＮ表中最优值的节点插入　ＣＬＯＳＥ表中时如果在ＣＬＯＳＥ表中已经存在那就要比较，如果存在的节点的权值比要插入的大，就要把存在的替换掉（节点中所有内容</span><span style="COLOR: red">），否则就忽略</span></u>）．<br><br>第３步：就是重复第２步骤（示例图如下）<br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=160 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/3.jpg" width=585 border=2><br>我想因该明白了吧！<br><br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=167 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/4.jpg" width=582 border=2><br><br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=181 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/5.jpg" width=580 border=2><br><br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=191 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/6.jpg" width=580 border=2><br><br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=210 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/7.jpg" width=580 border=2><br><br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=240 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/8.jpg" width=575 border=2><br>好了最后一张完工！<br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=231 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/9.jpg" width=578 border=2><br>终点（12节点）找到了是吧！我想因该明白了吧！<br>
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/42356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2008-02-01 17:09 <a href="http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Dijkstra算法我的理解（上）</title><link>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42351.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Fri, 01 Feb 2008 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42351.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/42351.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42351.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/42351.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/42351.html</trackback:ping><description><![CDATA[<p>最近做了路径搜索,看了网上的描述真是晦涩,所以自己就整理下!<br>图画的不太好, :)<br>绿色的是节点,红色的为权值,箭头为可通行的标志.<br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=449 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/shilitu.jpg" width=576 border=2><br>现在我们要从 0 节点 到 12 节点 找一条最优路径:<br>首先咱们要解决NODE点存贮的信息(结构):<br>struct NodeBaseInfo<br>{<br>&nbsp;&nbsp;&nbsp;unsigned short nNodeID;　　　//番号<br>&nbsp;&nbsp;&nbsp;unsigned long&nbsp; nMeasure;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//权值<br>&nbsp;&nbsp; NodeBaseInfo *pParent;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//父节点<br>};<br><br>我写了简单的结构大家可以根据自己需要定义（定义这个结构是为了更好理解）<br>下面讲的是最主要的了：<br>DIJKSTAR算法中要定义两个表：OPEN 和 CLOSE&nbsp; （其实可以看作链表）<br>他的原理就是把没有遍历的点放在 OPEN 表中，把从 OPEN表中遍历到的最短权值的点放入<br>CLOSE 表中，当插入 CLOSE表中的节点的番号于我们要的重点时算法结束；然后按照父节点（pParent）<br>向上递归就可以得到我们要的最优路径了。<br><br>第一步：应为 OPEN 和CLOSE表都是空的，把起点（0节点）插入CLOSE标中，它的权值为0。把起点（0节点）附近的节点（因该为可通行的）插入OPEN 表中（<u style="COLOR: red">最好按权值从大道小的顺序插入，这样取得最优值时，这样速度就会很快</u>）。（如示例图）<br><img style="BORDER-LEFT-COLOR: #ffcc99; BORDER-BOTTOM-COLOR: #ffcc99; BORDER-TOP-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ffcc99" height=438 alt="" src="http://www.cppblog.com/images/cppblog_com/quire-0216/1.jpg" width=505 border=2><br>第2步：从OPEN表中找到权值最小的节点，把它插入CLOSE 表中, 把这个节点的可连通的节点查入ＯＰＥＮ<br>表，（<span style="COLOR: red"><u>如果ＯＰＥＮ表中存在要查入的点，如果要插入的节点的权值比已经存在的小，就把已经查入的权值该为最小的，如果要插入的节点的权值比已经存在的大，就忽落它</u></span>．）<br>（为了更好的理解我把父节点也加入了，如示例图）<br><br></p>
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/42351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2008-02-01 16:13 <a href="http://www.cppblog.com/QUIRE-0216/archive/2008/02/01/42351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用移位、加减法实现整数开平方算法的方法(转)</title><link>http://www.cppblog.com/QUIRE-0216/archive/2008/01/23/41714.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Wed, 23 Jan 2008 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2008/01/23/41714.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/41714.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2008/01/23/41714.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/41714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/41714.html</trackback:ping><description><![CDATA[<p>本算法只采用移位、加减法、判断和循环实现，因为它不需要浮点运算，也不需要乘除运算，因此可以很方便地运用到各种芯片上去。</p>
<p>我们先来看看10进制下是如何手工计算开方的。<br>先看下面两个算式，<br>x = 10*p + q&nbsp; (1)<br>公式(1)左右平方之后得：<br>x^2 = 100*p^2 + 20pq + q^2 (2)<br>现在假设我们知道x^2和p，希望求出q来，求出了q也就求出了x^2的开方x了。<br>我们把公式(2)改写为如下格式：<br>q = (x^2 - 100*p^2)/(20*p+q) (3)</p>
<p>这个算式左右都有q，因此无法直接计算出q来，因此手工的开方算法和手工除法算法一样有一步需要猜值。</p>
<p>我们来一个手工计算的例子：计算1234567890的开方</p>
<p>首先我们把这个数两位两位一组分开，计算出最高位为3。也就是(3)中的p，最下面一行的334为余数，也就是公式(3)中的(x^2 - 100*p^2)近似值<br>&nbsp;&nbsp;&nbsp; 3<br>&nbsp; ---------------<br>&nbsp;/ 12 34 56 78 90<br>&nbsp;&nbsp;&nbsp; 9<br>&nbsp; ---------------<br>&nbsp;/&nbsp; 3 34</p>
<p>下面我们要找到一个0-9的数q使它最接近满足公式(3)。我们先把p乘以20写在334左边：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp; q<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / 12 34 56 78 90<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---------------<br>(20*3+q)*q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp; 3 34</p>
<p>我们看到q为5时(60+q)*q的值最接近334，而且不超过334。于是我们得到：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; 5<br>&nbsp;&nbsp;&nbsp; ---------------<br>&nbsp;&nbsp; / 12 34 56 78 90<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9<br>&nbsp;&nbsp;&nbsp; ---------------<br>65 /&nbsp; 3 34<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 25<br>&nbsp;&nbsp;&nbsp; ---------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 56</p>
<p>接下来就是重复上面的步骤了，这里就不再啰嗦了。 </p>
<p>这个手工算法其实和10进制关系不大，因此我们可以很容易的把它改为二进制，改为二进制之后，公式(3)就变成了：<br>q = (x^2 - 4*p^2)/(4*p+q) (4)</p>
<p>我们来看一个例子，计算100(二进制1100100)的开方：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; 0&nbsp; 1&nbsp; 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp; / 1 10 01 00<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;100 / 0 10 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>1001 /&nbsp;&nbsp; 10 01<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 01<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00</p>
<p>这里每一步不再是把p乘以20了，而是把p乘以4，也就是把p右移两位，而由于q的值只能为0或者1，所以我们只需要判断余数(x^2 - 4*p^2)和(4*p+1)的大小关系，如果余数大于等于(4*p+q)那么该上一个1，否则该上一个0。</p>
<p>下面给出完成的C语言程序，其中root表示p，rem表示每步计算之后的余数，divisor表示(4*p+1)，通过a&gt;&gt;30取a的最高 2位，通过a&lt;&lt;=2将计算后的最高2位剔除。其中root的两次&lt;&lt;1相当于4*p。程序完全是按照手工计算改写的，应该不难理解。<br>unsigned short sqrt(unsigned long a){<br>&nbsp; unsigned long rem = 0;<br>&nbsp; unsigned long root = 0;<br>&nbsp; unsigned long divisor = 0;<br>&nbsp; for(int i=0; i&lt;16; ++i){<br>&nbsp;&nbsp;&nbsp; root &lt;&lt;= 1;<br>&nbsp;&nbsp;&nbsp; rem = ((rem &lt;&lt; 2) + (a &gt;&gt; 30));<br>&nbsp;&nbsp;&nbsp; a &lt;&lt;= 2;<br>&nbsp;&nbsp;&nbsp; divisor = (root&lt;&lt;1) + 1;<br>&nbsp;&nbsp;&nbsp; if(divisor &lt;= rem){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rem -= divisor;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root++;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; return (unsigned short)(root);<br>}</p>
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/41714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2008-01-23 14:21 <a href="http://www.cppblog.com/QUIRE-0216/archive/2008/01/23/41714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>透明位图的显示我的代码实现</title><link>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31218.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Thu, 30 Aug 2007 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31218.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/31218.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31218.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/31218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/31218.html</trackback:ping><description><![CDATA[<p><strong>void TransparentBlt(CDC *pDestDC, int nXDest, int nYDest, int nWidth, int nHeight, CBitmap * pBitmap, int nXsrc, int nYsrc, COLORREF clr)<br>{<br>&nbsp;CDC maskDC, ImageDC;<br>&nbsp;maskDC.CreateCompatibleDC(pDestDC);<br>&nbsp;ImageDC.CreateCompatibleDC(pDestDC);</strong></p>
<p><strong>&nbsp;CBitmap maskBMP;<br>&nbsp;maskBMP.CreateBitmap(nWidth, nHeight, 1, 1, NULL);//创建单色掩码位图<br>&nbsp;CBitmap *pOldBMP = ImageDC.SelectObject(pBitmap);<br>&nbsp;CBitmap *maskOldBMP = maskDC.SelectObject(&amp;maskBMP);<br>&nbsp;<br>&nbsp;ImageDC.SetBkColor(clr);// 设置透明色<br>&nbsp;maskDC.BitBlt(0, 0, nWidth, nHeight, &amp;ImageDC, nXsrc, nYsrc, SRCCOPY);</strong></p>
<p><strong>&nbsp;//设置背景色为黑色，前景色为白色，将掩码位图与原位图相"与"<br>&nbsp;ImageDC.SetBkColor(RGB(0, 0, 0));<br>&nbsp;ImageDC.SetTextColor(RGB(255, 255, 255));<br>&nbsp;ImageDC.BitBlt(0, 0, nWidth, nHeight, &amp;maskDC, nXsrc, nYsrc, SRCAND);</strong></p>
<p><strong>&nbsp;//设置背景色为白色，前景色为黑色，将掩码位图与背景进行&#8220;与&#8221;运算<br>&nbsp;pDestDC-&gt;SetBkColor(RGB(255, 255, 255));<br>&nbsp;pDestDC-&gt;SetTextColor(RGB(0, 0, 0));<br>&nbsp;pDestDC-&gt;BitBlt(nXDest, nYDest, nWidth, nHeight, &amp;maskDC, nXsrc, nYsrc, SRCAND);<br>&nbsp;// "或"运算,生成最终效果<br>&nbsp;pDestDC-&gt;BitBlt(nXDest, nYDest, nWidth, nHeight, &amp;ImageDC, nXsrc, nYsrc, SRCPAINT);</strong></p>
<p><strong>&nbsp;if (pOldBMP) ImageDC.SelectObject(pOldBMP);<br>&nbsp;ImageDC.DeleteDC();<br>&nbsp;if (maskOldBMP) maskDC.SelectObject(maskOldBMP);<br>&nbsp;maskDC.DeleteDC();<br>&nbsp;if (maskBMP.m_hObject) maskBMP.DeleteObject();<br>}</strong></p>
我就不怎么解释了!如不理解,请看我转的(<strong>透明位图的显示中的(二、实现TransparentBlt函数)的原理</strong>),其他部分都就什么必要了!呵呵!
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/31218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2007-08-30 17:05 <a href="http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>透明位图的显示(转)</title><link>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31212.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Thu, 30 Aug 2007 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31212.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/31212.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31212.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/31212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/31212.html</trackback:ping><description><![CDATA[<p>包含透明色的位图的绘制方法有多种，最简单的方法是调用现成的函数：TransparentBlt,也可以通过自己的代码实现类似 TransparentBlt的功能，实现过程也有两种形式，一种是事先做一张掩码位图，另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。<br><br><strong>一、TransparentBlt 函数的使用 </strong><br><br>TransparentBlt 函数在Windows98/Windows2000以上版本运行，系统中需要包含 Msimg32.dll，使用时可以链接 Msimg32.lib。<br>Windows98下的TransparentBlt会产生资源泄漏，所以不建议在WIN98下使用该函数。<br>TransparentBlt函数原型如下: </p>
<pre>BOOL TransparentBlt(
HDC hdcDest,      // 目标DC
int nXOriginDest,   // 目标X偏移
int nYOriginDest,   // 目标Y偏移
int nWidthDest,     // 目标宽度
int hHeightDest,    // 目标高度
HDC hdcSrc,         // 源DC
int nXOriginSrc,    // 源X起点
int nYOriginSrc,    // 源Y起点
int nWidthSrc,      // 源宽度
int nHeightSrc,     // 源高度
UINT crTransparent  // 透明色,COLORREF类型
);
</pre>
使用示例:
<pre>CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&amp;FootballBMP);
TransparentBlt(pDC-&gt;m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));
ImageDC.SelectObject(pOldImageBMP);
</pre>
<strong>二、实现TransparentBlt函数</strong><br><br>为了理解具有透明色位图的绘制过程，我们来亲手建立一个具有同TransparentBlt功能一致的实验函数，称之为TransparentBlt2。<br><br>实验素材：有两张位图：bk.bmp是背景位图，football.bmp包含透明区域，透明色为蓝色RGB(0,0,0xff)<br>实验目的：以bk.bmp为背景，将football.bmp绘制到背景中，形成如下的最终效果图。<br><img height=164 src="http://www.vckbase.com/document/journal/vckbase18/images/transBlt1.gif" width=542>
<p>&#160;</p>
<br><br><strong>2.1 透明位图绘制原理</strong><br>假设football.bmp -&gt;载入 HBITMAP hImageBMP -&gt; 选入 HDC hImageDC<br><br><strong>2.1.1 生成足球的单色掩码位图，透明区域为白色（全1），非透明区域为黑色（全0)</strong>
<pre>HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立单色位图
SetBkColor(hImageDC, RGB(0,0,0xff)); // 设置背景色为蓝色
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷贝到hMaskDC</pre>
这样足球位图中蓝色区域在掩码位图中成了白色，其它区域为黑色，此时hMaskBMP 如下图:<br><img height=85 src="http://www.vckbase.com/document/journal/vckbase18/images/transBlt2.gif" width=93 border=1> (图一)<br><br><strong>2.1.2 设置背景色为黑色，前景色为白色，将掩码位图(图一)与足球位图相"与"</strong>
<pre>SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
</pre>
这样，掩码位图中背景色（黑色）的区域在hImageBMP中被保留，前景色（白色）的部分变为黑色。 此时hImageBMP 如下图:<br><img height=85 src="http://www.vckbase.com/document/journal/vckbase18/images/transBlt3.gif" width=94> (图二)<br><br><strong>2.1.3 设置背景色为白色，前景色为黑色，将掩码位图(图一)与背景进行&#8220;与&#8221;运算</strong><br>
<pre>SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);</pre>
掩码中白色区域（数据与1相&#8220;与&#8221;结果不变）使背景保持不变，黑色区域变成黑色，此时背景显示如下:<br><img height=105 src="http://www.vckbase.com/document/journal/vckbase18/images/transBlt4.gif" width=144> (图三)<br><br><strong>2.1.4 将hImageBMP(图二)与背景(图三)进行&#8220;或&#8221;运算</strong>
<pre>BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);</pre>
这样就将足球绘制到背景上了。<br><br><strong>2.2 TransparentBlt2函数全部实现代码</strong><br>
<pre>void TransparentBlt2( HDC hdcDest,      // 目标DC
int nXOriginDest,   // 目标X偏移
int nYOriginDest,   // 目标Y偏移
int nWidthDest,     // 目标宽度
int nHeightDest,    // 目标高度
HDC hdcSrc,         // 源DC
int nXOriginSrc,    // 源X起点
int nYOriginSrc,    // 源Y起点
int nWidthSrc,      // 源宽度
int nHeightSrc,     // 源高度
UINT crTransparent  // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);	// 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);			// 创建单色掩码位图
HDC		hImageDC = CreateCompatibleDC(hdcDest);
HDC		hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc &amp;&amp; nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 设置透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明区域为白色，其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明区域为黑色，其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不变，其它部分变成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
// 清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}</pre>
<strong>2.3 TransparentBlt的另外一个版本:TransparentBltU</strong><br><br>TransparentBltU是Christian Graus 在WinDEV发表的一个函数，功能与TransparentBlt一致，以下是全部实现代码:
<pre>bool TransparentBltU(
HDC dcDest,         // handle to Dest DC
int nXOriginDest,   // x-coord of destination upper-left corner
int nYOriginDest,   // y-coord of destination upper-left corner
int nWidthDest,     // width of destination rectangle
int nHeightDest,    // height of destination rectangle
HDC dcSrc,          // handle to source DC
int nXOriginSrc,    // x-coord of source upper-left corner
int nYOriginSrc,    // y-coord of source upper-left corner
int nWidthSrc,      // width of source rectangle
int nHeightSrc,     // height of source rectangle
UINT crTransparent  // color to make transparent
)
{
if (nWidthDest &lt; 1) return false;
if (nWidthSrc &lt; 1) return false;
if (nHeightDest &lt; 1) return false;
if (nHeightSrc &lt; 1) return false;
HDC dc = CreateCompatibleDC(NULL);
HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,
BITSPIXEL), NULL);
if (bitmap == NULL)
{
DeleteDC(dc);
return false;
}
HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);
if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,
nYOriginSrc, SRCCOPY))
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}
HDC maskDC = CreateCompatibleDC(NULL);
HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);
if (maskBitmap == NULL)
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
DeleteDC(maskDC);
return false;
}
HBITMAP oldMask =  (HBITMAP)SelectObject(maskDC, maskBitmap);
SetBkColor(maskDC, RGB(0,0,0));
SetTextColor(maskDC, RGB(255,255,255));
if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))
{
SelectObject(maskDC, oldMask);
DeleteObject(maskBitmap);
DeleteDC(maskDC);
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}
SetBkColor(dc, crTransparent);
BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);
SetBkColor(dc, RGB(0,0,0));
SetTextColor(dc, RGB(255,255,255));
BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);
HDC newMaskDC = CreateCompatibleDC(NULL);
HBITMAP newMask;
newMask = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
if (newMask == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
DeleteObject(maskBitmap);
return false;
}
SetStretchBltMode(newMaskDC, COLORONCOLOR);
HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);
StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,
nWidthSrc, nHeightSrc, SRCCOPY);
SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteObject(maskBitmap);
HDC newImageDC = CreateCompatibleDC(NULL);
HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
if (newImage == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
return false;
}
HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);
StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,
nHeightSrc, SRCCOPY);
SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteObject(bitmap);
BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newMaskDC, 0, 0, SRCAND);
BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newImageDC, 0, 0, SRCPAINT);
SelectObject(newImageDC, oldNewImage);
DeleteDC(newImageDC);
SelectObject(newMaskDC, oldNewMask);
DeleteDC(newMaskDC);
DeleteObject(newImage);
DeleteObject(newMask);
return true;
}</pre>
<br>说明：本文提供的TransparentBlt2函数旨在说明透明位图的显示原理，在Windows2000以上环境实际运用中建议使用现成的TransparentBlt函数来绘制透明位图。
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/31212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2007-08-30 16:52 <a href="http://www.cppblog.com/QUIRE-0216/archive/2007/08/30/31212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>双链表的代码实现</title><link>http://www.cppblog.com/QUIRE-0216/archive/2007/08/24/30770.html</link><dc:creator>QUIRE-0216</dc:creator><author>QUIRE-0216</author><pubDate>Fri, 24 Aug 2007 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/QUIRE-0216/archive/2007/08/24/30770.html</guid><wfw:comment>http://www.cppblog.com/QUIRE-0216/comments/30770.html</wfw:comment><comments>http://www.cppblog.com/QUIRE-0216/archive/2007/08/24/30770.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/QUIRE-0216/comments/commentRss/30770.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/QUIRE-0216/services/trackbacks/30770.html</trackback:ping><description><![CDATA[<p><strong>#ifndef _DOUBLE_H_<br>#define _DOUBLE_H_</strong></p>
<p><strong>template&lt;class T&gt;<br>class Double;</strong></p>
<p><strong>template&lt;class T&gt;<br>class DoubleNode<br>{<br>&nbsp;friend class Double&lt;T&gt;;<br>private:<br>&nbsp;T data;<br>&nbsp;DoubleNode&lt;T&gt; *pre;<br>&nbsp;DoubleNode&lt;T&gt; *next;<br>};</strong></p>
<p><strong>template&lt;class T&gt;<br>class Double<br>{<br>&nbsp;public:<br>&nbsp;&nbsp;Double();//{head=end=NULL;}<br>&nbsp;&nbsp;~Double();<br>&nbsp;&nbsp;void Erase();<br>&nbsp;&nbsp;void reverse();<br>&nbsp;&nbsp;int GetLength()const;<br>&nbsp;&nbsp;bool IsEmpty()const;<br>&nbsp;&nbsp;bool Find(int k, T&amp; x)const;<br>&nbsp;&nbsp;int Search(T&amp; x)const;<br>&nbsp;&nbsp;Double&lt;T&gt;&amp; Delete(int k, T&amp; x);<br>&nbsp;&nbsp;Double&lt;T&gt;&amp; Insert(int k, const T&amp; x);<br>&nbsp;&nbsp;void output(ostream&amp; out)const;<br>&nbsp;&nbsp;friend ostream&amp; operator &lt;&lt; (ostream&amp; out, const Double&lt;T&gt;&amp; x);<br>&nbsp;private:<br>&nbsp;&nbsp;DoubleNode&lt;T&gt; *head;<br>&nbsp;&nbsp;DoubleNode&lt;T&gt; *end;<br>&nbsp;&nbsp;int length;<br>};</strong></p>
<p><strong>template&lt;class T&gt;<br>Double&lt;T&gt;::Double()<br>{<br>&nbsp;head = new DoubleNode&lt;T&gt;;<br>&nbsp;end = new DoubleNode&lt;T&gt;;<br>&nbsp;head-&gt;pre = NULL;<br>&nbsp;head-&gt;next = end;<br>&nbsp;end-&gt;pre = head;<br>&nbsp;end-&gt;next = NULL;</strong></p>
<p><strong>&nbsp;length = 0;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>Double&lt;T&gt;::~Double()<br>{<br>&nbsp;Erase();<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>void Double&lt;T&gt;::Erase()<br>{<br>&nbsp;DoubleNode&lt;T&gt; *current = head;<br>&nbsp;while (current)<br>&nbsp;{<br>&nbsp;&nbsp;head = head-&gt;next;<br>&nbsp;&nbsp;delete current;<br>&nbsp;&nbsp;current = head;<br>&nbsp;}<br>&nbsp;length = 0;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>int Double&lt;T&gt;::GetLength()const<br>{<br>&nbsp;return length;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>bool Double&lt;T&gt;::IsEmpty()const<br>{<br>&nbsp;return length == 0;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>bool Double&lt;T&gt;::Find(int k, T&amp; x)const<br>{</strong></p>
<p><strong>&nbsp;if (length == 0)<br>&nbsp;{<br>&nbsp;&nbsp;throw exception("DoubleNode is empty!");<br>&nbsp;}<br>&nbsp;else if(k&lt;1 || k&gt;length)<br>&nbsp;{<br>&nbsp;&nbsp;throw exception("no find the position of k");<br>&nbsp;}</strong></p>
<p><strong>&nbsp;DoubleNode&lt;T&gt; *current = head-&gt;next;<br>&nbsp;for (int i=1; (i&lt;k)&amp;&amp;current; ++i)<br>&nbsp;{<br>&nbsp;&nbsp;current = current-&gt;next;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;if (current)<br>&nbsp;{<br>&nbsp;&nbsp;x = current-&gt;data;<br>&nbsp;&nbsp;return true;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;return false;<br>}</strong></p>
<p><br><strong>template&lt;class T&gt;<br>int Double&lt;T&gt;::Search(T&amp; x)const<br>{<br>&nbsp;int nIndex = 1;<br>&nbsp;DoubleNode&lt;T&gt; *current = head-&gt;next;<br>&nbsp;while (current &amp;&amp; current-&gt;data != x)<br>&nbsp;{<br>&nbsp;&nbsp;++nIndex;<br>&nbsp;&nbsp;current = current-&gt;next;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;if (current)<br>&nbsp;{<br>&nbsp;&nbsp;return nIndex;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;return -1;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>Double&lt;T&gt;&amp; Double&lt;T&gt;::Delete(int k, T&amp; x)<br>{<br>&nbsp;if (length == 0)<br>&nbsp;{<br>&nbsp;&nbsp;throw exception("DoubleNode is empty!");<br>&nbsp;}<br>&nbsp;else if(k&lt;1 || k&gt;length)<br>&nbsp;{<br>&nbsp;&nbsp;throw exception("no find the position of k, so can't delete!");<br>&nbsp;}</strong></p>
<p><strong>&nbsp;DoubleNode&lt;T&gt; *current = head-&gt;next;&nbsp;<br>&nbsp;for (int i=1; (i&lt;k)&amp;&amp;current; ++i)<br>&nbsp;{<br>&nbsp;&nbsp;current = current-&gt;next;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;DoubleNode&lt;T&gt; * p = current;<br>&nbsp;current-&gt;pre-&gt;next = current-&gt;next;<br>&nbsp;current-&gt;next-&gt;pre = current-&gt;pre;</strong></p>
<p><strong>&nbsp;x = p-&gt;data;<br>&nbsp;delete p;<br>&nbsp;p = NULL;<br>&nbsp;--length;</strong></p>
<p><strong>&nbsp;return *this;<br>}</strong></p>
<p><br><strong>template&lt;class T&gt;<br>Double&lt;T&gt;&amp; Double&lt;T&gt;::Insert(int k, const T&amp; x)<br>{<br>&nbsp;if (k&gt;=0 &amp;&amp; k&lt;= length)<br>&nbsp;{<br>&nbsp;&nbsp;DoubleNode&lt;T&gt; *newNode = new DoubleNode&lt;T&gt;;<br>&nbsp;&nbsp;newNode-&gt;data = x;</strong></p>
<p><strong>&nbsp;&nbsp;DoubleNode&lt;T&gt; *current = head;<br>&nbsp;&nbsp;for (int i=0; i&lt;k; ++i)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;current = current-&gt;next;<br>&nbsp;&nbsp;}</strong></p>
<p><strong>&nbsp;&nbsp;newNode-&gt;pre = current;<br>&nbsp;&nbsp;newNode-&gt;next = current-&gt;next;<br>&nbsp;&nbsp;current-&gt;next-&gt;pre = newNode;<br>&nbsp;&nbsp;current-&gt;next = newNode;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;++length;<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;throw exception("no find the position of k, so can't insert!");<br>&nbsp;}</strong></p>
<p><strong>&nbsp;return *this;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>void Double&lt;T&gt;::output(ostream&amp; out)const<br>{<br>&nbsp;DoubleNode&lt;T&gt; *current = head-&gt;next;<br>&nbsp;while (current!=end)<br>&nbsp;{<br>&nbsp;&nbsp;out &lt;&lt; current-&gt;data &lt;&lt; " ";<br>&nbsp;&nbsp;current = current-&gt;next;<br>&nbsp;}<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>ostream&amp; operator&lt;&lt; (ostream&amp; out, const Double&lt;T&gt;&amp; x)<br>{<br>&nbsp;x.output(out);<br>&nbsp;return out;<br>}</strong></p>
<p><strong>template&lt;class T&gt;<br>void Double&lt;T&gt;::reverse()<br>{<br>&nbsp;DoubleNode&lt;T&gt; *p1 = head;<br>&nbsp;DoubleNode&lt;T&gt; *p2 = NULL;<br>&nbsp;DoubleNode&lt;T&gt; *pNode;</strong></p>
<p><strong>&nbsp;while (p1 != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;pNode = p1;<br>&nbsp;&nbsp;pNode-&gt;pre = p1-&gt;next;<br>&nbsp;&nbsp;p1 = p1-&gt;next;<br>&nbsp;&nbsp;pNode-&gt;next = p2;<br>&nbsp;&nbsp;p2 = pNode;<br>&nbsp;}</strong></p>
<p><strong>&nbsp;end = head;<br>&nbsp;head = p2;<br>}</strong></p>
<p><strong>#endif</strong></p>
<p>以上为双链表的基本操作，代码已经测试过了，可以直接用！<br>其中，head. end在构造函数时，New了两个对象，是为了Insert 和 Delete操作的方便！<br>更好的方式是:把指针和数据分开，这样head,end就可以节省存贮空间了！<br>方式如下：<br>//指针数据部分（后续指针和前驱指针）<br><strong>struct Node_base<br>{<br>&nbsp;Node_base *next;<br>&nbsp;Node_base *pre;<br>};</strong></p>
<p>//添加实际数据部分<br><strong>template &lt;class T&gt;<br>struct Node : public Node_base<br>{<br>&nbsp;T m_data;<br>};</strong></p>
<img src ="http://www.cppblog.com/QUIRE-0216/aggbug/30770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/QUIRE-0216/" target="_blank">QUIRE-0216</a> 2007-08-24 17:06 <a href="http://www.cppblog.com/QUIRE-0216/archive/2007/08/24/30770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>