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

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

第三章-MFC運行機制

2019-11-11 04:00:17
字體:
來源:轉載
供稿:網友

在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   ?。?) 創建窗口    CMainFrame::PreCreateWindow()//反復調用一次是給我們修改窗口屬性的機會    CFrameWnd::Create()   ?。?) 消息循環    PumpMessage()    補充1:    在MFC中,由于涉及到(窗口)類定義,所以定義全局變量的時候,需要進行更多的步驟?!   ∪肿兞可婕暗筋惗x(類似于C中的類型定義)的話,那么需要遵循以下步驟(以MFC的窗口類為例)    1) 設計一個窗口類    2) 注冊窗口類    3) 創建窗口    4) 顯示及更新窗口    5) 消息循環         補充2:其他需要注意的幾點    1, 每一個MFC程序,有且只有一個從WinApp類派生的類(應用程序類),也只有一個從應用程序類所事例化的對象,表示應用程序本身。在WIN32程序當中,表示應用程序是通過WINMAIN入口函數來表示的(通過一個應用程序的一個事例號這一個標識來表示的)。在基于MFC應用程序中,是通過產生一個應用程序對象,用它來唯一的表示了應用程序?!   ?, _tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)?!   ?, 設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數注冊所選擇的窗口類?!   ?, PreCreateWindow()是個虛函數,如果子類有則調用子類的。    5, CreateWindowEx()函數參數與CREATESTRUCT結構體成員完全一致,CreateWindowEx()函數與CREATESTRUCT結構體參數的對應關系,使我們在創建窗口之前通過可PreCreateWindow(cs)修改cs結構體成員來修改所要的窗口外觀?!   ?,注意兩個函數?!   ?: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
亚洲人成电影网站色www| 久久亚洲春色中文字幕| 久久久久亚洲精品| 国产精品户外野外| 精品视频久久久久久| 久久综合免费视频影院| 国产一区二区三区网站| 亚洲日本欧美日韩高观看| 精品动漫一区二区三区| 美女国内精品自产拍在线播放| 欧美另类高清videos| 久久久久久久久网站| 成人免费视频a| 欧美成人一区在线| 丰满岳妇乱一区二区三区| 欧美一级黑人aaaaaaa做受| 国产精品丝袜久久久久久高清| 国产精品日韩专区| 一区二区三区www| 亚洲一区二区黄| 久久综合免费视频影院| 国产精品日韩欧美综合| 亚洲天天在线日亚洲洲精| 欧美视频13p| 91av在线免费观看视频| 久久影院免费观看| 91色p视频在线| 这里精品视频免费| 黄色成人av在线| 欧美激情视频播放| 亚洲欧美一区二区三区久久| 国产精品一区二区三区在线播放| 不卡在线观看电视剧完整版| 中文字幕日韩av电影| 日韩精品中文字幕有码专区| 亚洲欧美激情精品一区二区| 俺也去精品视频在线观看| 91精品免费视频| 亲子乱一区二区三区电影| 精品欧美国产一区二区三区| 51精品国产黑色丝袜高跟鞋| 亚洲图片在区色| 久久久精品亚洲| 成人国产精品免费视频| 亚洲成人xxx| 国产精品第一第二| 国产精品高精视频免费| 亚洲国产小视频在线观看| 亚洲成人aaa| 日韩电影中文字幕| 亚洲精品一区在线观看香蕉| 日韩人体视频一二区| 日韩在线观看免费全| 久久成人这里只有精品| 欧美国产在线视频| 亚洲日本aⅴ片在线观看香蕉| 上原亚衣av一区二区三区| 91沈先生在线观看| 日韩一区二区久久久| 国产91精品视频在线观看| 欧美午夜性色大片在线观看| 亚洲 日韩 国产第一| 欧美视频专区一二在线观看| 一区二区三区国产视频| 中文字幕日韩精品有码视频| 另类色图亚洲色图| 欧美一级黑人aaaaaaa做受| 亚洲第一福利视频| 久久精品国产精品亚洲| 欧美性xxxx极品高清hd直播| 国产精品永久免费| 精品欧美国产一区二区三区| 2023亚洲男人天堂| 久久久亚洲精选| 亚洲色图第三页| 国产精品高清在线| 国产欧美韩国高清| 中文字幕av一区二区三区谷原希美| 亚洲午夜久久久影院| 成人欧美一区二区三区黑人| 亚洲电影免费观看高清完整版在线| 欧美激情网站在线观看| 亚洲第一视频在线观看| 国产最新精品视频| 久久精品国产亚洲一区二区| 国产精品三级网站| 亚洲人成欧美中文字幕| 亚洲国产成人久久综合一区| 精品呦交小u女在线| 欧洲亚洲在线视频| 日本sm极度另类视频| 2019精品视频| 国产欧美婷婷中文| 精品视频一区在线视频| 亚洲国产97在线精品一区| 久久精品中文字幕| 在线精品高清中文字幕| 久久久999国产精品| 亚洲国产精品va在线看黑人| 国产欧美精品一区二区| 精品久久久久久久久国产字幕| 欧美亚洲国产日韩2020| 亚洲一区二区三区香蕉| 最新亚洲国产精品| 国产精国产精品| 亚洲精品免费网站| 亚洲图片在线综合| 精品国内自产拍在线观看| 欧美影院久久久| www.欧美免费| 另类少妇人与禽zozz0性伦| 久久人人看视频| 亚洲人成伊人成综合网久久久| 亚洲人成欧美中文字幕| 久久久久久久久久久人体| 97在线精品视频| 欧美做爰性生交视频| 日韩午夜在线视频| 在线观看精品自拍私拍| 欧美成人亚洲成人| 久久久91精品国产一区不卡| 欧美激情成人在线视频| 欧美在线一级va免费观看| 日韩美女写真福利在线观看| 日韩精品免费视频| 日韩美女免费观看| 国产精品欧美日韩久久| 国产午夜精品免费一区二区三区| 俺去亚洲欧洲欧美日韩| 国产精品av在线| 国产成人精品免费视频| 久久久在线视频| 97热精品视频官网| zzijzzij亚洲日本成熟少妇| 国产精品偷伦视频免费观看国产| 久热精品视频在线观看| 欧美最猛性xxxx| 欧美国产第一页| 97视频免费观看| 色狠狠av一区二区三区香蕉蜜桃| 欧美国产第二页| 98精品国产高清在线xxxx天堂| 欧美综合在线观看| 51精品在线观看| 亚洲va久久久噜噜噜| 国产精品18久久久久久麻辣| 欧美在线精品免播放器视频| 欧美性猛交xxxx黑人猛交| 欧美丰满少妇xxxx| 欧美在线视频一二三| 久久97精品久久久久久久不卡| 国产在线999| 亚洲国产成人精品久久久国产成人一区| 91社区国产高清| 国产精品一区二区久久国产| 超薄丝袜一区二区| 在线观看不卡av| 亚洲欧美第一页| 8x海外华人永久免费日韩内陆视频| 久久久之久亚州精品露出| 欧美精品videossex88| 日韩高清av在线| 国产丝袜高跟一区| 精品中文字幕久久久久久|