MFC 對話框是 Windows 應用程式最常見的介面形式,但預設功能有限。本文彙整 11 項實用技巧,涵蓋工具列/狀態列整合、非矩形視窗、非客戶區拖曳、啟動隱藏、全螢幕模式、焦點控制、動態縮放、任務列圖示隱藏、內容敏感說明等,助你打造專業級對話框介面。
在 OnInitDialog 中建立 CToolBar,設定 CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY 風格,載入工具列資源,並呼叫 RepositionBars 調整客戶區配置,最後移動子視窗位置以配合工具列高度。
利用 CreateEllipticRgn、CreateRoundRectRgn 或 CreatePolygonRgn 建立區域,於 OnInitDialog 取得客戶區大小後呼叫 SetWindowRgn 套用,即可實現非矩形視窗。
兩種方法:
OnLButtonDown 中送出 WM_NCLBUTTONDOWN, HTCAPTION 訊息。OnNcHitTest,將 HTCLIENT 回傳為 HTCAPTION。SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE)OnWindowPosChanging 移除 SWP_SHOWWINDOW,稍後再 ShowWindow(SW_SHOW)。覆寫 OnSizing,修改 LPRECT 參數強制寬高不小於指定值。
建立 CStatusBar 成員,OnInitDialog 中 CreateEx、SetIndicators、SetPaneInfo 設定窗格寬度,最後 RepositionBars 重新配置。
visible = false。OnWindowPosChanging,若 !visible 則 lpwndpos->flags &= ~SWP_SHOWWINDOW。visible = true; ShowWindow(SW_SHOW)。OnInitDialog 中移除 WS_CAPTION | WS_BORDER,取得螢幕解析度,呼叫 SetWindowPos(..., HWND_TOPMOST, ...) 覆蓋全螢幕。
使用 AttachThreadInput 將目前執行緒與前景視窗執行緒連結,呼叫 SetForegroundWindow 與 SetFocus,完成後再 AttachThreadInput(..., FALSE) 釋放。
SetWindowPos(NULL, 0, 0, w, h, SWP_NOZORDER|SWP_NOMOVE)。SizeWindow 中迴圈逐漸 MoveWindow 產生伸縮動畫。送出 DM_REPOSITION 訊息(需為最上層非子視窗)。
OnCreate 或 OnInitDialog 中 ModifyStyle(0, WS_MAXIMIZEBOX | WS_MINIMIZEBOX) 或 SetWindowLong(GWL_STYLE, ...)。
覆寫 OnSetCursor,呼叫 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW)) 並回傳非零值。
在 InitInstance 呼叫 SetDialogBkColor(RGB(255,0,0), RGB(0,255,0)) 設定紅底綠字。
建立隱藏的 CFrameWnd 做為父視窗,對話框建構時傳入該父視窗,於 OnInitDialog 呼叫 ModifyStyleEx(WS_EX_APPWINDOW, 0) 移除延伸風格。
OnInitDialog 加入 WS_EX_CONTEXTHELP,覆寫 OnHelpInfo 依 dwContextId 呼叫 WinHelp(..., HELP_CONTEXTPOPUP)。