WEB开发网
开发学院软件开发VC MFC教程(4)-- 消息映射的实现(2) 阅读

MFC教程(4)-- 消息映射的实现(2)

 2010-03-25 20:33:48 来源:WEB开发网   
核心提示:Windows消息处理函数的调用对一个Windows消息,匹配到了一个消息映射条目之后,MFC教程(4)-- 消息映射的实现(2)(3),将调用映射条目所指示的消息处理函数,调用处理函数的过程就是转换映射条目的pfn指针为适当的函数类型并执行它:MFC定义了一个成员函数指针mmf,消息处理函数都是同一原型,所以都被转换

Windows消息处理函数的调用

对一个Windows消息,匹配到了一个消息映射条目之后,将调用映射条目所指示的消息处理函数。

调用处理函数的过程就是转换映射条目的pfn指针为适当的函数类型并执行它:MFC定义了一个成员函数指针mmf,首先把消息处理函数的地址赋值给该函数指针,然后根据消息映射条目的nSig值转换指针的类型。但是,要给函数指针mmf赋值,必须使该指针可以指向所有的消息处理函数,为此则该指针的类型是所有类型的消息处理函数指针的联合体。

对上述过程,MFC的实现大略如下:

union MessageMapFunctions mmf;

mmf.pfn = lpEntry->pfn;

swithc (value_of_nsig){

case AfxSig_is: //OnCreate就是该类型

lResult = (this->*mmf.pfn_is)((LPTSTR)lParam);

break;

default:

ASSERT(FALSE); break;

}

LDispatchRegistered: // 处理registered windows messages

ASSERT(message >= 0xC000);

mmf.pfn = lpEntry->pfn;

lResult = (this->*mmf.pfn_lwl)(wParam, lParam);

如果消息处理函数有返回值,则返回该结果,否则,返回TRUE。

对于图4-1所示的例子,nSig等于AfxSig_is,所以将执行语句

(this->*mmf.pfn_is)((LPTSTR)lParam)

也就是对CTview::OnCreate的调用。

顺便指出,对于Registered窗口消息,消息处理函数都是同一原型,所以都被转换成lwl型(关于Registered窗口消息的映射,见4.4.2节)。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MFC 教程 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接