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

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

第三章-MFC運行機制

2019-11-11 03:26:16
字體:
來源:轉載
供稿:網友

在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程序的運行機制也就相對于簡單了。  C中的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應用程序中,是通過產生一個應用程序對象,用它來唯一的表示了應用程序?!   ?, _tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)。    3, 設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數注冊所選擇的窗口類?!   ?, PreCreateWindow()是個虛函數,如果子類有則調用子類的?!   ?, 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
久久久伊人日本| 国产欧美日韩精品丝袜高跟鞋| 成人性生交大片免费看小说| 91久久精品一区| 一区二区成人av| 亚洲在线观看视频网站| 欧美插天视频在线播放| 欧美在线影院在线视频| 欧美中文在线字幕| 亚洲精品国产精品乱码不99按摩| 中文字幕日韩精品在线观看| 91精品国产91久久久久福利| 97超级碰在线看视频免费在线看| 欧美午夜激情视频| 国产在线精品一区免费香蕉| 麻豆国产精品va在线观看不卡| 亚洲精品福利在线观看| 国产国语videosex另类| 97在线视频免费播放| 久久亚洲精品中文字幕冲田杏梨| 欧美精品生活片| 亚洲一区二区精品| 国产精品白嫩初高中害羞小美女| 国产精品女主播视频| 国产精品免费网站| 国产精品一区二区三区在线播放| 欧美一级bbbbb性bbbb喷潮片| 亚洲国产精品yw在线观看| 亚洲午夜久久久久久久| 国产一区二区香蕉| 欧美日韩人人澡狠狠躁视频| 亚洲女人天堂视频| 亚洲精品久久久久久久久久久| 欧美日本亚洲视频| 国产亚洲精品久久久| 欧美成人精品在线播放| 欧日韩不卡在线视频| 91精品国产99| 国产一区二区三区在线| 国产精品一区二区久久久| 国产日韩精品在线播放| 一本一本久久a久久精品综合小说| 青青在线视频一区二区三区| 日本精品视频在线观看| 欧美精品一区二区免费| 日本欧美国产在线| 理论片在线不卡免费观看| 永久555www成人免费| 欧美激情乱人伦一区| 久久久久久久久久久久久久久久久久av| 亚洲免费人成在线视频观看| 欧美日韩国产中文精品字幕自在自线| 亚洲黄色免费三级| 日本欧美爱爱爱| 热99久久精品| 浅井舞香一区二区| 欧美成人手机在线| 精品国产一区二区在线| 久久综合久久美利坚合众国| 久久久精品在线| 久久久亚洲国产天美传媒修理工| 成人福利免费观看| 日本精品va在线观看| 亚洲国产古装精品网站| 久久综合电影一区| 在线视频欧美日韩| 久久综合伊人77777| 91香蕉嫩草影院入口| 欧美又大粗又爽又黄大片视频| 亚洲丝袜av一区| 久久这里只有精品99| 欧美一区二区三区……| 欧美成人免费在线观看| 欧美激情一区二区三区在线视频观看| 亚洲最大激情中文字幕| 清纯唯美日韩制服另类| 在线国产精品视频| 国产va免费精品高清在线| 亚洲男女性事视频| 久久成人综合视频| 国产91色在线|免| 亚洲欧美中文日韩在线| 日韩电影中文字幕在线| 菠萝蜜影院一区二区免费| 中文字幕日韩欧美| 亚洲图片欧美日产| 国产999视频| 日韩精品视频中文在线观看| 2020国产精品视频| 超在线视频97| 日韩av在线不卡| 久久最新资源网| 亚洲国产精彩中文乱码av在线播放| 亚洲专区国产精品| 青青青国产精品一区二区| 91黄色8090| 97视频在线观看视频免费视频| 久久国产精品久久久久久久久久| 国产免费久久av| 成人情趣片在线观看免费| 4k岛国日韩精品**专区| 成人有码在线播放| 精品丝袜一区二区三区| 欧美午夜精品久久久久久人妖| 亚洲欧洲日产国产网站| 久久久视频免费观看| 九九热这里只有精品6| 日韩电影在线观看永久视频免费网站| 久久天天躁狠狠躁夜夜躁| 日韩亚洲精品视频| 欧美日韩成人在线播放| 在线免费看av不卡| 欧美丰满少妇xxxxx做受| 亚洲精品在线观看www| 成人激情在线播放| 91久久国产综合久久91精品网站| 狠狠色香婷婷久久亚洲精品| 国产伦精品一区二区三区精品视频| 91在线观看免费| 欧美韩国理论所午夜片917电影| 中文综合在线观看| 性欧美视频videos6一9| 久久久欧美精品| 亚洲成人黄色网址| 日韩美女免费视频| 成人国产精品久久久久久亚洲| 国语自产精品视频在线看抢先版图片| 中文字幕精品一区久久久久| 91精品国产91久久久久久最新| 日韩在线不卡视频| 欧洲精品毛片网站| 国产精品r级在线| 中文字幕欧美在线| 国产亚洲精品久久久优势| 欧美日韩国产综合新一区| 国产成人鲁鲁免费视频a| 97在线视频免费观看| 亚洲偷熟乱区亚洲香蕉av| 国产香蕉一区二区三区在线视频| 国产日韩在线观看av| 久色乳综合思思在线视频| 成人a在线视频| 亚洲国产天堂久久国产91| 日韩成人在线视频观看| 92福利视频午夜1000合集在线观看| 亚洲免费小视频| 国产精品久久久久久久久久| 亚洲欧美日韩天堂一区二区| 国产成人亚洲精品| 91国产在线精品| 91精品国产高清自在线| 国产在线视频91| 97精品国产97久久久久久| 992tv在线成人免费观看| 97视频com| 亚洲精品国产成人| 久久精品国产成人精品| 国产精品久久视频| 在线免费观看羞羞视频一区二区| 国产丝袜一区二区三区| 亚洲国产精品久久久久秋霞蜜臀| 国产成人久久久精品一区| 亚洲日本成人女熟在线观看| 亚洲成人av片在线观看|