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

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

第三章-MFC運行機制

2019-11-11 03:58:35
字體:
來源:轉載
供稿:網友

在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中,由于涉及到(窗口)類定義,所以定義全局變量的時候,需要進行更多的步驟。    全局變量涉及到類定義(類似于C中的類型定義)的話,那么需要遵循以下步驟(以MFC的窗口類為例)    1) 設計一個窗口類    2) 注冊窗口類    3) 創建窗口    4) 顯示及更新窗口    5) 消息循環         補充2:其他需要注意的幾點    1, 每一個MFC程序,有且只有一個從WinApp類派生的類(應用程序類),也只有一個從應用程序類所事例化的對象,表示應用程序本身。在WIN32程序當中,表示應用程序是通過WINMAIN入口函數來表示的(通過一個應用程序的一個事例號這一個標識來表示的)。在基于MFC應用程序中,是通過產生一個應用程序對象,用它來唯一的表示了應用程序。    2, _tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)。    3, 設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數注冊所選擇的窗口類?!   ?, PreCreateWindow()是個虛函數,如果子類有則調用子類的。    5, CreateWindowEx()函數參數與CREATESTRUCT結構體成員完全一致,CreateWindowEx()函數與CREATESTRUCT結構體參數的對應關系,使我們在創建窗口之前通過可PreCreateWindow(cs)修改cs結構體成員來修改所要的窗口外觀。    6,注意兩個函數?!   ?:TranslateMessage(&m_msgCur)函數進行消息(如鍵盤消息)轉換    ::DispatchMessage(&m_msgCur)函數分派消息到窗口的回調函數處理(實際上分派的消息經過消息映射,交由消息響應函數進行處理。)    7,可以認為View類窗口是CMainFram類窗口的子窗口。DOCument類是文檔類。DOC-VIEW結構將數據本身與它的顯示分離開。    文檔類用于數據的存儲,加載;視類用于數據的顯示,修改    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
少妇高潮久久77777| 国产网站欧美日韩免费精品在线观看| 91国自产精品中文字幕亚洲| 久久国产精品网站| 国产精品黄页免费高清在线观看| 91精品久久久久久久久久久久久久| 成人激情在线观看| 欧美激情一级精品国产| 成人精品久久一区二区三区| 91久久综合亚洲鲁鲁五月天| 欧美激情一区二区三级高清视频| 国产精品久久久久高潮| 欧美视频免费在线观看| 日韩欧亚中文在线| 精品国产一区二区三区在线观看| 日韩精品亚洲精品| 久久精品99久久久久久久久| 国产精品三级美女白浆呻吟| 亚洲天堂男人天堂| 国产99久久精品一区二区 夜夜躁日日躁| 日韩综合视频在线观看| 国产精品电影久久久久电影网| 日本亚洲欧美三级| 疯狂欧美牲乱大交777| 精品中文字幕在线2019| 国产精品精品久久久久久| 久久久久久久久久久免费| 欧美另类交人妖| 色偷偷91综合久久噜噜| 国产日韩综合一区二区性色av| 久久久国产精品视频| 欧美日韩国产成人在线观看| 亚洲第一区第二区| 日本免费久久高清视频| 91精品久久久久久久久久久| 亚洲美女av电影| 亚洲欧美综合v| 日本中文字幕久久看| 国产主播欧美精品| 欧美夫妻性生活视频| 成人免费直播live| 日韩综合中文字幕| 国产91精品在线播放| 精品调教chinesegay| 国产精品com| 国产精品香蕉国产| 欧美猛少妇色xxxxx| 亚洲精品自拍视频| 国产偷亚洲偷欧美偷精品| 欧美xxxx综合视频| 69精品小视频| 国产精品99久久久久久人| 在线中文字幕日韩| 亚洲精品久久久久久久久久久久久| 中文字幕亚洲二区| 欧美理论电影在线观看| 韩国欧美亚洲国产| 欧美性猛交xxxx乱大交3| 在线亚洲男人天堂| 国产丝袜精品第一页| 亚洲色图综合久久| 欧美区在线播放| 国产日韩欧美黄色| 97精品国产97久久久久久免费| 国产欧美久久一区二区| 精品久久久久久久久久久久久久| 亚洲人成网站免费播放| 亚洲综合在线小说| 精品久久久久久久大神国产| 不卡在线观看电视剧完整版| 亚洲无线码在线一区观看| 国产日韩欧美中文在线播放| 欧美午夜视频在线观看| 国产在线高清精品| 欧美多人爱爱视频网站| 中文字幕日韩av电影| 黑人巨大精品欧美一区二区三区| 日韩电影免费观看在线| 国产午夜精品全部视频在线播放| 亚洲精选中文字幕| 国语自产精品视频在线看抢先版图片| 国内伊人久久久久久网站视频| 亚洲а∨天堂久久精品9966| www.日韩系列| 国产精品69av| 亚洲欧洲高清在线| 91在线免费观看网站| 欧美精品情趣视频| 81精品国产乱码久久久久久| 91美女片黄在线观| 91在线网站视频| 欧美色欧美亚洲高清在线视频| 亚洲精品天天看| 国产精品十八以下禁看| 国产精品国产三级国产aⅴ9色| 欧美成人午夜免费视在线看片| 久热精品视频在线免费观看| 国产精品揄拍500视频| 亚洲国产精品久久91精品| 日韩精品免费在线视频| 国产精品成人观看视频国产奇米| 中文字幕亚洲欧美日韩高清| 成人激情电影一区二区| 欧美三级欧美成人高清www| 日韩欧美有码在线| 亚洲成人性视频| 国产高清视频一区三区| 亚洲成av人片在线观看香蕉| 久久午夜a级毛片| 久久久爽爽爽美女图片| 成人午夜两性视频| 日韩精品中文字幕在线观看| 久99久在线视频| 成人免费网站在线看| 国产婷婷色综合av蜜臀av| 一区二区欧美亚洲| 亚洲性猛交xxxxwww| 欧美一级在线播放| 欧美一级在线播放| 亚洲娇小xxxx欧美娇小| 日本欧美在线视频| 亚洲综合精品伊人久久| 国产91精品青草社区| 午夜精品久久久久久99热| 亚洲国产成人精品久久久国产成人一区| 91av在线看| 日本精品中文字幕| 日本久久亚洲电影| 日韩精品免费观看| 97久久国产精品| 久久网福利资源网站| 亚洲国产一区二区三区四区| 国产日韩在线观看av| 亚洲欧洲激情在线| 亚洲成人久久电影| 亚洲免费高清视频| 夜夜嗨av色综合久久久综合网| 亚洲欧美日韩天堂一区二区| 国产精品嫩草视频| 亚洲天堂网站在线观看视频| 91性高湖久久久久久久久_久久99| 久久久精品欧美| 日韩欧美极品在线观看| 欧美人交a欧美精品| 91久久精品视频| 亚洲国产成人精品电影| 亚洲网在线观看| 日韩成人在线观看| 久久视频精品在线| 国产精品黄色影片导航在线观看| 日韩极品精品视频免费观看| 国产一区二区精品丝袜| 国产成人综合精品| 中文字幕欧美日韩精品| 欧美午夜影院在线视频| 中文字幕自拍vr一区二区三区| 久久精品国产亚洲| 久久久久久久久久久av| 在线日韩中文字幕| 欧美韩国理论所午夜片917电影| 欧美日韩国产限制| 91中文精品字幕在线视频| 亚洲专区在线视频| 久久91亚洲精品中文字幕|