亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第三章-MFC運行機制

2019-11-11 04:38:52
字體:
來源:轉載
供稿:網友

在Windows程序設計編程中,創建一個窗口要經歷下面四個過程 (如有不懂,請看博客 win32初窺)

1設計一個窗口類;2注冊窗口類;3創建窗口;4顯示及更新窗口。 同樣的,WinMain也是入口函數,具體的過程,請看孫鑫視頻20講之第三講 其中,孫鑫老師開始提出的一個問題是:在全局變量中,定義一個子類對象。。。[html] view plain copy#include<iostream>  #include<string>  using namespace std;    class Person  {  public:      Person *p;      Person()      {          p=this;//保存this指針      }      virtual void say()      {          cout<<"Person's say()"<<endl;      }    };    class Student:public Person  {  public:            Student()      {        }      void say()      {          cout<<"Student's say()"<<endl;      }    };    Student s;    int main()  {            s.p->say();//這里將調用子類的方法      return 0;  }   什么都不用做,直接用向導生成一個MFC窗口。下面是結構圖,有五個類是這樣命名的,開頭的C表示Class ,C+工程名+(App,Doc,View...)

其中CMainFrame表示一個窗口(主窗體,包括標題欄,菜單...),XXApp表示運用程序,XXDOC表示文檔類(加載數據,實現數據的存儲與操作分離),XXView也表示一個窗口(相當于Windows的客戶區)

 

下面看看MFC中類的主要繼承關系:

由于繼承樹太大,這里只羅列了CWnd的繼承關系

 

 

API中CreateWindowEx和CreateWindow幾乎是一樣的,Ex表示擴展,多了一個參數

下面用API模擬CWnd

just模擬

[html] view plain copy//下面是模仿封裝API函數    class CWnd  {  public:      BOOL CreateEX(          DWord dwExStyle,      // extended window style          LPCTSTR lpClassName,  // registered class name          LPCTSTR lpWindowName, // window name          DWORD dwStyle,        // window style          int x,                // horizontal position of window          int y,                // vertical position of window          int nWidth,           // window width          int nHeight,          // window height          HWND hWndParent,      // handle to parent or owner window          HMENU hMenu,          // menu handle or child identifier          HINSTANCE hInstance,  // handle to application instance          LPVOID lpParam        // window-creation data          );        BOOL ShowWindow(int nCmdShow);        BOOL UpdateWindow();    public:      HWND m_hWnd;  };    BOOL CWnd::CreateEx(                 DWORD dwExStyle,      // extended window style                 LPCTSTR lpClassName,  // registered class name                 LPCTSTR lpWindowName, // window name                 DWORD dwStyle,        // window style                 int x,                // horizontal position of window                 int y,                // vertical position of window                 int nWidth,           // window width                 int nHeight,          // window height                 HWND hWndParent,      // handle to parent or owner window                 HMENU hMenu,          // menu handle or child identifier                 HINSTANCE hInstance,  // handle to application instance                 LPVOID lpParam        // window-creation data              );  {      m_hWnd=::CreateWindowEx(dwExstyle,lClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,                              hMenu,hInstance,lParam);        if(m_hWnd!=NULL)            return TRUE;      else          return FALSE;  }    BOOL CWnd::ShowWindow(int nCmdShow)  {      return ::ShowWindow(m_hWnd,nCmdShow);//調用的是SDK全局函數,加個::說明是全局的  }    BOOL CWnd::UpdateWindow()  {      return ::UpdateWindow(m_hWnd);  }    int WINAPI WinMain(                       HINSTANCE hInstance,      // handle to current instance                        HINSTANCE hPRevInstance,  // handle to previous instance                        LPSTR lpCmdLine,          // command line                        int nCmdShow              // show state                        )    {        WNDCLASS wndclass;              wndclass.cbClsExtra=0;        wndclass.cbWndExtra=0;        wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);        wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);        wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);        wndclass.hInstance=hInstance;       ...          CWnd cwnd;     cwnd.CreateEx(dwExstyle,...,...);        cwnd.ShowWindow(nCmdShow);        cwnd.UpdateWindow();              while(GetMessage(&msg,NULL,0,0))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }              ...  }    

 

下面是重頭戲(引用了某位仁兄的,太詳細了)

重點:MFC運行機制    提示:對于不想理解內部運行過程的,可以不看這一章,可以看了后面的界面設計再回頭來看這一章,可能感覺更深刻?! ∵@一次課和上一次的課的重點就是MFC的窗口類創建過程,而要反復說明的就是:MFC的程序和C語言的程序,從執行原理上說,是完全一致的?! ∽プ∵@一點,那么對于理解MFC程序的運行機制也就相對于簡單了?! 中的main函數就相當于MFC中的WinMain函數?! 「信d趣的可以利用VC的斷點設置自己跟蹤下面講述的各個函數,就明白它的執行順序了?!   ∫?、C語言程序執行步驟  在C語言中,大約的步驟如下:  1, 全局變量內存分配  2, 進入main函數    二、MFC程序的運行步驟(主要是初始化)    打開一個MFC APPWizard(exe)工程,跟蹤其執行步驟,可以發現,是以下順序:  1) CXXApp中的全局變量定義  CXXApp theApp;  2) 調用CXXApp構造函數  CXXApp ::CXXApp(){}  3) 進入Winmain函數(_tWinMain為宏,值為WinMain)  _tWinMain(){}    4) 完成初始化工作:包括窗口類注冊、窗口產生、顯示和更新  pThread->InitInstance()    對于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注冊與創建、顯示等要反復調用多次,一次對應一個窗口   ?。?) 注冊窗口類    AfxEndDeferRegisterClass    (2) 創建窗口    CMainFrame::PreCreateWindow()//反復調用一次是給我們修改窗口屬性的機會    CFrameWnd::Create()   ?。?) 消息循環    PumpMessage()    補充1:    在MFC中,由于涉及到(窗口)類定義,所以定義全局變量的時候,需要進行更多的步驟?!   ∪肿兞可婕暗筋惗x(類似于C中的類型定義)的話,那么需要遵循以下步驟(以MFC的窗口類為例)    1) 設計一個窗口類    2) 注冊窗口類    3) 創建窗口    4) 顯示及更新窗口    5) 消息循環         補充2:其他需要注意的幾點    1, 每一個MFC程序,有且只有一個從WinApp類派生的類(應用程序類),也只有一個從應用程序類所事例化的對象,表示應用程序本身。在WIN32程序當中,表示應用程序是通過WINMAIN入口函數來表示的(通過一個應用程序的一個事例號這一個標識來表示的)。在基于MFC應用程序中,是通過產生一個應用程序對象,用它來唯一的表示了應用程序。    2, _tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)?!   ?, 設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數注冊所選擇的窗口類?!   ?, PreCreateWindow()是個虛函數,如果子類有則調用子類的?!   ?, CreateWindowEx()函數參數與CREATESTRUCT結構體成員完全一致,CreateWindowEx()函數與CREATESTRUCT結構體參數的對應關系,使我們在創建窗口之前通過可PreCreateWindow(cs)修改cs結構體成員來修改所要的窗口外觀。    6,注意兩個函數?!   ?:TranslateMessage(&m_msgCur)函數進行消息(如鍵盤消息)轉換    ::DispatchMessage(&m_msgCur)函數分派消息到窗口的回調函數處理(實際上分派的消息經過消息映射,交由消息響應函數進行處理。)    7,可以認為View類窗口是CMainFram類窗口的子窗口。DOCument類是文檔類。DOC-VIEW結構將數據本身與它的顯示分離開?!   ∥臋n類用于數據的存儲,加載;視類用于數據的顯示,修改    8,CTEApp::InitInstance()函數中通過文檔模板將文檔類,視類,框架類的有機組織一起。語句如下:    CSingleDocTemplate* pDocTemplate;  pDocTemplate = new CSingleDocTemplate(   IDR_MAINFRAME,   RUNTIME_CLASS(CTEDoc),   RUNTIME_CLASS(CMainFrame), // main SDI frame window   RUNTIME_CLASS(CTEView));  AddDocTemplate(pDocTemplate);//增加到模板    補充3:本課涉及到MFC函數的源文件位置    根目錄    找到您安裝VC98下MFC的位置,比如我的機子上為:D:/Program Files/Microsoft Visual Studio/VC98/MFC。下面提供的就是相對路徑了?!   ?nbsp;    CWinApp構造函數: MFC=>SRC=>APPCORE.CPP  AfxWinMain:MFC=>SRC=>WINMAIN.CPP  AfxEndDeferRegisterClass: MFC=>SRC=>APPCORE.CPP  CFrameWnd::PreCreateWindow()函數所在文件:MFC=>SRC=>WINFRM.CPP  CFrameWnd::Create()函數路徑:MFC=>SRC=>WINFRM.CPP  CWnd::CreateEx()函數路徑:MFC=>SRC=>WINCORE.CPP  CWinThread::Run()方法路徑:MFC=>SRC=>THRDCORE.CPP 創建按鈕

1在CMainFrame創建

雙擊CMainFrame,添加數據成員,CButton m_btn

在OnCreate方法添加如下代碼:

[html] view plain copym_btn.Create(TEXT("first Button"),BS_PUSHBUTTON|WS_CHILD,CRect(0,0,100,100),this,123);  m_btn.ShowWindow(SW_NORMAL);  

 

2在CXXView創建

雙擊CXXView,添加數據成員,CButton m_btn

在CXXView右鍵Add windows Message Handler 添加WM_CREATE消息處理,然后生成OnCreate函數

在OnCreate函數添加如下代碼

[html] view plain copym_btn.Create(TEXT("Button2"),BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),this,123);  

兩個代碼效果是等價的:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看视频99| 成人黄色av播放免费| 97精品久久久中文字幕免费| 国产精品美女午夜av| 精品国产一区二区三区久久久狼| 久久91精品国产91久久久| 色偷偷亚洲男人天堂| 尤物tv国产一区| 福利精品视频在线| 欧美一区二区三区四区在线| 成人免费在线网址| 亚洲aⅴ男人的天堂在线观看| 国产亚洲欧洲黄色| 黄色成人在线播放| 国产亚洲一级高清| 国产亚洲精品久久| 日本伊人精品一区二区三区介绍| 91在线免费网站| 欧美高清性猛交| 久久久中精品2020中文| 欧美激情xxxxx| 欧美激情精品久久久久久变态| 久久成人国产精品| 九九热这里只有在线精品视| 国产欧美日韩精品在线观看| 91免费观看网站| 综合136福利视频在线| 午夜精品一区二区三区在线| 亚洲乱码av中文一区二区| 国产精品久久久久久久久久东京| 成人午夜在线影院| 中文字幕日韩免费视频| 国产成人一区二区三区小说| 国精产品一区一区三区有限在线| 日韩av在线免费播放| 国产精品欧美日韩一区二区| 成人信息集中地欧美| 国产一区二区视频在线观看| 欧美富婆性猛交| 欧美视频中文字幕在线| 在线亚洲午夜片av大片| 亚洲电影在线观看| 欧美自拍大量在线观看| 日韩av在线看| 日韩视频在线观看免费| 4k岛国日韩精品**专区| 国产精品444| 97精品视频在线播放| 亚洲色图欧美制服丝袜另类第一页| 九九九热精品免费视频观看网站| 日韩精品欧美激情| 亚洲免费视频观看| 欧美激情精品久久久久| 97福利一区二区| 国产精品久久久精品| 免费91麻豆精品国产自产在线观看| 欧美视频免费在线| 萌白酱国产一区二区| 亚洲男女性事视频| 综合网日日天干夜夜久久| 亚洲国产精品久久91精品| 亚洲人成在线免费观看| 国产精品黄色影片导航在线观看| 国产精品男人的天堂| 国产亚洲一区精品| 亚洲性69xxxbbb| 欧美激情影音先锋| 亚洲美女在线看| 色婷婷av一区二区三区在线观看| 亚洲精品综合久久中文字幕| 一本色道久久88综合日韩精品| 欧美成人午夜激情| 久久97精品久久久久久久不卡| 最近中文字幕日韩精品| 精品日韩美女的视频高清| 亚洲丁香婷深爱综合| 欧美wwwwww| 色综合天天综合网国产成人网| 91精品国产色综合久久不卡98| 日韩二区三区在线| 在线看日韩av| 精品久久香蕉国产线看观看亚洲| 欧美日韩亚洲一区二区| 国产高清视频一区三区| 精品国产老师黑色丝袜高跟鞋| 国产欧美中文字幕| 日韩精品视频三区| 久久免费视频在线| 亚洲国产精品国自产拍av秋霞| 久久久精品2019中文字幕神马| 欧美激情女人20p| 久久夜色精品国产亚洲aⅴ| 国产丝袜精品第一页| 国产精品www色诱视频| 中文字幕精品在线视频| 亚洲a成v人在线观看| 黑人巨大精品欧美一区免费视频| 国产色婷婷国产综合在线理论片a| 中文字幕日韩av综合精品| www.久久久久久.com| 欧美成人中文字幕在线| 亚洲精品视频二区| 国产精品美乳在线观看| 亚洲japanese制服美女| 九九久久国产精品| 亚洲а∨天堂久久精品喷水| 91久久久国产精品| 欧美最顶级的aⅴ艳星| 国产成人亚洲综合| 国产精品入口免费视| 日韩二区三区在线| 在线播放日韩精品| 精品伊人久久97| 国产成人aa精品一区在线播放| 欧美国产中文字幕| 久久九九国产精品怡红院| 欧美成人一区在线| 揄拍成人国产精品视频| 亚洲人成网站在线播| 亚洲无亚洲人成网站77777| 九九久久久久久久久激情| 欧美成人精品在线视频| 国产98色在线| 九九久久久久久久久激情| 川上优av一区二区线观看| 91精品视频在线播放| 欧美激情aaaa| 91九色精品视频| 夜夜狂射影院欧美极品| 欧美黑人性视频| 国产精品白嫩初高中害羞小美女| 国产精品一区二区久久| 亚洲精品国产精品国产自| 91人成网站www| 91亚洲精品视频| 国产福利精品av综合导导航| 国产狼人综合免费视频| 亚洲香蕉成视频在线观看| 国内精品免费午夜毛片| 亚洲国产成人在线视频| 久久久久999| 欧美成人激情视频免费观看| 亚洲精品xxx| 51ⅴ精品国产91久久久久久| 91福利视频在线观看| 91精品视频在线免费观看| 国产精品普通话| www.欧美精品| 日韩在线视频中文字幕| 午夜精品久久久久久99热软件| 成人黄色大片在线免费观看| 久久国产精品影片| 亚洲91精品在线观看| 精品中文字幕在线2019| 欧美性猛交xxxx| 性欧美暴力猛交69hd| 久久久久久久久国产| 久久99久久久久久久噜噜| 国产成人精品久久二区二区91| 一个色综合导航| 日韩天堂在线视频| 亚洲乱码一区av黑人高潮| 91精品美女在线| 大胆人体色综合|