Visual C++ 不只是編譯器,更是整合式開發環境 (IDE)。MFC (Microsoft Foundation Classes) 以 C++ 面向對象特性封裝 Windows API,提供:
| 控制項 | MFC 類別 | 典型用途 |
|---|---|---|
| 靜態文字標籤 | CStatic | 標題、說明、分組框架 |
| 按鈕 | CButton | 命令觸發、核取方塊、選項按鈕 |
| 編輯框 | CEdit | 單行/多行文字輸入 |
| 清單方塊 | CListBox | 單選/多選清單 |
| 組合方塊 | CComboBox | 下拉式清單 + 編輯 |
| 捲軸 | CScrollBar | 捲動、數值輸入 |
| 單選按鈕 | CButton (BS_RADIOBUTTON) | 互斥選項 |
| 核取方塊 | CButton (BS_CHECKBOX) | 獨立開關選項 |
| 觀點 | 使用者 | 程式設計師 |
|---|---|---|
| 介面元素 | 按鈕、捲軸、選單、圖示 | 子視窗 (HWND)、控制項物件 |
| 動作 | 滑鼠點擊、鍵盤輸入 | 訊息 (WM_COMMAND, WM_LBUTTONDOWN...) |
| 回應 | 視覺回饋、功能執行 | 訊息處理函數、命令處理器 |
// 傳統 C + Win32 API (簡化)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: // 建立子控制項
CreateWindow("BUTTON", "Exit", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
50,50,100,30, hWnd, (HMENU)IDC_EXIT, hInst, NULL);
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_EXIT && HIWORD(wParam) == BN_CLICKED)
PostQuitMessage(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
// MFC 方式
class CMyWnd : public CFrameWnd {
CButton m_btnExit;
afx_msg void OnExit();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
ON_BN_CLICKED(IDC_EXIT, OnExit)
END_MESSAGE_MAP()
void CMyWnd::OnExit() { PostQuitMessage(0); }
// 建構函數中:
m_btnExit.Create("Exit", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(50,50,150,80), this, IDC_EXIT);
#include
class CHelloApp : public CWinApp {
public:
virtual BOOL InitInstance();
};
CHelloApp HelloApp; // 全域唯一應用程式物件
class CHelloWindow : public CFrameWnd {
CStatic* m_pLabel;
public:
CHelloWindow();
};
BOOL CHelloApp::InitInstance() {
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CHelloWindow::CHelloWindow() {
Create(NULL, _T("Hello World!"), WS_OVERLAPPEDWINDOW, CRect(0,0,200,200));
CRect r(50,80,150,150);
m_pLabel = new CStatic();
m_pLabel->Create(_T("hello world"), WS_CHILD|WS_VISIBLE|SS_CENTER, r, this);
}
Window → Close All 清理環境File → New → Projects → Win32 Application → 名稱 helloFile → New → Files → C++ Source File → 貼上代碼 → 存為 hello.cppProject → Add To Project → Files → hello.cppProject → Settings → General → "Use MFC in a Shared DLL" (關鍵!)Build → Build hello.exe → Build → Execute hello.exe| 策略 | 適用場景 | 操作 |
|---|---|---|
| 獨立目錄/專案 | 教學、小工具、獨立模組 | 每專案一目錄,FileView/ClassView 清晰 |
| 方案含多專案 | 實務系統:EXE + DLL + Static Lib + 測試專案 | VS 方案 (.sln) 管理相依性、統一建置 |
| 單目錄切換原始檔 | 空間受限、快速原型 | Project → Remove/Add Files 切換 main cpp |
CFrameWnd::Create, SS_CENTER, WS_OVERLAPPEDWINDOW雖然 VC++ 6.0 (1998) 是經典教學基準,但現代 Visual Studio (2019/2022) 提供:
核心架構不變:本教程的 MFC 基礎概念在現代 VS 完全適用,僅專案建立方式現代化。