在 MFC 應用程式中,有時需限制使用者關閉視窗或調整視窗大小。本文彙整三項實用技巧:禁用對話方塊關閉鈕、禁用浮動工具列的系統選單、禁用最大化鈕,附完整程式碼片段。
在對話方塊類別的 OnInitDialog 或建構函式中加入:
ModifyMenuCMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItemCMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
兩者效果相同,將關閉鈕設為灰色不可用。
建立 CToolBar 衍生類別 CxxToolBar,在滑鼠雙擊 (OnLButtonDblClk) 與單擊 (OnLButtonDown) 處理函式中加入:
if (IsFloating()) // 工具列處於浮動狀態
{
CWnd* pDockBar = GetParent();
CWnd* pMiniFrame = pDockBar->GetParent();
// 移除 WS_SYSMENU 風格
pMiniFrame->ModifyStyle(WS_SYSMENU, NULL);
// 重繪工具列以生效
pMiniFrame->ShowWindow(SW_HIDE);
pMiniFrame->ShowWindow(SW_SHOW);
}
覆寫 PreCreateWindow,移除 WS_MAXIMIZEBOX 風格:
BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_MAXIMIZEBOX;
return CFrameWnd::PreCreateWindow(cs);
}
上述技巧皆透過修改視窗風格或選單狀態實現,無需複雜攔截訊息,適合快速套用於既有專案。