在 VC++ 6.0 專案中直接複製 C# `MessageBox.Show` / `DialogResult` 代碼,會產生大量「未宣告識別元」「類別/結構/聯集類型缺失」編譯錯誤。根本原因是 **C# WinForms API 與 C++ Win32 API 完全不同**。本文提供對照表與正確移植寫法。
string message = "You did not enter a server name. Cancel this operation?";
string caption = "No Server Name Specified";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;
result = MessageBox.Show(this, message, caption, buttons);
if (result == DialogResult.Yes) { this.Close(); }
| C# 代碼 | C++ (Win32 API) 代碼 | 說明 |
|---|---|---|
MessageBox.Show(this, msg, cap, MessageBoxButtons.YesNo) | MessageBox(hwnd, TEXT(msg), TEXT(cap), MB_YESNO | MB_ICONQUESTION) | `hwnd` 為視窗控制代碼,`MB_*` 為旗標組合 |
DialogResult.Yes | IDYES | 返回值直接比較整數常數 |
DialogResult.No | IDNO | |
MessageBoxIcon.Information | MB_ICONINFORMATION | |
this.Close() | DestroyWindow(hwnd) 或 PostMessage(hwnd, WM_CLOSE, 0, 0) | 關閉視窗 |
#include
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// 1. 簡單訊息方塊
int ret = MessageBox(NULL,
TEXT("You did not enter a server name. Cancel this operation?"),
TEXT("No Server Name Specified"),
MB_YESNO | MB_ICONQUESTION);
// 2. 判斷使用者點選
if (ret == IDYES) {
// 使用者按「是」→ 執行後續邏輯
MessageBox(NULL, TEXT("User clicked YES"), TEXT("Result"), MB_OK);
} else {
MessageBox(NULL, TEXT("User clicked NO"), TEXT("Result"), MB_OK);
}
return 0;
}
// 按鈕組合(二選一)
MB_OK // 只有「確定」
MB_OKCANCEL // 「確定」/「取消」
MB_YESNO // 「是」/「否」
MB_YESNOCANCEL // 「是」/「否」/「取消」
MB_RETRYCANCEL // 「重試」/「取消」
// 圖示(可與按鈕組合用 |)
MB_ICONINFORMATION // 藍色 i
MB_ICONWARNING // 黃色 !
MB_ICONERROR // 紅色 ×
MB_ICONQUESTION // 藍色 ?
// 預設按鈕(可選)
MB_DEFBUTTON1 // 第 1 個按鈕預設
MB_DEFBUTTON2 // 第 2 個按鈕預設
MB_DEFBUTTON3 // 第 3 個按鈕預設
// 模態類型
MB_APPLMODAL // 應用程式模態(預設)
MB_SYSTEMMODAL // 系統模態
MB_TASKMODAL // 工作模態
// 在 CDialog / CWnd 衍生類別中
int ret = AfxMessageBox(_T("Cancel this operation?"), MB_YESNO | MB_ICONQUESTION);
if (ret == IDYES) {
// ...
EndDialog(IDOK); // 或 OnOK()
}
將 C# WinForms 思維切換為 C++ Win32 SDK 思維:`MessageBox` 是全域函式、旗標用位元或組合、返回值是整數常數。照著上表對照修改,即可在 VC++ 6.0 順利編譯通過。