導航:首頁 > 文件教程 > mfcmap頭文件

mfcmap頭文件

發布時間:2024-01-26 00:18:11

Ⅰ 基於對話框的MFC應用程序怎麼建立

使用VC6.0構建最簡單的MFC程序

通過這個例子可以加深對MFC的CWinApp和CFrameWnd的了解。

1. 使用應用程序向導產生一個空的「Win32 Application」Project;
2. 添加頭文件「StdAfx.h」,內容是 #include <afxwin.h>
3. 添加源文件「StdAfx.cpp」,內容是 #include "StdAfx.h"
4. 執行Build,會看到LinkError,打開Project|Setting,在General里,選擇「Use MFC in Shared DLL」,再次執行Build,一切OK。WinMain內嵌在MFC的鏈接庫里。
5. 按F5調試執行,會出現一個「Unhandled exception …」,通過CallStack可以找到原因:AfxGetThread()和AfxGetApp()返回的都是NULL。需要實現一個全局的CWinApp對象。
6. 添加一個新Class:「class CMyWinApp : public CWinApp」,頭文件和源文件分別是Hello.cpp Hello.h,並在Hello.cpp里實例一個全局對象:CMyWinApp theApp。CWinApp只能實例一個對象,在其構造函數里加了ASSERT,防止多次實例。
7. Build之後,再按F5調試執行,程序一閃就結束了,也沒有錯誤。在Output窗口裡可以找到一句「Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.」,是因為沒有主窗口,所以程序直接退出了。
8. 重載CWinApp::InitInstance,在裡面直接m_pMainWnd = new CFrameWnd;是不行的,因為CFrameWnd的構造函數里沒有調用Create,窗口不會被創建。
9. 在CMyWinApp::InitInstance()里寫入Code:
BOOL CMyWinApp::InitInstance()
{
CFrameWnd *pMainFrame;
pMainFrame = new CFrameWnd;
pMainFrame->Create(NULL, "Hello MFC",
WS_OVERLAPPEDWINDOW, pMainFrame->rectDefault, NULL);

m_pMainWnd = pMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}
編譯後運行,可以看到一個窗口:

即,可以直接使用MFC的CFrameWnd類實現一個窗口,但是CWinApp不能直接使用,必須派生一個用戶類,因為Windows程序的啟動順序是:實例全局對象,WinMain,…,如果不實例CWinApp,找不到機會創建窗口,而派生之後,就可以重載CWinApp::InitInstance函數,AfxWinMain里會調用這個函數。
10. 使用File|New,選擇Resource Script,添加一個資源文件,在資源文件里添加一個Menu,在Menu的Property的ID里填上MenuName字串"MainMenu",然後修改InitInstance:
BOOL CMyWinApp::InitInstance()
{
CFrameWnd *pMainFrame;
pMainFrame = new CFrameWnd;
pMainFrame->Create(NULL, "Hello MFC",
WS_OVERLAPPEDWINDOW, pMainFrame->rectDefault, NULL, "MainMenu");

m_pMainWnd = pMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}
編譯運行後就可以看到菜單了。如果Menu使用的整數ID,使用MAKEINTRESOURCE轉換為字元串。

11. 到現在為止,因為直接使用的CFrameWnd,這個程序什麼也不能幹,要實現用戶功能,我們要從CFrameWnd派生一個自己的類CMainFram,我打算在窗口裡實現一個字元串從天而降的功能,即重載CFrameWnd::OnPaint函數。
12. 首先給CMainFram加上消息映射表,在類聲明裡加上DECLARE_MESSAGE_MAP(),在類實現文件里添加
BEGIN_MESSAGE_MAP(CMainFram, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
對於標準的Windows消息,其消息名稱和消息函數都是固定的,而且CFrameWnd(或其基類)已經都實現了這些消息響應的虛函數,只要在BEGIN… END… 里寫入消息映射描述,就會添加到消息映射表裡。
注意,對於CView類來說,ON_WM_PAINT()在文件:C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\ VIEWCORE.CPP的MESSAGE_MAP已經寫好了,用戶不用寫,但對於CFrameWnd來說,必須寫出來才能加到消息映射表裡。
13. 實現函數OnPaint,就可以沿著Client區域畫一個紅色的矩形框。
void CMainFram::OnPaint()
{
CPaintDC dc(this);
RECT rect;

CPen *poOldPen;
CPen oNewPen(PS_SOLID, 1, RGB(255,0,0));

poOldPen = dc.SelectObject(&oNewPen);

GetClientRect(&rect);
dc.Rectangle(&rect);
dc.SelectObject(poOldPen);
}

14. 在Resource添加一個簡單的對話框,添加一個OnAbout消息響應函數:
void CMainFram::OnAbout()
{
CDialog dlg(IDD_DIALOG_ABOUT, this);
dlg.DoModal();
}
點擊Help|About時,就會彈出資源里的對話框,可見對於沒有復雜控制項的簡單對話框,可以直接使用CDialog類,不需要派生。

閱讀全文

與mfcmap頭文件相關的資料

熱點內容
經緯度和浮點數轉換工具 瀏覽:402
群星最新版本 瀏覽:471
歐洲童裝網站有哪些 瀏覽:783
win10默認頭像下載 瀏覽:216
dnf2017代碼大全 瀏覽:219
編程項目經理證書怎麼考 瀏覽:570
律師咨詢什麼app 瀏覽:863
ps導入ai什麼格式文件 瀏覽:255
手機升級系統的利弊 瀏覽:411
如何判斷兩列是否相同的數據 瀏覽:25
安卓系統微信文件夾 瀏覽:19
xp打開word找不到文件 瀏覽:488
文件名占容量 瀏覽:882
環型槽如何編程 瀏覽:290
excel怎麼分列每一列的第二行數據 瀏覽:240
美味餐廳13安卓版完整 瀏覽:708
請先卸載本地app什麼意思 瀏覽:639
廣東有什麼土建材料網站 瀏覽:613
安卓手機究竟應該給app什麼許可權 瀏覽:137
怎樣給特定文件夾加密碼 瀏覽:168

友情鏈接