MFC:微軟基礎類(Microsoft Foundation Classes),同VCL類似,是一種應用程序框架,隨微軟Visual C++ 開發工具發布。作為Application Framework,MFC的使用只能提高某些情況下的開發效率,只起到輔助作用,而不能替代整個Win32 程序設計。
本次主要以Windows下Visual Studio 2019環境下如何搭建MFC應用開發環境,創建MFC項目以及實例程序來對C++ MFC應用程序開發來做一個歸納整理。
一、搭建開發環境
由於Visual Studio 2019在導入.NET 桌面程序開發工具和依賴的時候默認沒有勾選MFC應用程序開發所需的“適用於最新v142 生成工具的C++ MFC(包括用於開發MFC應用程序的標頭和庫,包含多字節字符集)”,所以在新建項目時無法創建MFC應用程序。如下:
在勾選了“適用於最新v142 生成工具的C++ MFC”之后,重新啟動Visual Studio 2019;滿足MFC開發的條件,便可新建MFC 應用程序。如下:
至此,Windows下基於Visual Studio 2019的C++ MFC應用開發所需的環境基本配置完畢。
二、創建MFC程序
輸入項目名稱、選擇項目存放位置,點擊“確定”按鈕。出現“MFC 應用程序 應用程序類型選項”對話框,選擇“基於對話框”應用程序類型,這樣,一個簡單的MFC 對話框應用程序開發項目就已經建好。
三、MFC編程實例
(1)在窗體添加控件
右鍵點擊窗體,選擇添加變量,如下:
比如添加一個按鈕(Button):
(2)修改屬性以及添加對應函數
在添加完一個控件(按鈕)之后,右鍵點擊按鈕選擇屬性,便可以編輯它的屬性;雙擊按鈕可以自動生成按鈕的點擊時間處理函數(沒有定義按鈕點擊事件處理函數之前)。如下:
(3)程序文件說明
1)頭文件***Dlg.h (***指項目名,下同)
主要定義和聲明了對話框ID和主要的函數。
#ifdef AFX_DESIGN_TIME enum { IDD = IDD_MULTITHREAD_DIALOG }; #endif
public:
afx_msg void OnBnClickedButtonS();
afx_msg void OnBnClickedButtonM();
afx_msg void OnBnClickedButton3();
};
2)源文件***Dlg.cpp
主要實現了頭文件中定義的函數,以及控件對應的事假處理函數。
void CMultiThreadDlg::OnBnClickedButtonM() { // TODO: 在此添加控件通知處理程序代碼 //DWORD startTime = GetTickCount();//計時開始 GetDlgItem(IDC_BUTTON_S)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_M)->EnableWindow(FALSE); CDC* dc = GetDC(); CRect rt; GetClientRect(rt); dc->FillSolidRect(0, 0, rt.Width(), rt.Height() - 70, RGB(240, 240, 240));//刷新背景 dc->TextOut(97, 290, TEXT("Thread 1")); dc->TextOut(277, 290, TEXT("Thread 2")); dc->TextOut(457, 290, TEXT("Thread 3")); //初始化線程的參數 Info[0].hWnd = Info[1].hWnd = Info[2].hWnd = GetSafeHwnd(); Info[0].nOffset = 10; Info[1].nOffset = 190; Info[2].nOffset = 370; Info[0].clrRGB = RGB(255, 0, 0); Info[1].clrRGB = RGB(0, 255, 0); Info[2].clrRGB = RGB(0, 0, 255); //創建線程 for (int i = 0; i < 3; i++) { hThead[i] = CreateThread(NULL, 0, ThreadProc, &Info[i], 0, &dwThreadID[i]); } ReleaseDC(dc); //DWORD endTime = GetTickCount();//計時結束 //CString sTime; //sTime.Format(_T("The run time is: %d 毫秒"), endTime - startTime); //MessageBox(sTime); //使能按鈕 GetDlgItem(IDC_BUTTON_S)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_M)->EnableWindow(TRUE); } void CMultiThreadDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知處理程序代碼 CRect rectDlg; GetClientRect(rectDlg); // 得到客戶區的位置和大小 //GetWindowRect(rectDlg);//獲得窗體在屏幕上的位置大小 ScreenToClient(rectDlg); CRect rectS, rectM; GetDlgItem(IDC_BUTTON_S)->GetWindowRect(&rectS);//獲取控件相對於屏幕的位置 ScreenToClient(rectS);//轉化為對話框上的相對位置 GetDlgItem(IDC_BUTTON_M)->GetWindowRect(&rectM);//獲取控件相對於屏幕的位置 ScreenToClient(rectM);//轉化為對話框上的相對位置 }
3)資源文件***.rc下的Dialog文件夾下的IDD_***_DIALOG,即對話框(關掉對話框后雙擊這個文件就可以重新打開了)。
(4)運行效果
最后,整個項目我已經打包上傳至個人gitlab:https://gitlab.com/JC_peng/mfc-demo;需要的自行下載。