MFC 初學者開發「飛機大戰」類遊戲時,常遇到執行期調整對話框大小導致遊戲元素顯示異常、邊界檢測失效的問題。本文提供從視覺設計到邏輯適配的完整解決方案。
None 或 Thin(去掉可調整邊框)。OnInitDialog() 中呼叫 SetWindowPos() 鎖定初始尺寸:BOOL CGameDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
// 固定 800x600,不可調整
SetWindowPos(NULL, 0, 0, 800, 600,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER);
return TRUE;
}
若需支援全螢幕或可調整視窗,必須在 OnSize() 訊息處理器中同步更新遊戲邏輯邊界:
void CGameDlg::OnSize(UINT nType, int cx, int cy) {
CDialogEx::OnSize(nType, cx, cy);
if (cx <= 0 || cy <= 0) return; // 最小化時略過
// 更新遊戲世界邊界
m_rcGameBoundary.SetRect(0, 0, cx, cy);
// 通知遊戲物件重新計算位置/速度
for (auto& obj : m_gameObjects) {
obj->OnBoundaryChanged(m_rcGameBoundary);
}
Invalidate(TRUE); // 觸發重繪
}
OnPaint() 使用 CMemDC 避免閃爍。GetClipBox() 範圍內的物件。SetTimer(1, 16, NULL) (≈60 FPS) 驅動邏輯更新,OnTimer() 呼叫 InvalidateRect() 而非直接繪圖。OnSize() 在建立視窗時也會觸發一次 (cx=cy=0),需加保護判斷。OnSize() 中呼叫 MoveWindow() 或使用 CResizeDialog 輔助類。選擇方案一可快速完成教學級專案;方案二則為未來擴展全螢幕、多解析度支援奠定基礎。