判断message于0xC000的大小关系有什么用?union MessageMapFunctions mmf;
mmf.pfn=lpEntry->pfn;
//这里不是已经将消息处理函数赋值了吗?为何下面的返回值是另外一个函数?
switch (lpEntry->nSig)
case AfxSig_is:
         lResult=(this->*mmf.pfn_is)(.......);
         break;
case AfxSig_lwl:
         lResult=(this->*mmf.pfn_lwl)(......);
         break;
.........mmf.pfn_is mmf.pfn_lwl等等这类函数是什么? 
望前辈解答,不慎感激,定当结账。

解决方案 »

  1.   

    0XC000 是消息范围的一个界限,类似的还有 WM_USER, WM_APP 判断消息的范围是确保(确定)消息是类型。pfn_is, pfn_lwl 是消息处理函数的类型定义。因为有些消息处理函数只有一个参数,有些则有两个参数,还有些接受更多的参数。因此必须更具他们的类型来使用适当的调用。pfn后面的字母(is, lwl)代表了参数的类型。具体什么类型,看原码吧,记不清了。
    大概是这样子,pfn_lwl 表示有3个参数(或者两个参数一个返回值?),其类型依次为long, word, long。(这只是个大意,准确的信息还得看原码。)
      

  2.   

    那么前面pfn他不是函数吗?则么回有两个?
      

  3.   

    手头不方便开VC,没法看原码。不过从 MessageMapFunctions 的定义来看,是个union。因此他所有的pfn*都是指向一个相同的内容。也就是说 pfn , pfn_is, pfn_lwl指向的是同一个函数指针。
    pfn是普通指针,接受任何函数指针类型,用于向该union付值。
    而pfn_is, pfn_lwl则是该指针可能的函数原型(指针)。简单地说,就是先把函数指针传给万能的pfn。然后根据函数的类型,用合适的函数原型调用该函数指针:pfn_is,pfn_lwl......