日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]MFC微軟基礎(chǔ)類庫(英語:Microsoft FoundaTIon Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了Windows API,并且包含一個應(yīng)用程序框架

MFC

微軟基礎(chǔ)類庫(英語:Microsoft FoundaTIon Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了Windows API,并且包含一個應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。

MFC(MicrosoftFoundaTIonClasses)是微軟基礎(chǔ)類庫的簡稱,是微軟公司實現(xiàn)的一個c++類庫,主要封裝了大部分的windows API函數(shù),vc++是微軟公司開發(fā)的c/c++的集成開發(fā)環(huán)境,所謂集成開發(fā)環(huán)境,就是說利用它可以編輯,編譯,調(diào)試,而不是使用多種工具輪換操作,靈活性較大。vc也指它的內(nèi)部編譯器,集成開發(fā)環(huán)境必須有一個編譯器內(nèi)核,例如DevC++其中一個編譯器內(nèi)核就是gcc。

MFC除了是一個類庫以外,還是一個框架,在vc++里新建一個MFC的工程,開發(fā)環(huán)境會自動幫你產(chǎn)生許多文件,同時它使用了mfcxx.dll。xx是版本,它封裝了mfc內(nèi)核,所以你在你的代碼看不到原本的SDK編程中的消息循環(huán)等等東西,因為MFC框架幫你封裝好了,這樣你就可以專心的考慮你程序的邏輯,而不是這些每次編程都要重復(fù)的東西,但是由于是通用框架,沒有最好的針對性,當(dāng)然也就喪失了一些靈活性和效率。但是MFC的封裝很淺,所以效率上損失不大。

MFC初學(xué)教程

編寫MFC程序,其實跟編寫C++程序一樣,在VS編譯平臺上新建項目,然后一直默認下一步就行,不過有其他需求則需要根據(jù)實際情況來添加。建好一個項目后,會出現(xiàn)兩個界面,一個是顯示窗口,一個是編程界面,類似LV中的前面板和程序框圖。在界面右邊有個工具箱,可以根據(jù)需要添加控件。

下面主要編寫一個簡單的計算器程序,實現(xiàn)對輸入數(shù)的四則運算,主要步驟如下:

1、在對話框中放置6個按鈕控件和3個編輯框控件

具體操作:界面右邊點擊工具箱,根據(jù)具體需要選擇具體控件。

2、將3個編輯框控件分別添加float型變量m_edit1、m_edit2、m_edit3

具體操作:選中編輯框點右鍵添加變量,將右邊類別改為value,變量名分別改為m_edit1、m_edit2、m_edit3。

3、將6個個按鈕控件重新命名

具體操作:選中按鈕點擊右鍵屬性,將CapTIon改為所需要+ - * / 清除 關(guān)閉,具體可根據(jù)需要來命名。

4、選擇工具箱中Group Box將四則運算框住,然后通過屬性改名字,同時在上方添加靜態(tài)文本(StaTIc Text)來編輯命名。

界面主要部分完成,接下來就是編寫代碼,雙擊各個控件,就可自動跳轉(zhuǎn)到程序編寫部分,主要代碼如下

[html] view plain copyvoid CMFC入門Dlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知處理程序代碼

UpdateData(true);//從控件獲得數(shù)據(jù)賦給變量

m_edit3 = m_edit1 + m_edit2;

UpdateData(false);//輸出變量的值到控件

}

void CMFC入門Dlg::OnBnClickedButton2()

{

// TODO: 在此添加控件通知處理程序代碼

UpdateData(true);

m_edit3 = m_edit1 - m_edit2;

UpdateData(false);

}

void CMFC入門Dlg::OnBnClickedButton3()

{

// TODO: 在此添加控件通知處理程序代碼

UpdateData(true);

m_edit3 = m_edit1*m_edit2;

UpdateData(false);

}

void CMFC入門Dlg::OnBnClickedButton4()

{

// TODO: 在此添加控件通知處理程序代碼

UpdateData(true);

if (m_edit2 == 0)

{

MessageBox(_T(“除數(shù)不能為0”));

return;

}

m_edit3 = m_edit1 / m_edit2;

UpdateData(false);

}

void CMFC入門Dlg::OnBnClickedButton7()

{

// TODO: 在此添加控件通知處理程序代碼

m_edit1 = 0;

m_edit2 = 0;

m_edit3 = 0;

UpdateData(false);

GotoDlgCtrl((CEdit*)GetDlgItem(IDC_EDIT1));//設(shè)置焦點在第一個編輯框

}

最后編寫完成,運行一下,彈出一個界面如下:

 


驗證一下程序,以加法為例,m_edit1輸入18,m_edit2輸入36,得出結(jié)果如下所示。

 


mfc編程入門教程

1.MFC窗口類CWnd

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

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

CWnd提供了一系列成員函數(shù),或者是對Win32相關(guān)函數(shù)的封裝,或者是CWnd新設(shè)計的一些函數(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ù)以實現(xiàn)邊框窗口的創(chuàng)建,視類則使用它來創(chuàng)建視窗口。[!--empirenews.page--]

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ù)指定了窗口擴展風(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è)計成或可重載(Overloaded)函數(shù),或虛擬(Overridden)函數(shù),或MFC消息處理函數(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ā)送消息,放進消息隊列

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

MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );

移動窗口到指定位置

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

實現(xiàn)MFC消息處理機制的函數(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。

 


2.在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或其派生類的實例變量或者動態(tài)創(chuàng)建一個MFC窗口的實例,前者在??臻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))類。它有兩個成員變量定義如下:

CToolBar m_wndToolBar;

CStatusBar m_wndStatusBar;

當(dāng)創(chuàng)建CMainFrame類對象時,上面兩個MFC Object也被構(gòu)造。

CMainFrame還有一個成員函數(shù)

OnCreate(LPCREATESTRUCT lpCreateStruct),

它的實現(xiàn)包含如下一段代碼,調(diào)用CToolBar和CStatusBar的成員函數(shù)Create來創(chuàng)建上述兩個MFC對象對應(yīng)的工具欄HWND窗口和狀態(tài)欄HWND窗口:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0(“Failed to create toolbarn”);

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0(“Failed to create status barn”);

return -1; // fail to create

}

}

關(guān)于工具欄、狀態(tài)欄將在后續(xù)有關(guān)章節(jié)作詳細討論。

在MFC中,還提供了一種動態(tài)創(chuàng)建技術(shù)。動態(tài)創(chuàng)建的過程實際上也如上所述分兩步,只不過MFC使用這個技術(shù)是由框架自動地完成整個過程的。通??蚣艽翱?、文檔框架窗口、視使用了動態(tài)創(chuàng)建。介于MFC的結(jié)構(gòu),CFrameWnd和CView及其派生類的實例即使不使用動態(tài)創(chuàng)建,也要用new在堆中分配。理由見窗口的銷毀(2.2.5節(jié))。

至于動態(tài)創(chuàng)建技術(shù),將在下一章具體討論。

在Windows窗口的創(chuàng)建過程中,將發(fā)送一些消息,如:

在創(chuàng)建了窗口的非客戶區(qū)(Nonclient area)之后,發(fā)送消息WM_NCCREATE;

在創(chuàng)建了窗口的客戶區(qū)(client area)之后,發(fā)送消息WM_CREATE;

窗口的窗口過程在窗口顯示之前收到這兩個消息。

如果是子窗口,在發(fā)送了上述兩個消息之后,還給父窗口發(fā)送WM_PARENATNOTIFY消息。其他類或風(fēng)格的窗口可能發(fā)送更多的消息,具體參見SDK開發(fā)文檔。[!--empirenews.page--]

3.MFC窗口的使用

MFC提供了大量的窗口類,其功能和用途各異。程序員應(yīng)該選擇哪些類來使用,以及怎么使用他們呢?

直接使用MFC提供的窗口類或者先從MFC窗口類派生一個新的C++類然后使用它,這些在通常情況下都不需要程序員提供窗口注冊的代碼。是否需要派生新的C++類,視MFC已有的窗口類是否能滿足使用要求而定。派生的C++類繼承了基類的特性并改變或擴展了它的功能,例如增加或者改變對消息、事件的特殊處理等。

主要使用或繼承以下一些MFC窗口類(其層次關(guān)系圖見圖1-1):

框架類CFrameWnd,CMdiFrameWnd;

文檔框架CMdiChildWnd;

視圖CView和CView派生的有特殊功能的視圖如:列表CListView,編輯CEditView,樹形列表CTreeView,支持RTF的CRichEditView,基于對話框的視CFormView等等。

對話框CDialog。

通常,都要從這些類派生應(yīng)用程序的框架窗口和視窗口或者對話框。

工具條CToolBar

狀態(tài)條CStatusBar

其他各類控制窗口,如列表框CList,編輯框CEdit,組合框CComboBox,按鈕Cbutton等。

通常,直接使用這些類。

4.在MFC下窗口的銷毀

窗口對象使用完畢,應(yīng)該銷毀。在MFC下,一個窗口對象的銷毀包括HWND窗口對象的銷毀和MFC窗口對象的銷毀。一般情況下,MFC編程框架自動地處理了這些。

(1)對CFrameWnd和CView的派生類

這些窗口的關(guān)閉導(dǎo)致銷毀窗口的函數(shù)DestroyWindow被調(diào)用。銷毀Windows窗口時,MFC框架調(diào)用的最后一個成員函數(shù)是OnNcDestroy函數(shù),該函數(shù)負責(zé)Windows清理工作,并在最后調(diào)用虛擬成員函數(shù)PostNcDestroy。CFrameWnd和CView的PostNcDestroy調(diào)用delete this刪除自身這個MFC窗口對象。

所以,對這些窗口,如前所述,應(yīng)在堆(Heap)中分配,而且,不要對這些對象使用delete操作。

(2)對Windows Control窗口

在它們的析構(gòu)函數(shù)中,將調(diào)用DestroyWidnow來銷毀窗口。如果在棧中分配這樣的窗口對象,則在超出作用范圍的時候,隨著析構(gòu)函數(shù)的調(diào)用,MFC窗口對象和它的Windows window對象都被銷毀。如果在堆(Heap)中分配,則顯式調(diào)用delete操作符,導(dǎo)致析構(gòu)函數(shù)的調(diào)用和窗口的銷毀。

所以,這種類型的窗口應(yīng)盡可能在棧中分配,避免用額外的代碼來銷毀窗口。如前所述的CMainFrame的成員變量m_wndStatusBar和m_wndToolBar就是這樣的例子。

(3)對于程序員直接從CWnd派生的窗口

程序員可以在派生類中實現(xiàn)上述兩種機制之一,然后,在相應(yīng)的規(guī)范下使用。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉