亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? atlapp.h文件剖析.txt

?? WTL源碼剖析 --- ATLAPP.H
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
              if(::IsWindow(hNtfWnd))
              {
// need conditional code because types don't match in winuser.h
#ifdef _WIN64
                   ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this);
#else
                   ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrToLong(this));
#endif
                   //加入該窗口句柄
                   bRet = m_pSettingChangeNotify->Add(hNtfWnd);
              }
              else
              {
                   bRet = FALSE;
              }
         }
 
          lock.Unlock();
 
         return bRet;
     }
該函數用來初始化一個存放窗口句柄的對象
 
     BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc)
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::InitSettingChangeNotify.\n"));
              ATLASSERT(FALSE);
              return FALSE;
         }
 
          if(m_pSettingChangeNotify == NULL)
         {
              typedef ATL::CSimpleArray<HWND>   _notifyClass;
              ATLTRY(m_pSettingChangeNotify = new _notifyClass);
              ATLASSERT(m_pSettingChangeNotify != NULL);
         }
 
         BOOL bRet = (m_pSettingChangeNotify != NULL);
          if(bRet && m_pSettingChangeNotify->GetSize() == 0)
         {
              // init everything
              //??空的ATL Dialog Template嗎?
              _ATL_EMPTY_DLGTEMPLATE templ;
              //增加一個無模式對話框
              HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc);
              ATLASSERT(::IsWindow(hNtfWnd));
              if(::IsWindow(hNtfWnd))
              {
// need conditional code because types don't match in winuser.h
#ifdef _WIN64
                   ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this);
#else
                   ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrToLong(this));
#endif
                   bRet = m_pSettingChangeNotify->Add(hNtfWnd);
              }
              else
              {
                   bRet = FALSE;
              }
         }
 
          lock.Unlock();
 
         return bRet;
     }
 
     //清理消息
     void TermSettingChangeNotify()
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::TermSettingChangeNotify.\n"));
              ATLASSERT(FALSE);
              return;
         }
 
          if(m_pSettingChangeNotify != NULL && m_pSettingChangeNotify->GetSize() > 0)
              //銷毀窗口
              ::DestroyWindow((*m_pSettingChangeNotify)[0]);
         delete m_pSettingChangeNotify;
          m_pSettingChangeNotify = NULL;
 
          lock.Unlock();
     }
 
BOOL AddSettingChangeNotify(HWND hWnd)
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddSettingChangeNotify.\n"));
              ATLASSERT(FALSE);
              return FALSE;
         }
 
          ATLASSERT(::IsWindow(hWnd));
         BOOL bRet = FALSE;
          if(InitSettingChangeNotify() != FALSE)
              bRet = m_pSettingChangeNotify->Add(hWnd);
 
          lock.Unlock();
 
         return bRet;
     }
 
BOOL RemoveSettingChangeNotify(HWND hWnd)
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveSettingChangeNotify.\n"));
              ATLASSERT(FALSE);
              return FALSE;
         }
 
         BOOL bRet = FALSE;
          if(m_pSettingChangeNotify != NULL)
              bRet = m_pSettingChangeNotify->Remove(hWnd);
 
          lock.Unlock();
 
         return bRet;
     }
 
     現在回到剛才提到的Run()函數,里面最開始就定義了一個CmessageLoop循環對象,然后通過_Module對象的AddMessageLoop成員函數加入到循環隊列里面,直到_Module調用了RemoveMessageLoop移除循環隊列,程序才結束循環,返回到WinMain函數。
     在這里還有一個比較重要的類,那就是CMessageLoop,是他維持了系統的消息,維持了程序的生命周期。那么下面我們來看看這個類的定義和具體的實現方法。
CmessageLoop包含了如下一些成員函數和成員變量
成員變量
//處理消息
     ATL::CSimpleArray<CMessageFilter*> m_aMsgFilter;
     //處理空閑句柄
     ATL::CSimpleArray<CIdleHandler*> m_aIdleHandler;
     //Win32API消息結構
     MSG m_msg;
 
     成員函數(用紅色標記的函數是虛函數)
AddMessageFilter         加入一條消息過濾
RemoveMessageFilter      移除一條消息過濾
AddIdleHandler       加入一個空閑句柄
RemoveIdleHandler         移出一個空閑句柄
AddUpdateUI              為了兼容老的ATL而設計的
RemoveUpdateUI           為了兼容老的ATL而設計的
IsIdleMessage            過濾一些比如WM_MOUSEMOVE之類的消息
Run                      消息循環。關鍵部分!!!
PreTranslateMessage      消息過濾
OnIdle                   空閑處理
 
再這里我不準備對每個函數都進行詳細的分析,主要分析核心的函數Run,CmessageLoop由它來維持著系統的消息循環。
函數如下:
int Run()
     {
         //空閑?
         BOOL bDoIdle = TRUE;
         //空閑計數器
         int nIdleCount = 0;
         //返回標志
         BOOL bRet;
 
         //開始消息循環了哦!!!
          for(;;)
         {
 
              //當bDoIdle為TRUE,并且不能從消息隊列里面取出消息了,那么開始空閑操作了!
              //PM_NOREMOVE:再PeekMessage函數處理后不將消息從隊列里移除
              while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))
              {
                   if(!OnIdle(nIdleCount++))
                        bDoIdle = FALSE;
              }
              
              //從當前線程獲取一個消息
              //返回-1表示出現一個錯誤
              //返回 0表示提交了一個WM_QUIT,程序將要退出
              //成功獲得一個消息,返回不等于0的值
              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
              }
 
              //如果熟悉使用c語言來寫Win32的程序員會發現,原來WinMain中的哪個處理消息循環的語句放到這里來了!!!
              if(!PreTranslateMessage(&m_msg))
              {
                   //translates virtual-key messages into character messages.
                   ::TranslateMessage(&m_msg);
                   //dispatches a message to a window procedure
                   ::DispatchMessage(&m_msg);
              }
              
              //判斷是否為空閑消息?
              //排除WM_MOUSEMOVE WM_NCMOUSEMOVE WM_SYSTIMER消息
              if(IsIdleMessage(&m_msg))
              {
                   bDoIdle = TRUE;
                   nIdleCount = 0;
              }
         }
 
         return (int)m_msg.wParam;
     }
以上就是對ATLAPP.H中的幾個比較重要的類的分析,還有其他幾個類的分析我將放在以后的文章中
(待續。。。)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品1区2区3区| 久久久久亚洲蜜桃| 大陆成人av片| 亚洲天堂成人在线观看| 972aa.com艺术欧美| 白白色 亚洲乱淫| 岛国一区二区在线观看| 91在线无精精品入口| 国产精品亚洲а∨天堂免在线| 久久久久久久久久久久电影| 成人免费视频一区| 欧美韩国日本一区| 亚洲免费av观看| 亚洲激情在线激情| 视频在线在亚洲| 久久机这里只有精品| 色94色欧美sute亚洲线路二| 成人h动漫精品一区二| 94色蜜桃网一区二区三区| 久久99国产精品尤物| 欧美日韩国产小视频| 亚洲精品乱码久久久久久久久 | 26uuuu精品一区二区| 久久99久久精品| 99久久夜色精品国产网站| 亚洲网友自拍偷拍| 一区二区三区四区在线免费观看 | 日韩—二三区免费观看av| 日韩欧美综合在线| 国产jizzjizz一区二区| 日韩精品乱码av一区二区| 亚洲三级在线看| 国产精品乱子久久久久| 欧美日韩成人激情| 色老汉一区二区三区| 欧美一卡2卡3卡4卡| 日韩一区二区免费在线电影| 亚洲精品五月天| 在线视频国内一区二区| 日韩精品一区在线观看| 日本午夜精品视频在线观看| 欧美午夜寂寞影院| 成人app下载| 国产午夜精品久久| 视频一区欧美日韩| 国产人伦精品一区二区| 韩国一区二区视频| 91精品麻豆日日躁夜夜躁| 日韩精品资源二区在线| 国产精品1区2区| 亚洲成人资源网| 91国偷自产一区二区使用方法| 国产原创一区二区| 国产精品免费aⅴ片在线观看| 国产在线看一区| 亚洲一区在线观看视频| 成人看片黄a免费看在线| 亚洲国产aⅴ成人精品无吗| 欧美性受xxxx黑人xyx性爽| 综合久久综合久久| 91麻豆国产精品久久| 喷水一区二区三区| 亚洲欧美在线观看| 欧美tk—视频vk| 精品一区二区三区视频在线观看| 日韩欧美一级精品久久| 日韩av中文字幕一区二区三区| 色综合久久天天| 亚洲在线观看免费视频| 东方aⅴ免费观看久久av| 日韩一区中文字幕| 99国产精品视频免费观看| 一区二区三区中文在线| 91免费在线视频观看| 56国语精品自产拍在线观看| 一区二区三区视频在线观看| 色偷偷久久人人79超碰人人澡| 久久在线观看免费| 久久国产生活片100| 精品国一区二区三区| 亚洲免费色视频| 久久久久久久久久久电影| 欧美综合亚洲图片综合区| 99re热视频精品| 极品销魂美女一区二区三区| 精品综合久久久久久8888| 99v久久综合狠狠综合久久| 精品污污网站免费看| 亚洲国产成人精品视频| 午夜a成v人精品| 亚洲欧美成人一区二区三区| 91美女片黄在线观看91美女| 韩国v欧美v日本v亚洲v| 日本一区二区三区四区| 中文字幕亚洲欧美在线不卡| 欧美日韩电影在线播放| 五月天亚洲精品| 国产女主播一区| 精品视频在线免费看| 亚洲bt欧美bt精品777| 久久精品一区蜜桃臀影院| 2022国产精品视频| 中文字幕乱码日本亚洲一区二区| 欧美综合色免费| 欧洲色大大久久| 久久久久久久久久久久久女国产乱| 国产综合色视频| 美国十次综合导航| 卡一卡二国产精品| 99re视频精品| 日韩色视频在线观看| 91精品婷婷国产综合久久性色| 欧美电影一区二区三区| 91精品国产手机| 亚洲蜜桃精久久久久久久| 成人高清av在线| 老司机一区二区| 精品国产成人在线影院| 国产免费成人在线视频| 亚洲视频一区二区在线观看| 亚洲午夜视频在线观看| 亚洲午夜精品一区二区三区他趣| 亚洲一区在线播放| 中文字幕av一区二区三区| 欧美视频一区二区三区| 国产精品久线在线观看| 国产伦精品一区二区三区免费 | 成人av在线资源网| 日韩一区二区三| 久久精品国产色蜜蜜麻豆| 欧美日韩国产综合草草| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲日韩欧美一区二区在线| 亚洲精品国久久99热| 国产激情偷乱视频一区二区三区| 欧美艳星brazzers| 日韩一级二级三级| 亚洲日本韩国一区| 国产资源精品在线观看| 成人激情黄色小说| 国产精品毛片高清在线完整版| 久久av老司机精品网站导航| 成人美女在线观看| 欧美大片在线观看一区二区| 91精品国产综合久久久蜜臀图片| 日韩欧美国产综合| 日韩欧美亚洲国产精品字幕久久久| 国产福利精品导航| 男人的天堂久久精品| 欧洲一区二区三区在线| 日韩视频一区在线观看| 日韩精品一区二区三区老鸭窝| 韩国成人在线视频| 亚洲一二三四久久| 欧美日韩日日夜夜| 亚洲精品老司机| 欧美zozozo| 国产成人在线看| 17c精品麻豆一区二区免费| 欧美片在线播放| 3atv一区二区三区| 91精品国产一区二区人妖| 五月激情综合网| 亚洲国产精品v| 亚洲欧美一区二区三区孕妇| 1024精品合集| 久久蜜桃av一区二区天堂| 日韩午夜精品视频| 日韩欧美你懂的| 欧美日韩aaaaaa| 在线观看日韩精品| 色婷婷av一区二区| 日韩欧美色电影| 在线视频综合导航| 一本一道久久a久久精品| 国产成a人亚洲| 大胆欧美人体老妇| 国产成人免费视频网站| 国产91综合网| 国产mv日韩mv欧美| 91一区在线观看| 成人黄页毛片网站| 成人深夜视频在线观看| 国产精品无圣光一区二区| 亚洲国产视频一区| 中文字幕在线不卡一区| 日本高清不卡在线观看| 国产精品国产自产拍高清av| 欧美日韩一区二区三区不卡| 91豆麻精品91久久久久久| 欧美羞羞免费网站| 中文一区二区在线观看| 亚洲午夜久久久久| 亚洲成人免费视| 国产精品系列在线观看| 欧美日韩中文字幕一区| 欧美激情一区二区三区蜜桃视频| 激情综合网激情| 色婷婷av一区二区三区大白胸| 欧美一区二区三区在线观看视频|