首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VC++ 6.0 誤用 C# MessageBox 代碼導致編譯錯誤:正確寫法對照

     編輯:程式設計疑難解答

在 VC++ 6.0 專案中直接複製 C# `MessageBox.Show` / `DialogResult` 代碼,會產生大量「未宣告識別元」「類別/結構/聯集類型缺失」編譯錯誤。根本原因是 **C# WinForms API 與 C++ Win32 API 完全不同**。本文提供對照表與正確移植寫法。

錯誤代碼(C# 風格)

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(); }

編譯錯誤摘要

  • `DialogResult`、`MessageBoxButtons`、`MessageBoxIcon`、`MessageBoxDefaultButton` 皆為 C# `System.Windows.Forms` 命名空間類別,C++ 無此定義
  • `MessageBox.Show` 為 C# 靜態方法,C++ 使用 `::MessageBox` 全域函式
  • `this.Close()` 為 C# Form 方法,C++ 對應 `DestroyWindow(hwnd)` 或 `PostQuitMessage(0)`

C++ Win32 正確寫法對照表

C# 代碼C++ (Win32 API) 代碼說明
MessageBox.Show(this, msg, cap, MessageBoxButtons.YesNo)MessageBox(hwnd, TEXT(msg), TEXT(cap), MB_YESNO | MB_ICONQUESTION)`hwnd` 為視窗控制代碼,`MB_*` 為旗標組合
DialogResult.YesIDYES返回值直接比較整數常數
DialogResult.NoIDNO
MessageBoxIcon.InformationMB_ICONINFORMATION
this.Close()DestroyWindow(hwnd) 或 PostMessage(hwnd, WM_CLOSE, 0, 0)關閉視窗

完整可編譯範例(VC++ 6.0 / Win32 SDK)

#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;
}

常用 MessageBox 旗標組合速查

// 按鈕組合(二選一)
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         // 工作模態

MFC 專案中的寫法

// 在 CDialog / CWnd 衍生類別中
int ret = AfxMessageBox(_T("Cancel this operation?"), MB_YESNO | MB_ICONQUESTION);
if (ret == IDYES) {
    // ...
    EndDialog(IDOK);  // 或 OnOK()
}

避坑提醒

  • VC++ 6.0 預設字元集為 MBCS,字串常數用 `TEXT("...")` 或 `_T("...")` 宏包裹,支援 Unicode 建置
  • `MessageBox` 返回 `int`,直接與 `IDYES`/`IDNO`/`IDOK`/`IDCANCEL` 比較
  • 不要在主控台應用程式(`main`/`WinMain` 無視窗)呼叫 `MessageBox` 時傳 `NULL` 作為 `hwnd`,雖然合法但屬於「無主視窗模態」,體驗較差

將 C# WinForms 思維切換為 C++ Win32 SDK 思維:`MessageBox` 是全域函式、旗標用位元或組合、返回值是整數常數。照著上表對照修改,即可在 VC++ 6.0 順利編譯通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved