新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MFC和Win32技術(shù)應(yīng)用分析

MFC和Win32技術(shù)應(yīng)用分析

作者: 時間:2018-09-05 來源:網(wǎng)絡(luò) 收藏

本文引用地址:http://m.butianyuan.cn/article/201809/388505.htm

MDI子窗口類似于上述MDI主窗口的處理。

在MFC創(chuàng)建控制窗口時,如工具欄窗口,如果“AfxControlBar”類還沒有注冊,則注冊它。注冊過程很簡單,就是調(diào)用::InitCommonControl加載通用控制動態(tài)連接庫。

調(diào)用::RegisterWndClass。

直接調(diào)用Win32的窗口注冊函數(shù)::RegisterWndClass注冊“窗口類”,這樣做有一個缺點(diǎn):如果是DLL模塊,這樣注冊的“窗口類”在程序退出時不會自動的被取消注冊(Unregister)。所以必須記得在DLL模塊退出時取消它所注冊的窗口類。

子類化

子類化(Subclass)一個“窗口類”,可自動地得到它的“窗口類”屬性。

MFC窗口類CWnd

在Windows系統(tǒng)里,一個窗口的屬性分兩個地方存放:一部分放在“窗口類”里頭,如上所述的在注冊窗口時指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y軸),窗口的Z軸順序,窗口的狀態(tài)(ACTIVE,MINIMIZED,MAXMIZED,RESTORED…),和其他窗口的關(guān)系(父窗口,子窗口…),窗口是否可以接收鍵盤或鼠標(biāo)消息,等等。

為了表達(dá)所有這些窗口的共性,MFC設(shè)計(jì)了一個窗口基類CWnd。有一點(diǎn)非常重要,那就是CWnd提供了一個標(biāo)準(zhǔn)而通用的MFC窗口過程,MFC下所有的窗口都使用這個窗口過程。至于通用的窗口過程卻能為各個窗口實(shí)現(xiàn)不同的操作,那就是MFC消息映射機(jī)制的奧秘和作用了。這些,將在后面有關(guān)章節(jié)詳細(xì)論述。

CWnd提供了一系列成員函數(shù),或者是對Win32相關(guān)函數(shù)的封裝,或者是CWnd新設(shè)計(jì)的一些函數(shù)。這些函數(shù)大致如下。

(1)窗口創(chuàng)建函數(shù)

這里主要討論函數(shù)Create和CreateEx。它們封裝了Win32窗口創(chuàng)建函數(shù)::CreateWindowEx。Create的原型如下:

BOOL CWnd::Create(LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT rect,

CWnd* pParentWnd, UINT nID,

CCreateContext* pContext)

Create是一個虛擬函數(shù),用來創(chuàng)建子窗口(不能創(chuàng)建桌面窗口和POP UP窗口)。CWnd的基類可以覆蓋該函數(shù),例如邊框窗口類等覆蓋了該函數(shù)以實(shí)現(xiàn)邊框窗口的創(chuàng)建,視類則使用它來創(chuàng)建視窗口。

Create調(diào)用了成員函數(shù)CreateEx。CWnd::CreateEx的原型如下:

BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)

CreateEx有11個參數(shù),它將調(diào)用::CreateWindowEx完成窗口的創(chuàng)建,這11個參數(shù)對應(yīng)地傳遞給::CreateWindowEx。參數(shù)指定了窗口擴(kuò)展風(fēng)格、“窗口類”、窗口名、窗口大小和位置、父窗口句柄、窗口菜單和窗口創(chuàng)建參數(shù)。

CreateEx的處理流程將在后面4.4.1節(jié)討論窗口過程時分析。

窗口創(chuàng)建時發(fā)送WM_CREATE消息,消息參數(shù)lParam指向一個CreateStruct結(jié)構(gòu)的變量,該結(jié)構(gòu)有11個域,其描述見后面4.4.1節(jié)對窗口過程的分析,Windows使用和CreateEx參數(shù)一樣的內(nèi)容填充該變量。

(2)窗口銷毀函數(shù)

例如:

DestroyWindow函數(shù) 銷毀窗口

PostNcDestroy( ),銷毀窗口后調(diào)用,虛擬函數(shù)

(3)用于設(shè)定、獲取、改變窗口屬性的函數(shù),例如:

SetWindowText(CString tiltle) 設(shè)置窗口標(biāo)題

GetWindowText() 得到窗口標(biāo)題

SetIcon(HICON hIcon, BOOL bBigIcon);設(shè)置窗口像標(biāo)

GetIcon( BOOL bBigIcon ) ;得到窗口像標(biāo)

GetDlgItem( int nID);得到窗口類指定ID的控制子窗口

GetDC(); 得到窗口的設(shè)備上下文

SetMenu(CMenu *pMenu); 設(shè)置窗口菜單

GetMenu();得到窗口菜單

(4)用于完成窗口動作的函數(shù)

用于更新窗口,滾動窗口,等等。一部分成員函數(shù)設(shè)計(jì)成或可重載(Overloaded)函數(shù),或虛擬(Overridden)函數(shù),或MFC消息處理函數(shù)。這些函數(shù)或者實(shí)現(xiàn)了一部分功能,或者僅僅是一個空函數(shù)。如:

有關(guān)消息發(fā)送的函數(shù):

SendMessage( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 );

給窗口發(fā)送發(fā)送消息,立即調(diào)用方式

PostMessage(( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 );

給窗口發(fā)送消息,放進(jìn)消息隊(duì)列

有關(guān)改變窗口狀態(tài)的函數(shù)

MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );

移動窗口到指定位置

ShowWindow(BOOL );顯示窗口,使之可見或不可見

….

實(shí)現(xiàn)MFC消息處理機(jī)制的函數(shù):

virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam ); 窗口過程,虛擬函數(shù)

virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );處理命令消息

消息處理函數(shù):

OnCreate( LPCREATESTRUCT lpCreateStruct );MFC窗口消息處理函數(shù),窗口創(chuàng)建時由MFC框架調(diào)用

OnClose();MFC窗口消息處理函數(shù),窗口創(chuàng)建時由MFC框架調(diào)用

其他功能的函數(shù)

CWnd的導(dǎo)出類是類型更具體、功能更完善的窗口類,它們繼承了CWnd的屬性和方法,并提供了新的成員函數(shù)(消息處理函數(shù)、虛擬函數(shù)、等等)。

常用的窗口類及其層次關(guān)系見圖1-1。

在MFC下創(chuàng)建一個窗口對象

MFC下創(chuàng)建一個窗口對象分兩步,首先創(chuàng)建MFC窗口對象,然后創(chuàng)建對應(yīng)的Windows窗口。在內(nèi)存使用上,MFC窗口對象可以在?;蛘叨?使用new創(chuàng)建)中創(chuàng)建。具體表述如下:

創(chuàng)建MFC窗口對象。通過定義一個CWnd或其派生類的實(shí)例變量或者動態(tài)創(chuàng)建一個MFC窗口的實(shí)例,前者在??臻g創(chuàng)建一個MFC窗口對象,后者在堆空間創(chuàng)建一個MFC窗口對象。

調(diào)用相應(yīng)的窗口創(chuàng)建函數(shù),創(chuàng)建Windows窗口對象。

例如:在前面提到的AppWizard產(chǎn)生的源碼中,有CMainFrame(派生于CMDIFrame(SDI)或者CMDIFrameWnd(MDI))類。它有兩個成員變量定義如下:



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉