記錄MFC初學過程中遇到的典型問題及解決方案,涉及指針操作、資源類型、字符集、外部變量聲明等核心知識點。
場景:聲明對話框對象 CModallessDlg m_dlg; 後調用 m_dlg.Create() 報錯。
原因:非模態對話框需動態創建,棧上對象生命週期不可控。
解決:改為指針並動態分配:
CModallessDlg* m_pModallessDlg = new CModallessDlg(); m_pModallessDlg->Create(IDD_DIALOG, this); // 使用完畢需手動 delete
現象:.exe 運行中斷,調試器提示斷點。
原因:MFC圖片控件僅支持位圖(.bmp),嘗試加載PNG/JPG導致資源載入失敗。
解決:將圖片轉換為BMP格式,或使用CImage/GDI+支持多格式加載。
現象:兩個對話框類,一個有 OnPaint(),另一個無。
原因:MFC類向導僅在勾選「WM_PAINT」消息時自動生成。
解決:類向導 → 消息映射 → 添加 WM_PAINT → 生成處理函數,或手動添加:
// .h
afx_msg void OnPaint();
// .cpp
void CMyDlg::OnPaint() {
CPaintDC dc(this);
// 繪製代碼...
}
錯誤:error C2664: CDC::TextOutW 不能將 const char[25] 轉換為 const CString&
原因:Unicode構建下 TextOutW 期望寬字符串(L"文字" 或 CString),傳入窄字符串字面量。
解決方案一:字符串前加 L 前綴:dc.TextOutW(x, y, L"中文內容");
解決方案二:項目屬性 → 常規 → 字符集 → 改為「使用多字節字符集」(MBCS),但需統一全項目。
錯誤:參數不能從 const char[20] 轉換為 LPCTSTR
本質:同問題4,LPCTSTR 在Unicode下為 const wchar_t*。
統一解決:項目設置改為「多字節字符集」或全面使用 _T("文字") / TEXT("文字") 宏。
現象:按問題5改為MBCS後,原有 L"文字" 又報錯。
原因:MBCS下 L"" 仍為寬字符串,與API期望的 char* 不匹配。
解決:刪除所有 L 前綴,改用 _T() 宏實現雙模式兼容。
正確模式:
// File1.c - 定義(僅一次,分配內存)
int g_globalVar = 0;
// File1.h - 聲明(供其他文件包含)
extern int g_globalVar;
// File2.c / File3.c - 使用
#include "File1.h"
void func() { g_globalVar = 10; }
核心原則:定義一次,聲明多處,頭文件只放聲明。
建議建立專用Global.h/Global.cpp集中管理:
// Global.h
#pragma once
extern int g_userCount;
extern CString g_appPath;
// ... 其他全局變量聲明
// Global.cpp
#include "Global.h"
int g_userCount = 0;
CString g_appPath = _T("");
// ... 定義並初始化
// 使用處
#include "Global.h"
優點:避免重複聲明、統一初始化、便於維護、減少鏈接錯誤。
new 創建。extern聲明,源文件無extern定義並初始化。