﻿<?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++博客-Ben仔部落</title><link>http://www.cppblog.com/bwenpig/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 10:49:09 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 10:49:09 GMT</pubDate><ttl>60</ttl><item><title>IOCP学习笔记</title><link>http://www.cppblog.com/bwenpig/archive/2009/09/17/96510.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Thu, 17 Sep 2009 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2009/09/17/96510.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/96510.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2009/09/17/96510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/96510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/96510.html</trackback:ping><description><![CDATA[WSARecv只是提交接收请求,它是异步的,它与recv()的阻塞不一样;当GetQueuedCompletionStatus()有反应时,代表原先WSARecv提交的请求的那个buf中已经有数据了,不像recv还要到socket对应的系统缓冲区同步拷贝出来<br><br>（先将写关键的，稍后补上)<br><br><img src ="http://www.cppblog.com/bwenpig/aggbug/96510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2009-09-17 11:58 <a href="http://www.cppblog.com/bwenpig/archive/2009/09/17/96510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pimpl方法~~隐藏私有成员的不错方法</title><link>http://www.cppblog.com/bwenpig/archive/2009/06/28/88675.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sat, 27 Jun 2009 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2009/06/28/88675.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/88675.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2009/06/28/88675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/88675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/88675.html</trackback:ping><description><![CDATA[一般设计私有成员或者一些不想公开的到头文件的接口，可以尝试这个方法:<br>头文件:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">PimplSample.h</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0741f0;"></span><span style="color: #000000;"><span style="color: #0741f0;">struct</span> impl;<br></span><span style="color: #008080;">&nbsp;3</span> <span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CPimplSample<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPimplSample();<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">CPimplSamle();<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DoSomething();<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impl</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;m_pImpl;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">}</span></div>
cpp:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">PimplSample.cpp</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">PimplSample.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;impl{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DoAnthorThing(){<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std:cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;s&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;s;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">CPimplSample::CPimplSample():m_pImpl(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;imple(){<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;m_pImpl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;Impl</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">CPimplSample::</span><span style="color: #000000;">~</span><span style="color: #000000;">CPimplSample(){<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;delete&nbsp;m_pImpl;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">CPimplSample::DoSomething(){<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;m_pImpl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DoAnthorThing();<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>这样把要隐藏的属性和接口都写在cpp文件上就可以不外露到头文件上了，记得析构函数把impl指针施放哦<br><br>  <img src ="http://www.cppblog.com/bwenpig/aggbug/88675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2009-06-28 00:18 <a href="http://www.cppblog.com/bwenpig/archive/2009/06/28/88675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内联函数(Inline)</title><link>http://www.cppblog.com/bwenpig/archive/2009/05/31/86317.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sun, 31 May 2009 13:50:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2009/05/31/86317.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/86317.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2009/05/31/86317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/86317.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/86317.html</trackback:ping><description><![CDATA[ 　介绍内联函数之前，有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏，我们会经常定义一些宏，如
#define TABLE_COMP(x) ((x)>0?(x):0)

　 
就定义了一个宏。

　　为什么要使用宏呢？因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址，将函数的程序内容执行完后，再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址，转回后要恢复现场，并按原来保存地址继续执行。因此，函数调用要有一定的时间和空间方面的开销，于是将影响其效率。而宏只是在预处理的地方把代码展开，不需要额外的空间和时间方面的开销，所以调用一个宏比调用一个函数更有效率。 

　　但是宏也有很多的不尽人意的地方。

　　1、．宏不能访问对象的私有成员。

　　2、．宏的定义很容易产生二意性。

　　我们举个例子：
#define TABLE_MULTI(x) (x*x)


　　我们用一个数字去调用它,TABLE_MULTI(10)，这样看上去没有什么错误，结果返回100,是正确的，但是如果我们用TABLE_MULTI(10+10)去调用的话，我们期望的结果是４００，而宏的调用结果是(10+10*10+10),结果是120，这显然不是我们要得到的结果。避免这些错误的方法，一是给宏的参数都加上括号。
#define TABLE_MULTI(x) ((x)*(x))


　　这样可以确保不会出错，但是，即使使用了这种定义，这个宏依然有可能出错，例如使用TABLE_MULTI(a++)调用它，他们本意是希望得到(a+1)*(a+1)的结果，而实际上呢？我们可以看看宏的展开结果: (a++)*(a++)，如果a的值是４，我们得到的结果是5*6=30。而我们期望的结果是5*5=25,这又出现了问题。事实上，在一些C的库函数中也有这些问题。例如: Toupper(*pChar++)就会对pChar执行两次++操作，因为Toupper实际上也是一个宏。 

　　我们可以看到宏有一些难以避免的问题，怎么解决呢？

　　下面就是用我要介绍的内联函数来解决这些问题，我们可以使用内联函数来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。

　　内联函数和宏的区别在于，宏是由预处理器对宏进行替代，而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数，只是在需要用到的时候，内联函数像宏一样的展开，所以取消了函数的参数压栈，减少了调用的开销。你可以象调用函数一样来调用内联函数，而不必担心会产生于处理宏的一些问题。

　　我们可以用Inline来定义内联函数，不过，任何在类的说明部分定义的函数都会被自动的认为是内联函数。

　　下面我们来介绍一下内联函数的用法。

　　内联函数必须是和函数体申明在一起，才有效。像这样的申明Inline Tablefunction(int I)是没有效果的，编译器只是把函数作为普通的函数申明，我们必须定义函数体。
Inline tablefunction(int I) {return I*I};


　　这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。

　　我们也可以将定义在类的外部的函数定义为内联函数，比如：
Class TableClass{
　Private:
　　Int I,j;
　Public: 
　　Int add() { return I+j;};
　　Inline int dec() { return I-j;}
　　Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}


　　上面申明的三个函数都是内联函数。在C++中，在类的内部定义了函数体的函数，被默认为是内联函数。而不管你是否有inline关键字。

　　内联函数在C++类中，应用最广的，应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的，这样，外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话，将会获得比较好的效率。
Class sample{
　Private:
　　Int nTest;
　Public:
　　Int readtest(){ return nTest;}
　Void settest(int I) {nTest=I;}
}


　　当然，内联函数也有一定的局限性。就是函数中的执行代码不能太多了，如果，内联函数的函数体过大，一般的编译器会放弃内联方式，而采用普通的方式调用函数。这样，内联函数就和普通函数执行效率一样了。<img src ="http://www.cppblog.com/bwenpig/aggbug/86317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2009-05-31 21:50 <a href="http://www.cppblog.com/bwenpig/archive/2009/05/31/86317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>explicit关键字的作用</title><link>http://www.cppblog.com/bwenpig/archive/2009/05/31/86311.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sun, 31 May 2009 13:05:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2009/05/31/86311.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/86311.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2009/05/31/86311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/86311.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/86311.html</trackback:ping><description><![CDATA[ c++中的explicit关键字用来修饰类的构造函数，表明该构造函数是显式的，既然有"显式"那么必然就有"隐式"，那么什么是显示而什么又是隐式的呢？

如果c++类的构造函数有一个参数，那么在编译的时候就会有一个缺省的转换操作：将该构造函数对应数据类型的数据转换为该类对象，如下面所示： 
class MyClass
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
在上面的代码中编译器自动将整型转换为MyClass类对象，实际上等同于下面的操作： 
MyClass temp(10);
MyClass obj = temp;
上面的所有的操作即是所谓的"隐式转换"。

如果要避免这种自动转换的功能，我们该怎么做呢？嘿嘿这就是关键字explicit的作用了，将类的构造函数声明为"显示"，也就是在声明构造函数的时候前面添加上explicit即可，这样就可以防止这种自动的转换操作，如果我们修改上面的MyClass类的构造函数为显示的，那么下面的代码就不能够编译通过了，如下所示： 
class MyClass
{
public:
explicit MyClass( int num );
}
....
MyClass obj = 10; //err,can't non-explict convert<img src ="http://www.cppblog.com/bwenpig/aggbug/86311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2009-05-31 21:05 <a href="http://www.cppblog.com/bwenpig/archive/2009/05/31/86311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 调用Flash As脚本内的函数方法</title><link>http://www.cppblog.com/bwenpig/archive/2008/09/24/62691.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Wed, 24 Sep 2008 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2008/09/24/62691.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/62691.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2008/09/24/62691.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/62691.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/62691.html</trackback:ping><description><![CDATA[c++端：   
CallFunction("<invoke   name=\"test\"   returntype=\"xml\"><arguments><string>Hello,Flash</string></arguments></invoke>");   
    
    
  flash端的代码:   
  function   test(result:Object):Void   
  {   
  trace("call:   "+result+"");   
  }   
  flash.external.ExternalInterface.addCallback("test",   this,   test);   
  //需要flash8.0或者更高版本...     <img src ="http://www.cppblog.com/bwenpig/aggbug/62691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2008-09-24 17:45 <a href="http://www.cppblog.com/bwenpig/archive/2008/09/24/62691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>透明化窗口SetLayeredWindowAttributes</title><link>http://www.cppblog.com/bwenpig/archive/2008/08/30/60464.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sat, 30 Aug 2008 14:20:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2008/08/30/60464.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/60464.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2008/08/30/60464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/60464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/60464.html</trackback:ping><description><![CDATA[<form name="form2" method="post" action="/SYS/script/find.asp">
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tbody>
            <tr>
                <td><span id="docinfo"></span><br></td>
                <td align="right"><br></td>
            </tr>
        </tbody>
    </table>
</form>
<a href="http://www.vckbase.com/code/downcode.asp?id=2039">本文示例工程</a><br>
<p>
<strong>前言</strong><br>
<br>
很多文章示范了使用Windows 2000/XP的层次特性来实现窗口的透明化。本文可以通过该特性使任意窗口透明化，即使你没有该程序的源代码。
<br>
<br>
使用 "WinTrans" 程序你可以选择任意正在运行的程序，用鼠标左键拖拽左上角框内的棒并将它压在该程序的标题栏上，然后放开，则该程序就可以变成透明。你可以调整滑动条的位置来控制透明度。"WinTrans"
有一个非常象 SPY 的界面，还可以示范Win32 APIs的如下用法：用鼠标指针定位窗口，获取例如类名、标题等窗口信息。<br>
<br>
<strong>用法</strong><br>
<br>
在Windows 2000/XP中，User32.dll增加了一个新函数SetLayeredWindowAttributes。要使用该函数，我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED
(0x00080000)。该风格一旦被设置，我们就可以调用该函数来透明化窗口。该函数所需参数如下： <br>
</p>
<ul>
    <li>HWND hWnd: 窗口句柄</li>
    <li>COLORREF col: 透明化颜色</li>
    <li>BYTE bAlpha: ＝0：整个窗口透明, =255 完全不透明</li>
    <li>DWORD dwFlags: ＝1：仅颜色 col 透明， =2 :窗口按照bAlpha变量进行透明处理。</li>
</ul>
<p><strong>代码</strong> <br>
<br>
首先定义对话框的成员变量（WinTransDlg.h）。 </p>
<pre>bool m_bTracking;   // 当鼠标被捕捉时设置为TRUE<br>HWND m_hCurrWnd;    // 鼠标所在窗口的句柄<br>HCURSOR m_hCursor;  // 棒型光标句柄</pre>
同时定义一个指向SetLayeredWindowAttributes函数的指针。该函数在User32.dll中定义。
<pre>// 全局变量<br>typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, <br>              BYTE bAlpha, DWORD dwFlags);<br>lpfn g_pSetLayeredWindowAttributes;</pre>
在OnInitDialog事件中获取SetLayeredWindowAttributes函数的指针并且保存在全局变量g_pSetLayeredWindowAttributes中。
<pre>BOOL CWinTransDlg::OnInitDialog()<br>{<br>    ....<br>    //  获取函数 SetLayeredWindowAttributes 在User32.dll中的指针<br>    HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));<br>    g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32,<br>               "SetLayeredWindowAttributes");<br>    if (g_pSetLayeredWindowAttributes == NULL)<br>        AfxMessageBox (<br>            "Layering is not supported in this version of Windows",<br>             MB_ICONEXCLAMATION);<br> <br>    // 装入棒形光标<br>    HINSTANCE hInstResource = AfxFindResourceHandle(<br>         MAKEINTRESOURCE(IDC_WAND), RT_GROUP_CURSOR);<br>    m_hCursor = ::LoadCursor( hInstResource, MAKEINTRESOURCE(IDC_WAND) );<br>    ...<br>}</pre>
然后定义事件 WM_LBUTTONDOWN, WM_LBUTTONUP 和 WM_MOUSEMOVE 的触发函数. M_LBUTTONDOWN 事件代码如下：
<pre>void CWinTransDlg::OnLButtonDown(UINT nFlags, CPoint point)<br>{<br>    ...<br>    SetCapture();      //鼠标捕获设置到指定的窗口。在鼠标按钮按下的时候，这个窗口会为//当前应用程序或整个系统接收所有鼠标输入<br>    m_hCurrWnd = NULL; //现在还没有窗口透明<br>    m_bTracking = true;     // 设置track标志<br>    ::SetCursor(m_hCursor); // 将光标改为棒形    <br>}</pre>
WM_MOUSEMOVE事件处理函数：
<pre>void CWinTransDlg::OnMouseMove(UINT nFlags, CPoint point)<br>{<br>    ...<br>    if (m_bTracking)<br>    {<br>        ...<br>        //  获取鼠标位置<br>        ClientToScreen(&point);<br>        ...<br>        // 获取鼠标下面所在的窗口句柄<br>        m_hCurrWnd = ::WindowFromPoint(point);<br>        ...<br>        // 显示该窗口的类、标题等信息&#8230;<br>        ...<br>    }<br>    ...<br>}</pre>
<p>一旦用鼠标左键在窗口内点击并且不释放，鼠标的指针将变为棒形，并且该窗口的信息将显示在WinTrans窗口上。 当鼠标左键被释放后，事件WM_LBUTTONUP处理函数就被调用。
</p>
<pre>void CWinTransDlg::OnLButtonUp(UINT nFlags, CPoint point)<br>{<br>    ...<br>    //释放鼠标捕获<br>    ReleaseCapture();<br>    m_bTracking = false;<br>     //如果鼠标下面的窗口不是本程序WinTrans，我们就要设置层次样式并且通过设置滑动条来实现透明化。<br>    <br>    if (g_pSetLayeredWindowAttributes && m_hCurrWnd != m_hWnd)<br>    {<br>        ::SetWindowLong(m_hCurrWnd, GWL_EXSTYLE,<br>                        GetWindowLong(m_hCurrWnd, <br>                        GWL_EXSTYLE) ^ WS_EX_LAYERED);<br>        g_pSetLayeredWindowAttributes(m_hCurrWnd, 0,<br>                        (BYTE)m_slider.GetPos(), LWA_ALPHA);<br> <br>        ::RedrawWindow(m_hCurrWnd, NULL, NULL,<br>                       RDW_ERASE | RDW_INVALIDATE | <br>                       RDW_FRAME | RDW_ALLCHILDREN);<br>    }<br>    ...<br>}<br></pre>
原文作者：abhinaba，再此表示感谢！  <img src ="http://www.cppblog.com/bwenpig/aggbug/60464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2008-08-30 22:20 <a href="http://www.cppblog.com/bwenpig/archive/2008/08/30/60464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#和##宏的作用</title><link>http://www.cppblog.com/bwenpig/archive/2008/08/30/60462.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sat, 30 Aug 2008 13:15:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2008/08/30/60462.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/60462.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2008/08/30/60462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/60462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/60462.html</trackback:ping><description><![CDATA[<div class="postcontent">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">宏中</span><span lang="EN-US"><font face="Times New Roman">"#"</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">"##"</font></span><span style="font-family: 宋体;">的用法</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">一、一般用法</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">我们使用</span><span lang="EN-US"><font face="Times New Roman">#</font></span><span style="font-family: 宋体;">把宏参数变为一个字符串</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体;">用</span><span lang="EN-US"><font face="Times New Roman">##</font></span><span style="font-family: 宋体;">把两个宏参数贴合在一起</span><span lang="EN-US"><font face="Times New Roman">. </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">用法</span><span lang="EN-US"><font face="Times New Roman">: </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#include<cstdio> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#include<climits> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">using namespace std; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define STR(s)<span>&#160;&#160; </span>#s </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define CONS(a,b) int(a##e##b) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">int main() </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span>&#160; </span>printf(STR(vck));<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>// </font></span><span style="font-family: 宋体;">输出字符串</span><span lang="EN-US"><font face="Times New Roman">"vck" </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span>&#160; </span>printf("%d\n", CONS(2,3)); // 2e3 </font></span><span style="font-family: 宋体;">输出</span><span lang="EN-US"><font face="Times New Roman">:2000 </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>&#160; </span>return 0; </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">} </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&#160;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">二、当宏参数是另一个宏的时候</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">需要注意的是凡宏定义里有用</span><span lang="EN-US"><font face="Times New Roman">'#'</font></span><span style="font-family: 宋体;">或</span><span lang="EN-US"><font face="Times New Roman">'##'</font></span><span style="font-family: 宋体;">的地方宏参数是不会再展开</span><span lang="EN-US"><font face="Times New Roman">. </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">1, </font></span><span style="font-family: 宋体;">非</span><span lang="EN-US"><font face="Times New Roman">'#'</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">'##'</font></span><span style="font-family: 宋体;">的情况</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define TOW<span>&#160;&#160;&#160;&#160; </span>(2) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define MUL(a,b) (a*b) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW)); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这行的宏会被展开为：</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("%d*%d=%d\n", (2), (2), ((2)*(2))); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">MUL</font></span><span style="font-family: 宋体;">里的参数</span><span lang="EN-US"><font face="Times New Roman">TOW</font></span><span style="font-family: 宋体;">会被展开为</span><span lang="EN-US"><font face="Times New Roman">(2). </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">2, </font></span><span style="font-family: 宋体;">当有</span><span lang="EN-US"><font face="Times New Roman">'#'</font></span><span style="font-family: 宋体;">或</span><span lang="EN-US"><font face="Times New Roman">'##'</font></span><span style="font-family: 宋体;">的时候</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define A<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>(2) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define STR(s)<span>&#160;&#160; </span>#s </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define CONS(a,b) int(a##e##b) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("int max: %s\n", STR(INT_MAX));<span>&#160;&#160; </span>// INT_MAX #include<climits> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这行会被展开为：</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("int max: %s\n", "INT_MAX"); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("%s\n", CONS(A, A));<span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>// compile error </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这一行则是：</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("%s\n", int(AeA)); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">A</font></span><span style="font-family: 宋体;">不会再被展开</span><span lang="EN-US"><font face="Times New Roman">, </font></span><span style="font-family: 宋体;">然而解决这个问题的方法很简单</span><span lang="EN-US"><font face="Times New Roman">. </font></span><span style="font-family: 宋体;">加多一层中间转换宏</span><span lang="EN-US"><font face="Times New Roman">. </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">加这层宏的用意是把所有宏的参数在这层里全部展开</span><span lang="EN-US"><font face="Times New Roman">, </font></span><span style="font-family: 宋体;">那么在转换宏里的那一个宏</span><span lang="EN-US"><font face="Times New Roman">(_STR)</font></span><span style="font-family: 宋体;">就能得到正确的宏参数</span><span lang="EN-US"><font face="Times New Roman">. </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define A<span>&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span>(2) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define _STR(s)<span>&#160;&#160; </span>#s </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">#define STR(s)<span>&#160;&#160;&#160;&#160; </span>_STR(s)<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>// </font></span><span style="font-family: 宋体;">转换宏</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define _CONS(a,b) int(a##e##b) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">#define CONS(a,b)<span>&#160;&#160; </span>_CONS(a,b)<span>&#160;&#160;&#160;&#160; </span>// </font></span><span style="font-family: 宋体;">转换宏</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">printf("int max: %s\n", STR(INT_MAX));<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>// INT_MAX,int</font></span><span style="font-family: 宋体;">型的最大值，为一个变量</span><span lang="EN-US"><font face="Times New Roman"> #include<climits> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">输出为</span><span lang="EN-US"><font face="Times New Roman">: int max: 0x7fffffff </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">STR(INT_MAX) --> _STR(0x7fffffff) </font></span><span style="font-family: 宋体;">然后再转换成字符串；</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">printf("%d\n", CONS(A, A)); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">输出为：</span><span lang="EN-US"><font face="Times New Roman">200 </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2)) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">三、</span><span lang="EN-US"><font face="Times New Roman">'#'</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">'##'</font></span><span style="font-family: 宋体;">的一些应用特例</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="font-family: 宋体;">、合并匿名变量名</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define ___ANONYMOUS1(type, var, line) type var##line </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">例：</span><span lang="EN-US"><font face="Times New Roman">ANONYMOUS(static int); </font></span><span style="font-family: 宋体;">即</span><span lang="EN-US"><font face="Times New Roman">: static int _anonymous70; 70</font></span><span style="font-family: 宋体;">表示该行行号；</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">第一层：</span><span lang="EN-US"><font face="Times New Roman">ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__); </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">第二层：</span><span lang="EN-US"><font face="Times New Roman"><span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>--> ___ANONYMOUS1(static int, _anonymous, 70); </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">第三层：</span><span lang="EN-US"><font face="Times New Roman"><span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>--> static int _anonymous70; </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">即每次只能解开当前层的宏，所以</span><span lang="EN-US"><font face="Times New Roman">__LINE__</font></span><span style="font-family: 宋体;">在第二层才能被解开；</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体;">、填充结构</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define FILL(a)<span>&#160;&#160; </span>{a, #a} </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">enum IDD{OPEN, CLOSE}; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">typedef struct MSG{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">IDD id; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">const char * msg; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">}MSG; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">相当于：</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">MSG _msg[] = {{OPEN, "OPEN"}, </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>{CLOSE, "CLOSE"}}; </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体;">、记录文件名</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define _GET_FILE_NAME(f)<span>&#160;&#160; </span>#f </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define GET_FILE_NAME(f)<span>&#160;&#160; </span>_GET_FILE_NAME(f) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">static char FILE_NAME[] = GET_FILE_NAME(__FILE__); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="font-family: 宋体;">、得到一个数值类型所对应的字符串缓冲大小</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define _TYPE_BUF_SIZE(type) sizeof #type </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">#define TYPE_BUF_SIZE(type)<span>&#160;&#160; </span>_TYPE_BUF_SIZE(type) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">char buf[TYPE_BUF_SIZE(INT_MAX)]; </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>&#160; </span>--> char buf[_TYPE_BUF_SIZE(0x7fffffff)]; </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>&#160; </span>--> char buf[sizeof "0x7fffffff"]; </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这里相当于：</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">char buf[11];</font></span></p>
</div> <img src ="http://www.cppblog.com/bwenpig/aggbug/60462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2008-08-30 21:15 <a href="http://www.cppblog.com/bwenpig/archive/2008/08/30/60462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据图片产生不规则形状窗口</title><link>http://www.cppblog.com/bwenpig/archive/2008/08/30/60458.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Sat, 30 Aug 2008 12:43:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2008/08/30/60458.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/60458.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2008/08/30/60458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/60458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/60458.html</trackback:ping><description><![CDATA[//下面为根据指定的位图以及要去掉的颜色生成一个区域 &#160; <br> &#160; HRGN &#160; SetRgn(HBITMAP &#160; hBitmap,COLORREF &#160; clrKey) &#160;  &#160; <br> &#160; { &#160; <br> &#160;  &#160;  &#160; CBitmap &#160; bitmap &#160; ; &#160; <br> &#160;  &#160;  &#160; bitmap.Attach(hBitmap) &#160; ; &#160; <br> &#160;  &#160;  &#160; BITMAP &#160; bitmapInfo &#160; ; &#160; <br> &#160;  &#160;  &#160; bitmap.GetBitmap(&bitmapInfo) &#160; ; &#160; <br> &#160;  &#160;  &#160; int &#160; nRow &#160; = &#160; bitmapInfo.bmHeight &#160; ; &#160; <br> &#160;  &#160;  &#160; int &#160; nCol &#160; = &#160; bitmapInfo.bmWidth &#160; ; &#160; <br> &#160;  &#160;  &#160;  &#160; <br> &#160;  &#160;  &#160; CDC &#160; memDC &#160; ; &#160; <br> &#160;  &#160;  &#160; memDC.CreateCompatibleDC(NULL) &#160; ; &#160; <br> &#160;  &#160;  &#160; CBitmap* &#160; pOldBitmap &#160; = &#160; memDC.SelectObject(&bitmap) &#160; ; &#160; <br> &#160;  &#160;  &#160; CRgn &#160; rgn &#160; ; &#160;  &#160;  &#160; <br> &#160;  &#160;  &#160; rgn.CreateRectRgn(0,0,nCol,nRow) &#160; ; &#160; <br> &#160;  &#160;  &#160; for(int &#160; y &#160; = &#160; 0; &#160; y &#160; < &#160; nRow; &#160; y++) &#160; <br> &#160;  &#160;  &#160; { &#160; <br> &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160; for(int &#160; x &#160; = &#160; 0; &#160; x &#160; < &#160; nCol; &#160; x++) &#160; <br> &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160; { &#160; <br> &#160; 	 &#160;  &#160; COLORREF &#160; clrPixel &#160; = &#160; memDC.GetPixel(y,x) &#160; ; &#160; <br> &#160; 	 &#160;  &#160; if(clrPixel &#160; == &#160; clrKey)//去除关键色 &#160; <br> &#160; 	 &#160;  &#160; { &#160; <br> &#160; 	 &#160;  &#160;  &#160;  &#160;  &#160; CRgn &#160; rgnTemp &#160; ; &#160; <br> &#160; 	 &#160;  &#160;  &#160;  &#160;  &#160; rgnTemp.CreateRectRgn(y,x,y+1,x+1) &#160; ; &#160; <br> &#160; 	 &#160;  &#160;  &#160;  &#160;  &#160; rgn.CombineRgn(pRgn,&rgnTemp,RGN_XOR) &#160; ; &#160; <br> &#160; 	 &#160;  &#160;  &#160;  &#160;  &#160; rgnTemp.DeleteObject() &#160; ; &#160; <br> &#160; 	 &#160;  &#160; } &#160; <br> &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160;  &#160; } &#160; <br> &#160;  &#160;  &#160;  &#160; } &#160; <br> &#160;  &#160;  &#160;  &#160; memDC.SelectObject(pOldBitmap) &#160; ; &#160; <br> &#160;  &#160;  &#160;  &#160; memDC.DeleteDC() &#160; ; &#160; <br> &#160;  &#160;  &#160;  &#160; bitmap.Detach() &#160; ; &#160; <br> &#160;  &#160;  &#160;  &#160; (HRGN)return &#160; rgn.Detach() &#160; ; &#160; <br> &#160; } &#160; <br> &#160;  &#160; <br> &#160; 根据生成的区域设置窗口 &#160; <br> &#160; void &#160; SetWndRgn(HWND &#160; hWnd,HBITMAP &#160; hBitmap) &#160; <br> &#160; { &#160;  &#160; <br> &#160;  &#160;  &#160;  &#160; HRGN &#160; hRgn &#160; = &#160; SetRgn(hBitmap,clrKey)//其中clrKey为要mask掉的颜色值 &#160; <br> &#160;  &#160;  &#160;  &#160; SetWindowRgn(hRgn) &#160; ; &#160; <br> &#160;  &#160;  &#160;  &#160; return &#160; ; &#160; <br> &#160; }<br><br>网上找到1个代码例子 <a href="http://www.cppblog.com/Files/bwenpig/%E4%B8%8D%E8%A7%84%E5%88%99%E5%9B%BE%E5%BD%A2%E7%AA%97%E5%8F%A3.rar">下载</a><br>另外1个方法是用 SetLayeredWindowAttributes 例子 <a  href="http://www.cppblog.com/Files/bwenpig/%E4%B8%8D%E8%A7%84%E5%88%99%E5%9B%BE%E5%BD%A2%E7%AA%97%E5%8F%A32.rar">下载</a>   <img src ="http://www.cppblog.com/bwenpig/aggbug/60458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2008-08-30 20:43 <a href="http://www.cppblog.com/bwenpig/archive/2008/08/30/60458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>接口指针</title><link>http://www.cppblog.com/bwenpig/archive/2007/10/26/35224.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Fri, 26 Oct 2007 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2007/10/26/35224.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/35224.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2007/10/26/35224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/35224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/35224.html</trackback:ping><description><![CDATA[接口是一个虚基类,没有成员函数,通过它实现抽象. &#160; <br>&#160; 接口指针是指向虚基类的指针,通过它调用com对象的virtual &#160; 成员函数. &#160; <br>&#160; com对象是一个类,它继承接口,接口中的virtual &#160; 成员函数在com对象中实现.类的一个实例就是一个com对象.<br><br>这一句能描述接口指针的功能。。。先保存，迟下补回例子
 <img src ="http://www.cppblog.com/bwenpig/aggbug/35224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2007-10-26 10:57 <a href="http://www.cppblog.com/bwenpig/archive/2007/10/26/35224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取当前程序的路径</title><link>http://www.cppblog.com/bwenpig/archive/2007/10/18/34519.html</link><dc:creator>Ben仔</dc:creator><author>Ben仔</author><pubDate>Thu, 18 Oct 2007 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/bwenpig/archive/2007/10/18/34519.html</guid><wfw:comment>http://www.cppblog.com/bwenpig/comments/34519.html</wfw:comment><comments>http://www.cppblog.com/bwenpig/archive/2007/10/18/34519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bwenpig/comments/commentRss/34519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bwenpig/services/trackbacks/34519.html</trackback:ping><description><![CDATA[<p>虽然很简单，但是有时候想用起来却到处找，现在开了blog都没写东西。。。就把一些网上找来的资料来做个汇总，(*^__^*) 嘻嘻&#8230;&#8230;！！</p>
以下是获取当前程序路的代码：<br><br>
<div style="BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BORDER-LEFT: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid">//该函数用于获取执行文件的目录，bExit为TRUE时判断获取的目录是否存在，缺省为TRUE &#160; <br>&#160; BOOL &#160; GetModuleFilePath(CString& &#160; strPath, &#160; BOOL &#160; bExit) &#160; <br>&#160; { &#160; <br>&#160; strPath = &#160; ""; &#160; <br>&#160; char lpszFilePath[_MAX_PATH]; &#160; <br>&#160; if(::GetModuleFileName(NULL, &#160; lpszFilePath, &#160; _MAX_PATH) &#160; > &#160; 0) &#160; <br>&#160; { &#160; <br>&#160; char szDrive[_MAX_DRIVE]; &#160; <br>&#160; char szFolder[_MAX_DIR]; &#160; <br>&#160; char szFileName[_MAX_FNAME]; &#160; <br>&#160; char szExt[_MAX_EXT]; &#160; <br>&#160; _splitpath(lpszFilePath, &#160; szDrive, &#160; szFolder, &#160; szFileName, &#160; szExt); &#160; <br>&#160; strPath.Format("%s%s", &#160; szDrive, &#160; szFolder); &#160; <br>&#160; if(bExit) &#160; <br>&#160; { &#160; <br>&#160; // 如果bExit=TRUE，则判断目录是否存在，存在时才返回TRUE &#160; <br>&#160; if(_access(strPath, &#160; 0) &#160; == &#160; -1) &#160; <br>&#160; return FALSE; &#160; <br>&#160; } &#160; <br>&#160; &#160; <br>&#160; return TRUE; &#160; <br>&#160; } &#160; <br>&#160; &#160; <br>&#160; return FALSE; &#160; <br>&#160; }&#160;&#160;&#160;<br></div>
 <img src ="http://www.cppblog.com/bwenpig/aggbug/34519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bwenpig/" target="_blank">Ben仔</a> 2007-10-18 10:36 <a href="http://www.cppblog.com/bwenpig/archive/2007/10/18/34519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>