<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    superwei

    導(dǎo)航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    《深入淺出MFC》學(xué)習(xí)筆記之二

    《深入淺出MFC》學(xué)習(xí)筆記之二 - -

    Tag-《深入淺出MFC》學(xué)習(xí)筆記之                                          

                                        -《深入淺出MFC》學(xué)習(xí)筆記之二 
                                        作者:XGM 2001-8-14

                 
                 
                    
                MFC程序也是Windows程序,所以它也有一個(gè)WinMain,但是我們?cè)诔绦蛑锌床坏剿嫩櫽?。?shí)際上,在程序進(jìn)入點(diǎn)之前,有一個(gè)(而且只有一個(gè))全局對(duì)象(在Hello程序中名為theApp),這是所謂的application
                object,當(dāng)操作系統(tǒng)將程序加載并激活時(shí),這個(gè)全局對(duì)象獲得配置,其構(gòu)造函數(shù)會(huì)先執(zhí)行,比WinMain更早。
                書(shū)中所舉Hello程序,是一個(gè)簡(jiǎn)單的MFC程序,其主體在于WinMain和WndProc,而這兩個(gè)部分其實(shí)都有相當(dāng)程度的不變性。MFC就是把有著相當(dāng)固定行為的WinMain內(nèi)部操作封裝在CWinApp中;把有著相當(dāng)固定行為的WndProc內(nèi)部操作封裝在CFrameWnd中。也就是說(shuō),CWinApp代表程序本體,CFrameWnd代表一個(gè)主框窗口

                雖然WinMain和WndProc內(nèi)部操作有相當(dāng)程度的不變性,但面對(duì)不同應(yīng)用程序也需有變化,所以必須以這兩個(gè)類(lèi)為基礎(chǔ),派生自己的類(lèi),并改寫(xiě)其中一部分成員函數(shù)。

                 
                CWinApp----取代WinMain的地位
                傳統(tǒng)上SDK程序的WinMain所完成的工作現(xiàn)由CWinApp的三個(gè)函數(shù)完成:
                virtual BOOL InitApplication( );
                virtual BOOL InitInstance( );
                virtual BOOL Run( );
                CFrameWnd-----取代WndProc的地位
                CFrameWnd主要用來(lái)掌握一個(gè)窗口
                引爆器------Application object
                當(dāng)執(zhí)行Hello程序時(shí),這個(gè)全局對(duì)象產(chǎn)生,于是構(gòu)造函數(shù)(見(jiàn)APPCORE.CPP)執(zhí)行起來(lái),CWinApp之中的成員變量將因?yàn)檫@個(gè)全局對(duì)象的誕生而獲得配置與初值,配置完成后,WinMain(MFC早已準(zhǔn)備好,并由鏈接器直接加到應(yīng)用程序中去的)登場(chǎng)。

                AfxWinInit:是繼CWinApp構(gòu)造函數(shù)之后的第一個(gè)操作;
                此后的操作是pApp->InitApplication(其中的pApp指向CMyWinApp對(duì)象,即本例中的theApp),因?yàn)镃MyWinApp繼承自CWinApp,而InitApplication又是CWinApp的一個(gè)虛擬函數(shù),我們沒(méi)有改寫(xiě)它(大部分情況下也不需要改它),所以上述操作相當(dāng)于調(diào)用CWinApp::InitApplication。此程序的代碼出現(xiàn)在APPCORE.CPP中;

                繼InitApplication之后,AfxWinMain調(diào)用pApp->InitInstance,InitInstance是CWinApp的一個(gè)虛擬函數(shù)(應(yīng)用程序一定要改寫(xiě)這個(gè)函數(shù),因?yàn)樗贑WinApp中是個(gè)空函數(shù),沒(méi)有任何默任操作),我們改寫(xiě)了它,所以上述操作就是調(diào)有我們自己的這個(gè)InitInstance函數(shù),我們將在該處展開(kāi)我們的主窗口生命。

                CMyWinApp::InitInstance一開(kāi)始new了一個(gè)CMyFrameWnd對(duì)象,new會(huì)引發(fā)構(gòu)造函數(shù)CmyFrameWnd::CMyFrameWnd,其中調(diào)用了CFrameWnd的成員函數(shù)Create,它將產(chǎn)生一個(gè)窗口。

                  
                Create函數(shù)共八個(gè)參數(shù),第一個(gè),指定WNDCLASS窗口類(lèi),如果放置NULL,表示要以MFC內(nèi)建的窗口類(lèi)產(chǎn)生一個(gè)標(biāo)準(zhǔn)的外框窗口(Create函數(shù)在產(chǎn)生窗口之前會(huì)引發(fā)窗口類(lèi)的注冊(cè)操作,下一段講述這一內(nèi)容);第二個(gè),指定窗口標(biāo)題;第三個(gè),指定窗口風(fēng)格,默認(rèn)是WS-OVERLAPPEDWINDOW,如果你不想要窗口右上角的極大極小鈕,可以改成WS-OVERLAPPED|WS-CAPTION|WS-SYSMENU|WS-THICKFRAME|WS-MINIMIZEBOX|WS-MAXIMIZEBOX,如果希望有垂直滾動(dòng)條,再加上WS-VSCROLL;第四個(gè)參數(shù),指定窗口的位置與大小,默認(rèn)值rectDefault
                ;第五個(gè),指定父窗口,第六個(gè)指定菜單;第七個(gè),為擴(kuò)充風(fēng)格,唯有以:CreateWindowEx(而非:CreateWindow)函數(shù)才能完成,事實(shí)上,CFrameWnd:Create最終調(diào)用的正是:CreateWindowEx;第八個(gè),是一個(gè)指向CCreateContext結(jié)構(gòu)的指針,framework利用它,在具備Document/View結(jié)構(gòu)的程序中初始化外框窗口,默認(rèn)值NULL

                CFrameWnd:Create在函數(shù)中調(diào)用CreateEx(CWnd有這個(gè)成員函數(shù),但其派生類(lèi)CFrameWnd并沒(méi)有,所以這里調(diào)用的實(shí)際上是CWnd:CreateEx);后者又調(diào)用PreCreateWindow虛擬函數(shù)(它在CWnd及其派生類(lèi)CFrameWnd都有定義,所以實(shí)際上調(diào)用的是CFrameWnd::PreCreateWindow),這個(gè)函數(shù)調(diào)用了AfxDeferRegisterClass宏,它表示如果變量afxRegisteredClass的值顯示系統(tǒng)已經(jīng)注冊(cè)了fClass
                這種窗口類(lèi),MFC啥也不做,否則就調(diào)用AfxEndDeferRegisterClass(fClass){它調(diào)用兩個(gè)函數(shù)完成實(shí)際的窗口類(lèi)注冊(cè)操作,一個(gè)是RegisterWithIcon,一個(gè)是AfxRegisterClass},準(zhǔn)備注冊(cè)之。

                窗口顯示與更新
                CMyFrameWnd::CMyFrameWnd結(jié)束后,窗口已經(jīng)誕生出來(lái);程序又回到CMyWinApp::InitInstance,于是調(diào)用ShowWindow函數(shù)令窗口顯示出來(lái),并調(diào)用UpdateWindow函數(shù)令Hello程序送出WM-PAINT

                CWinApp::Run----程序生命的活水源頭
                Run又是CWinApp的一個(gè)虛擬函數(shù),我們沒(méi)有改寫(xiě)它(大部分情況下也不需要改它),所以上述操作相當(dāng)于調(diào)用CWinApp::Run
                WinMain已由MFC提供,窗口類(lèi)已由MFC注冊(cè)完成,連窗口函數(shù)也都由MFC提供
                把消息與處理函數(shù)連接在一起:Message Map機(jī)制
                MFC提供給應(yīng)用程序使用的“很方便的接口”是兩組宏,以Hello為例,第一個(gè)操作是在Hello.h的CMyFrameWnd加上DECLARE-MESSAGE-MAP;第二個(gè)操作是在Hello.cpp的任何位置(當(dāng)然不能在函數(shù)內(nèi))使用宏

                BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
                   ON_COMMAND(IDM_ABOUT, OnAbout)
                   ON_WM_PAINT()
                END_MESSAGE_MAP()
                 
                來(lái)龍去脈總整理
                程序的誕生
                Application object 產(chǎn)生, 內(nèi)存于是獲得配置,初值亦設(shè)立了。
                  AfxWinMain執(zhí)行AfxWinInit,后者又調(diào)有AfxInitThread,把消息隊(duì)列盡量加
                大到96
                  AfxWinMain執(zhí)行InitApplication。這是CWinApp的虛擬函數(shù),我們通常不改寫(xiě)它
                  AfxWinMain執(zhí)行InitInstance。這是CWinApp的虛擬函數(shù),我們必須改寫(xiě)它
                  CMyWinApp::InitInstance “new”了一個(gè)CMyFrameWnd對(duì)象
                 
                CmyFrameWnd構(gòu)造函數(shù)調(diào)用Create,產(chǎn)生主窗口。我們?cè)贑reate參數(shù)中指定的窗口類(lèi)是NULL,于是MFC根據(jù)窗口種類(lèi),自行為我們注冊(cè)一個(gè)名為“AfxFrameOrView42d”的窗口類(lèi)。

                  回到InitInstance中繼續(xù)執(zhí)行ShowWindow,顯示窗口
                執(zhí)行UpdateWindow,于是發(fā)出WM-PAINT
                回到AfxWinMain,執(zhí)行Run,進(jìn)入消息循環(huán)。
                 
                程序開(kāi)始運(yùn)行:
                  程序獲得WM-PAINT消息(由CWinApp::Run中的::GetMessage循環(huán))
                  WM-PAINT經(jīng)由::DispatchMessage送到窗口函數(shù)CWnd::DefWindowProc中。
                  CWnd::DefWindowProc將消息傳遞到消息映射表格
                 
                傳遞過(guò)程中發(fā)現(xiàn)有相符項(xiàng)目,于是調(diào)用項(xiàng)目中對(duì)應(yīng)的函數(shù)。此函數(shù)是利用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間的宏設(shè)立起來(lái)的。

                  標(biāo)準(zhǔn)消息的處理程序亦有標(biāo)準(zhǔn)命名,例如WM-PAINT必由OnPaint處理
                 
                程序的死亡:
                    使用者單擊File/Close,于是發(fā)出WM-CLOSE
                    CMyFrameWnd并沒(méi)有設(shè)置WM-CLOSE處理程序,于是交給默認(rèn)的處理程序
                    默認(rèn)函數(shù)對(duì)于WM-CLOSE的處理方式是調(diào)用::DestroyWindow,并因而發(fā)出WM-DESTROY
                    默認(rèn)的WM-DESTROY處理方式是調(diào)用::PostQuitMessage,因此發(fā)出WM-QUIT
                   
                CWinApp::Run收到WM-QUIT后會(huì)結(jié)束內(nèi)部之消息循環(huán),然后調(diào)用ExitInstance,這是CWinApp的一個(gè)虛擬函數(shù);如果CMyWinApp改寫(xiě)了ExitInstance,那么CWinApp::Run所調(diào)用的就是CMyWinApp::ExitInstance,否則就是CWinApp::ExitInstance

                    最后回到AfxWinMain,執(zhí)行AfxWinTerm,結(jié)束程序
                 
                附Hello程序部分代碼:
                Hello.cpp
                 
                #include "Stdafx.h"
                #include "Hello.h"
                #include "Resource.h"
                 
                CMyWinApp theApp;   // application object
                 
                //--------------------------------------------------------------------

                // CMyWinApp's member
                //--------------------------------------------------------------------

                BOOL CMyWinApp::InitInstance()
                {
                   m_pMainWnd = new CMyFrameWnd();
                   m_pMainWnd->ShowWindow(m_nCmdShow);
                   m_pMainWnd->UpdateWindow();
                   return TRUE;
                }
                //--------------------------------------------------------------------

                // CMyWinApp's member
                //--------------------------------------------------------------------

                BOOL CMyWinApp::OnIdle(LONG lCount)
                {
                   CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;
                   pWnd->IdleTimeHandler(lCount);
                 
                   return TRUE;
                }
                //--------------------------------------------------------------------

                // CMyFrameWnd's member
                //--------------------------------------------------------------------

                CMyFrameWnd::CMyFrameWnd()
                {
                   Create(NULL, "Hello MFC", WS_OVERLAPPEDWINDOW, rectDefault,
                          NULL, "MainMenu");     }
                //--------------------------------------------------------------------

                BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
                   ON_COMMAND(IDM_ABOUT, OnAbout)
                   ON_WM_PAINT()
                END_MESSAGE_MAP()
                //--------------------------------------------------------------------

                void CMyFrameWnd::OnPaint()
                {
                CPaintDC dc(this);
                CRect rect;
                 
                   GetClientRect(rect);
                 
                   dc.SetTextAlign(TA_BOTTOM | TA_CENTER);
                 
                   ::LineDDA(rect.right/2, 0, rect.right/2, rect.bottom/2,
                       (LINEDDAPROC) LineDDACallback, (LPARAM) (LPVOID) &dc);
                }
                //--------------------------------------------------------------------

                VOID CALLBACK CMyFrameWnd::LineDDACallback(int x, int y, LPARAM
                lpdc)
                {
                static char szText[] = "Hello, MFC";
                 
                   ((CDC*)lpdc)->TextOut(x, y, szText, sizeof(szText)-1);
                   for(int i=1; i<50000; i++); 
                }
                //--------------------------------------------------------------------

                void CMyFrameWnd::OnAbout()
                {
                   CDialog about("AboutBox", this);  // "AboutBox"
                   about.DoModal();
                }
                //--------------------------------------------------------------------

                void CMyFrameWnd::IdleTimeHandler(LONG lCount)
                {
                  CString str;
                  CRect rect(10,10,200,30);
                  CDC* pDC = new CClientDC(this);
                 
                  str.Format("%010d", lCount);
                  pDC->DrawText(str, &rect, DT_LEFT | DT_TOP);
                }
                 
                Hello.h
                 
                class CMyWinApp : public CWinApp
                {
                public:
                   virtual BOOL InitInstance();       //
                   virtual BOOL OnIdle(LONG lCount);  // OnIdle e?^
                };
                 
                //--------------------------------------------------------------------

                class CMyFrameWnd : public CFrameWnd
                {
                public:
                   CMyFrameWnd();            // constructor
                   afx_msg void OnPaint();   // for WM_PAINT
                   afx_msg void OnAbout();   // for WM_COMMAND (IDM_ABOUT)
                   void IdleTimeHandler(LONG lCount);  // we want it call by
                CMyWinApp::OnIdle
                 
                private:
                   DECLARE_MESSAGE_MAP()     // Declare Message Map
                   static VOID CALLBACK LineDDACallback(int,int,LPARAM);
                   //?C
                };

    posted on 2005-11-01 14:39 小辭猬 閱讀(226) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): C++


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99re这里有免费视频精品| 亚洲欧美成人av在线观看| 久久国产亚洲精品麻豆| 亚洲一区无码精品色| 亚洲精品动漫人成3d在线 | 国产伦精品一区二区免费| 四虎一区二区成人免费影院网址| 成年网在线观看免费观看网址| 免费国产高清毛不卡片基地| 一级毛片免费在线观看网站| 两个人的视频www免费| 手机看片国产免费永久| 在线观看肉片AV网站免费| 外国成人网在线观看免费视频| 日本高清在线免费| 人禽杂交18禁网站免费| 99视频在线精品免费观看6| 黄a大片av永久免费| 亚洲Av无码乱码在线znlu| 浮力影院亚洲国产第一页| 亚洲熟女一区二区三区| 亚洲av无码国产精品夜色午夜 | 免费网站看v片在线香蕉| 国产女高清在线看免费观看 | 女人18毛片特级一级免费视频| 美女被免费视频网站a国产| 亚洲成a人无码av波多野按摩| 精品国产亚洲一区二区在线观看| 亚洲av永久无码制服河南实里| 亚洲欧洲日产韩国在线| 亚洲av无码日韩av无码网站冲| 产传媒61国产免费| 无码国产精品一区二区免费vr | 91国内免费在线视频| 18级成人毛片免费观看| 好先生在线观看免费播放| 免费国产小视频在线观看| 亚洲日产无码中文字幕| 亚洲小视频在线播放| 国产亚洲一卡2卡3卡4卡新区 | 亚洲精品国产高清在线观看|