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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? atlapp.h文件剖析.txt

?? WTL源碼剖析 --- ATLAPP.H
?? TXT
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
WTL源碼剖析 --- ATLAPP.H  

作者:姜江
QQ:457283
E-mail:jznsmail@163.net

ATLAPP.H包含了消息循環(huán)類、接口類、和產(chǎn)生應(yīng)用程序所必需的一些基礎(chǔ)類定義。
       類定義如下:
              CmessageFilter類---用于消息過(guò)濾的
        CidleHandler 類---用于空閑消息處理的
        CmessageLoop類---用于消息循環(huán)的
              CappModule 類---應(yīng)用程序基礎(chǔ)類
              CserverAppModule類---用于Com服務(wù)構(gòu)架的應(yīng)用程序類
       另外還有3個(gè)全局函數(shù):
              AtlGetDefaultGuiFont()獲得默認(rèn)的顯示字體
              AtlCreateBoldFont()   產(chǎn)生一個(gè)粗體字體
              AtlInitCommonControls()初始化一些控件所需共同的DLL
      WTL程序的結(jié)構(gòu)
       一個(gè)窗口程序的創(chuàng)建到銷(xiāo)毀過(guò)程主要經(jīng)過(guò)如下幾個(gè)階段
1. 注冊(cè)窗口類
2. 創(chuàng)建窗口
3. 進(jìn)入消息循環(huán)
如果用C寫(xiě)過(guò)Win32窗口程序的人一定會(huì)記得如下的結(jié)構(gòu):
//窗口過(guò)程處理函數(shù)
LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
          HWND hwnd = NULL;
          MSG msg;
          WNDCLASS wndclass;
          wndclass.style       = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc = WndProc;
     //注冊(cè)窗口
     if(!RegisterClass(&wndclass))
     {
          MessageBox(NULL,TEXT("Porgram requires Windows NT!"),szAppName,MB_ICONERROR);
          return 0;
          }
     //創(chuàng)建窗口
     hwnd = CreateWindow(szAppName,TEXT("My Application"),
     WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
     CW_USEDEFAULT,CW_USEDEFAULT,
     CW_USEDEFAULT,CW_USEDEFAULT,
     NULL,NULL,hInstance,NULL);
 
          ShowWindow(hwnd,iCmdShow);
          UpdateWindow(hwnd);
         
         //進(jìn)入消息循環(huán)
          while(GetMessage(&msg,NULL,0,0))
          {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
     }
 
     return msg.wParam;
}
那么你可能會(huì)問(wèn)WTL的WinMain函數(shù)再哪里?如果你通過(guò)WTL/ATL導(dǎo)向生成一個(gè)應(yīng)用程序,那么你會(huì)在跟工程名字同名的.cpp文件中發(fā)現(xiàn)如下的代碼:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
     HRESULT hRes = ::CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call instead to 
// make the EXE free threaded. This means that calls come in on a random RPC thread.
//     HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
          ATLASSERT(SUCCEEDED(hRes));
 
// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
          ::DefWindowProc(NULL, 0, 0, 0L);
 
        AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); // add flags to support other controls
 
     hRes = _Module.Init(NULL, hInstance); //等下分析它的實(shí)現(xiàn)     ATLASSERT(SUCCEEDED(hRes));
 
     int nRet = Run(lpstrCmdLine, nCmdShow);//程序的關(guān)鍵分
 
     _Module.Term();
     ::CoUninitialize();
 
     return nRet;
}    
從這個(gè)_tWinMain函數(shù)的定義,你可以發(fā)現(xiàn)程序的關(guān)鍵部分是我紫色標(biāo)記出來(lái)的Run()函數(shù)。這個(gè)函數(shù)是一個(gè)自定義的函數(shù),不過(guò)如果通過(guò)ATL/WTL導(dǎo)向程序,那么會(huì)自動(dòng)生成這樣一個(gè)Run()函數(shù)的,下面我們先分析一下這個(gè)自動(dòng)生成的Run函數(shù)。
int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
     CMessageLoop theLoop;                  //定義消息循環(huán)
     _Module.AddMessageLoop(&theLoop);   //將消息添加到消息循環(huán)
 
     CMainFrame wndMain;                //應(yīng)用程序框架類
 
     //生成框架
     if(wndMain.CreateEx() == NULL)
     {
          ATLTRACE(_T("Main window creation failed!\n"));
         return 0;
     }
 
     //顯示框架
     wndMain.ShowWindow(nCmdShow);
 
     //運(yùn)行消息循環(huán)
     int nRet = theLoop.Run();
 
     //清除消息
     _Module.RemoveMessageLoop();
     return nRet;
}
通過(guò)這個(gè)Run函數(shù)我們可以看到在函數(shù)中完成了如下幾個(gè)過(guò)程:
1. 生成一個(gè)消息循環(huán)對(duì)象(theLoop)
2. 在全局的_Module中加入這個(gè)消息循環(huán)
3. 生成一個(gè)應(yīng)用程序框架對(duì)象
4. 顯示應(yīng)用程序框架
5. 開(kāi)始消息循環(huán)
6. 結(jié)束消息循環(huán)
7. 返回WinMain函數(shù),結(jié)束程序
實(shí)現(xiàn)分析
在這篇文章我不想過(guò)多的分析應(yīng)用程序框架和窗口的細(xì)節(jié),這些內(nèi)容將放在以后的幾篇文章中詳細(xì)分析,本文主要對(duì)ATLAPP.H頭文件中實(shí)現(xiàn)的一些過(guò)程進(jìn)行詳細(xì)分析。
首先從全局變量_Module開(kāi)始。
_Module維持著生成應(yīng)用程序的主線程,控制著程序的消息循環(huán)隊(duì)列,是一個(gè)CAppModule的對(duì)象。該CAppModule從ATL::CcomModule繼承。
在WTL::CappModule中定義了8個(gè)公有成員函數(shù),分別為:
AddMessageLoop()添加一個(gè)消息循環(huán),進(jìn)入消息循環(huán)隊(duì)列里。
RemoveMessageLoop()移除消息循環(huán)隊(duì)列。
GetMessageLoop()獲得消息循環(huán)。
InitSettingChangeNotify()初始化環(huán)境
AddSettingChangeNotify()添加一個(gè)窗口句柄。
RemoveSettingChangeNotify()清理環(huán)境
除了8個(gè)公有成員函數(shù)外,該類還定義了3個(gè)公有成員變量
m_dwMainThreadID負(fù)責(zé)保存該應(yīng)用程序的主線程ID
m_pMsgLoopMap負(fù)責(zé)存儲(chǔ)消息循環(huán)
m_pSettingChangeNotify負(fù)責(zé)存放窗口句柄
下面分別來(lái)分析幾個(gè)主要成員函數(shù)的實(shí)現(xiàn):
BOOL AddMessageLoop(CMessageLoop* pMsgLoop)
{
     CStaticDataInitCriticalSectionLock lock;
     //鎖住關(guān)鍵片斷,由于進(jìn)程同步的關(guān)系?。。?     if(FAILED(lock.Lock()))
     {
          ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n"));
          ATLASSERT(FALSE);
     return FALSE;
     }
         
     ATLASSERT(pMsgLoop != NULL);
     ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL);   // not in map yet
 
     BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop);
 
     lock.Unlock();
 
     return bRet;
}
     關(guān)鍵部分我用紅色的字體標(biāo)記出來(lái)了,意思是什么?通過(guò)當(dāng)前線程的Id來(lái)標(biāo)示一個(gè)消息循環(huán),存儲(chǔ)在m_pMsgLoopMap中。
 
BOOL RemoveMessageLoop()
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveMessageLoop.\n"));
              ATLASSERT(FALSE);
              return FALSE;
         }
 
         BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId());
 
          lock.Unlock();
 
         return bRet;
     }
       關(guān)鍵部分同樣通過(guò)紅色字體標(biāo)記出來(lái),嗯,沒(méi)錯(cuò)正如AddMessageLoop函數(shù)一樣,該函數(shù)也是通過(guò)線程Id來(lái)尋找消息循環(huán)移除對(duì)象的。
 
CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId()) const
     {
          CStaticDataInitCriticalSectionLock lock;
          if(FAILED(lock.Lock()))
         {
              ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::GetMessageLoop.\n"));
              ATLASSERT(FALSE);
              return NULL;
         }
 
          CMessageLoop* pLoop = m_pMsgLoopMap->Lookup(dwThreadID);
 
          lock.Unlock();
 
         return pLoop;
     }
該函數(shù)通過(guò)線程Id在m_pMsgLoopMap消息隊(duì)列中尋找對(duì)應(yīng)的消息循環(huán),找到后返回。
 
     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_EMPTY_DLGTEMPLATE templ;
              //增加一個(gè)無(wú)模式對(duì)話框
              HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc);
              ATLASSERT(::IsWindow(hNtfWnd));

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本乱码在线观看| 激情六月婷婷久久| 精品国产乱码久久久久久夜甘婷婷| 成人午夜看片网址| 日韩精品一区第一页| 国产精品青草综合久久久久99| 欧美电影在哪看比较好| 99久久婷婷国产综合精品| 免费不卡在线视频| 亚洲曰韩产成在线| 欧美国产激情二区三区| 69堂成人精品免费视频| 91亚洲国产成人精品一区二区三| 国内成+人亚洲+欧美+综合在线 | 欧美综合欧美视频| 粉嫩在线一区二区三区视频| 久久精品国产亚洲高清剧情介绍| 亚洲一区二区欧美| 一区二区在线观看免费视频播放| 中文字幕欧美激情一区| 精品国精品自拍自在线| 欧美tickling网站挠脚心| 欧美美女bb生活片| 欧美午夜免费电影| 91网站在线播放| www.久久久久久久久| 国产成人在线看| 国产精品小仙女| 国产精品99久久久久久似苏梦涵| 激情五月激情综合网| 麻豆国产一区二区| 久久精品国产久精国产| 久久丁香综合五月国产三级网站| 日本欧美大码aⅴ在线播放| 亚洲bt欧美bt精品| 亚洲不卡av一区二区三区| 亚洲午夜日本在线观看| 亚洲国产一区二区三区青草影视| 一个色妞综合视频在线观看| 一区二区激情小说| 亚洲一二三四在线| 午夜久久久久久久久| 欧美aⅴ一区二区三区视频| 蜜桃精品视频在线| 国产一区二区成人久久免费影院 | 久久色视频免费观看| 精品成人一区二区三区| 欧美国产综合一区二区| 国产精品美日韩| 亚洲美女偷拍久久| 亚洲va欧美va人人爽午夜| 日本三级亚洲精品| 国产美女在线观看一区| 成人国产免费视频| 色呦呦日韩精品| 欧美日韩免费不卡视频一区二区三区| 欧美日韩亚洲不卡| 2020日本不卡一区二区视频| 国产精品午夜在线| 亚洲午夜精品一区二区三区他趣| 秋霞午夜av一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 成人性生交大合| 欧美在线观看禁18| 精品国一区二区三区| 国产精品国产精品国产专区不蜜| 亚洲国产一区二区a毛片| 免费久久精品视频| av不卡一区二区三区| 欧美精品日韩一本| 国产亚洲va综合人人澡精品| 樱桃国产成人精品视频| 裸体歌舞表演一区二区| 99精品久久免费看蜜臀剧情介绍| 欧美日本韩国一区| 日本一区二区动态图| 亚洲国产精品尤物yw在线观看| 国产在线精品一区二区不卡了 | 精品少妇一区二区| 亚洲三级免费观看| 免费精品99久久国产综合精品| 9i看片成人免费高清| 日韩免费高清电影| 亚洲色图一区二区三区| 美腿丝袜亚洲三区| 色偷偷88欧美精品久久久| 欧美大片在线观看一区二区| 一区二区三区四区不卡视频| 久久99精品国产麻豆婷婷洗澡| 93久久精品日日躁夜夜躁欧美| 51精品秘密在线观看| 中文字幕日韩一区| 麻豆精品一区二区综合av| 99热国产精品| 久久久精品中文字幕麻豆发布| 亚洲午夜电影在线观看| av中文一区二区三区| 久久丝袜美腿综合| 日韩国产精品久久久久久亚洲| 色婷婷av一区| 中文字幕乱码日本亚洲一区二区| 日韩高清在线观看| 97久久精品人人爽人人爽蜜臀| 精品久久久久久无| 日韩精品电影在线| 91黄色免费版| 亚洲日本电影在线| www.66久久| 欧美激情综合在线| 国产一区二区三区精品视频| 欧美一区二区三区在线电影| 亚洲自拍偷拍综合| 91香蕉视频污| 亚洲欧美日韩综合aⅴ视频| 国产sm精品调教视频网站| 日韩欧美国产一区二区三区 | 欧美女孩性生活视频| 亚洲欧美日韩国产综合| 福利一区福利二区| 久久―日本道色综合久久| 免费精品视频在线| 日韩一区二区视频在线观看| 亚洲大片免费看| 在线观看欧美日本| 亚洲综合激情网| 欧美天堂亚洲电影院在线播放| 亚洲天堂成人网| 91小视频免费看| 亚洲欧美激情插| 91视频一区二区| 18成人在线视频| 91毛片在线观看| 亚洲日本欧美天堂| 在线日韩国产精品| 亚洲国产人成综合网站| 在线看一区二区| 亚洲成人激情社区| 欧美日韩国产a| 免费观看在线色综合| 欧美大白屁股肥臀xxxxxx| 激情欧美一区二区| 久久久久久久久久久久电影| 国产91精品精华液一区二区三区| 国产精品五月天| 99精品视频一区二区| 一区二区三区国产豹纹内裤在线| 欧美日韩一区高清| 日本vs亚洲vs韩国一区三区| 精品99一区二区| bt欧美亚洲午夜电影天堂| 一区二区三区欧美| 欧美电影一区二区| 国产一区二区久久| 中文字幕一区二区三区在线播放| 91成人看片片| 男女男精品网站| 欧美国产激情一区二区三区蜜月| 色综合亚洲欧洲| 日本不卡一二三| 国产精品色婷婷久久58| 99re成人在线| 日韩国产高清影视| 欧美国产日韩a欧美在线观看| 色综合天天视频在线观看| 日韩电影在线免费| 国产日产欧美精品一区二区三区| 91视频免费观看| 蜜桃久久av一区| 最新不卡av在线| 777欧美精品| 成人免费毛片a| 丝袜亚洲另类丝袜在线| 国产偷国产偷精品高清尤物| 在线观看免费亚洲| 国产剧情一区二区| 亚洲精品videosex极品| 日韩欧美国产一区二区在线播放| 99久久婷婷国产精品综合| 日韩精品三区四区| 国产精品素人一区二区| 欧美精品自拍偷拍动漫精品| 成人av在线资源网| 日本不卡视频在线观看| 亚洲天天做日日做天天谢日日欢| 日韩视频永久免费| 色婷婷狠狠综合| 国产成人综合在线| 日韩专区一卡二卡| 最新国产精品久久精品| 欧美白人最猛性xxxxx69交| 91蜜桃在线观看| 国产成人精品午夜视频免费| 亚洲五月六月丁香激情| 国产精品久久久久久久久免费丝袜 | 日韩精品成人一区二区在线| 国产精品无码永久免费888| 7777精品伊人久久久大香线蕉经典版下载| 成人午夜大片免费观看| 青青草精品视频| 香蕉加勒比综合久久|