WTL的消息机制
WTL的消息机制
一、SDI流程
Run全局线程
1、 Module.AddMessageLoop(&theLoop), 保存CMessageLoop与一个线程id的对应,Module是全局变量。
2、 wndMain的构造,初始化变量
3、 wndMain的CreateEx
wndMain的Create
注册窗口类(窗口过程的地址是StartWindowProc)
调用基类CframeWindowImplBase的Create
保存实例的this到_module中_Module.AddCreateWndData(&m_thunk.cd, this);
Win32的CreateWindow函数
CreateWindow将触发第一个WM_XXX消息,从而调用StartWindowProc
StartWindowProc主要是初始化一个thunk代码,并将窗口过程修改为thunk的开始处,thunk代码先将堆栈中保存HWND的位值中放入this指针,然后用jmp跳到WndProc函数进行处理
4、调用wndMain.ShowWindow(nCmdShow);
5、int nRet = theLoop.Run();
6、_Module.RemoveMessageLoop();
线程结束
二、消息循环
// theLoop.Run();
int Run()
{
BOOL bDoIdle = TRUE;
int nIdleCount = 0;
BOOL bRet;
for(;;)
{
//检测队列中有无消息
while(!::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE) && bDoIdle)
{
if(!OnIdle(nIdleCount++))
bDoIdle = FALSE;
}
//得到消息并从队列中去除
bRet = ::GetMessage(&m_msg, NULL, 0, 0);
if(bRet == -1)
{
ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n"));
continue; // error, don´t process
}
//bRet是0表示收到WM_QUIT
else if(!bRet)
{
ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n"));
break; // WM_QUIT, exit message loop
}
//PreTranslateMessage遍历CMessageFilter如果有一个则调用并返回TRUE
//如果在窗口类中定义这个函数并且加入了filter他将不被发到窗口过程中去。
//注意这个函数是虚函数
if(!PreTranslateMessage(&m_msg))
{
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
}
if(IsIdleMessage(&m_msg))
{
bDoIdle = TRUE;
nIdleCount = 0;
}
}
return (int)m_msg.wParam;
}
三、ProcessMessage
ProcessMessage是一个虚函数,由派生类中通过宏定义实现被
WndProc调用。
参考文章
- · 调试Release版本应用程序
- · 简化异常安全代码
- · Nt/2000/xp平台下的存储控制模型(Access Control Model)
- · Direct3D9初级教程
- · What are you, Anyway
- · 泛型编程:再现Min和Max
- · 在IE工具栏上简单定制按钮
- · Nt/2000/xp平台下的存储控制模型(Access Control Model) (二)
- · Multithreading in .NET Applications
- · SNMP用VC++6.0实现的方法
- · 数据结构学习(c++)——二叉树
- · 数据结构学习(C++)——递归【1】
- · 数据结构学习(C++)——递归【2】(1)
- · 数据结构学习(C++)——递归【2】(2)
- · 数据结构学习(C++)——递归【2】(3)
- · 数据结构学习(C++)——递归【2】(4)
- · 关于异常的使用心得
- · 在VC中调用DirectShow全屏播放视频
- · 3D图形渲染通道负载优化的几种方法
- · 数据结构学习(C++)——递归【3】(1)
- · 旧爱如梦 (harrymeng旧书推荐)
- · ESMTP身份验证机制探索手记
- · 数据结构学习(C++)——递归【3】(2)
- · “扫雷”游戏的幕后
- · vc dll编程
- · Visual C++ 6.0的文档/视结构
- · VC增加自定义消息
- · 和GUI有关的各种对象
- · 文档 视图 框架窗口间的关系和消息传送规律
- · 线程
- · 特权提升
- · “瑜珈山夜话” ---- 闲谈“封装与抽象”
- · 用DEF文件从DLL中导出C++类
- · “瑜珈山夜话”--- 寻根究底谈“继承”(一)
- · 软件解密技术研究
- · “瑜珈山夜话”--- 参考资料
- · 写扫雷的一点感想(初学的朋友可以看看)
- · 运用VC或Java对Office进行编程操作
