WIN32 API/WTL 学习笔记(消息传递过程)

  • ToolBar 图片背景透明色是75%灰色RGB(192,192,192)
  • 使用派生类控件必须使用SubClassWindow方式
  • 消息传递过程分析(除Modal对话框)

消息泵:

Messageloop::Run

 {
  BOOL bDoIdle = TRUE;
  int nIdleCount = 0;
  BOOL bRet;

  for(;;)
  {
   while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))
   {
    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
   }
   else if(!bRet)
   {
    ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting/n"));
    break;   // WM_QUIT, exit message loop
   }

   if(!PreTranslateMessage(&m_msg)) //调用从MessageFilter继承且注册到MessageLoop的窗口的pretranslate方法,按顺序
   {
    ::TranslateMessage(&m_msg);//快捷键转换
    ::DispatchMessage(&m_msg);//分发到对应窗口
   }

   if(IsIdleMessage(&m_msg))//空闲处理调用
   {
    bDoIdle = TRUE;
    nIdleCount = 0;
   }
  }

  return (int)m_msg.wParam;
 }

窗口子类化过程分析:

主要是宏

DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName())

声明了父窗口类,在ATL::CWindowImpl<T>::SubClassWindow内部设置defwindowproc为父类

通过类似dos中断挂接方式一层层处理

未完,待续。

如有错误请指正

阅读更多
换一批

没有更多推荐了,返回首页