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

MFC 對話框按鈕開發:從添加控件到修改遊戲數據的完整流程

     編輯:程式設計綜合問答

VS2013 MFC 為對話框添加按鈕並實現遊戲數據修改、單次關閉

針對「飛機大戰」類遊戲,在設定對話框中添加「無敵」「無限能量」按鈕,點擊即時修改主遊戲數據,並解決「需點四次才能關閉」的常見問題。

步驟 1:資源編輯器添加按鈕

  1. 打開 Resource View → 對話框資源 IDD_DIALOG_SETTINGS。
  2. 從工具箱拖入 3 個 Button,屬性設置:
    • ID: IDC_BTN_INVINCIBLE、IDC_BTN_INFINITE_ENERGY、IDC_BTN_CLOSE
    • Caption: 「無敵」「無限能量」「確定」

步驟 2:類向導添加控制變量與消息映射

右鍵對話框類 CSettingsDlg → Add Variable:

  • Control variable: m_btnInvincible (CButton)、m_btnInfiniteEnergy、m_btnClose

右鍵 → Add Event Handler:

  • BN_CLICKED → OnBnClickedBtnInvincible 等三個處理函數。

步驟 3:按鈕處理函數修改遊戲數據

// SettingsDlg.cpp
#include "GameData.h"  // 單例或全局遊戲數據頭文件

void CSettingsDlg::OnBnClickedBtnInvincible()
{
    // 直接修改同進程內的遊戲數據
    CGameData::GetInstance()->SetInvincible(true);
    AfxMessageBox(_T("無敵模式已開啟"));
}

void CSettingsDlg::OnBnClickedBtnInfiniteEnergy()
{
    CGameData::GetInstance()->SetEnergy(99999);
    AfxMessageBox(_T("能量已設為無限"));
}

void CSettingsDlg::OnBnClickedBtnClose()
{
    // 正確關閉模態對話框
    OnOK();  // 或 EndDialog(IDOK);
}

核心原理:同進程數據共享

MFC 對話框與主遊戲視圖/文檔運行在同一進程,通過:

  • 單例模式 CGameData::GetInstance()
  • 或 theApp 全局指針訪問 CGameDoc
  • 或 AfxGetMainWnd() 轉型獲取主框架

即可直接讀寫任何非私有成員。若成員為 private,添加公有 Set/Get 接口或聲明 friend。

解決「點四次才能關閉」

原因:在 OnOK/OnCancel 中誤調用了多次 EndDialog,或按鈕屬性設置為「默認按鈕」導致重複觸發。

// 錯誤示範
void CSettingsDlg::OnBnClickedBtnClose()
{
    OnOK();  // 第一次
    EndDialog(IDOK);  // 第二次 → 導致棧展開異常
    CDialogEx::OnOK(); // 第三次
}

// 正確:只調用一次
void CSettingsDlg::OnBnClickedBtnClose()
{
    OnOK();  // 模態對話框標準關閉流程
}

檢查資源編輯器中「確定」按鈕的 Default Button 屬性,確保只有一個按鈕勾選。

調試技巧

  1. 在按鈕處理函數設置斷點,確認進入。
  2. 用 TRACE(_T(\"Invincible=%d\\n\"), val); 輸出調試信息到 Output 窗口。
  3. 若數據未生效,檢查 CGameData 是否真為單例(構造函數 private、靜態實例指針)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved