在 Windows 操作系統中,窗口與對話框外觀相似,皆為矩形區域,擁有標題欄、系統按鈕、邊框,可移動、可縮放。但兩者在內部機制上存在關鍵差異:
AfxWndProc),對話框類亦同。MFC 對話框過程僅處理 WM_INITDIALOG 消息,其餘消息交由窗口過程分發。因此,我們只能在 OnInitDialog() 中進行對話框初始化,其他界面定製必須在窗口過程的相關消息處理中實現。為實現自定義標題欄、邊框繪製與交互,需重載以下非客戶區消息:
| 消息 | 用途 |
|---|---|
WM_NCPAINT | 重繪非客戶區(標題欄、邊框),可實現自繪標題欄、皮膚換膚。 |
WM_NCLBUTTONDOWN | 非客戶區左鍵按下,處理標題欄拖拽、系統按鈕點擊等。 |
WM_NCMOUSEMOVE | 非客戶區鼠標移動,可實現懸停高亮、自定義光標。 |
WM_SIZE | 窗口大小改變,需在內部重新佈局控件位置與大小,保持專業感。 |
此外尚有 WM_NCACTIVATE、WM_NCCALCSIZE 等消息,配合使用可完全接管窗口外觀。
Windows 系統與微軟自家應用(Office、VS)擁有高度一致的視覺風格。要讓 MFC CDialog 脫離預設風格,難度極大,除非深諳 MFC 內核甚至系統內核機制。作者在摸索中總結出可行路徑:
CWnd 重寫非客戶區繪製:建立基類 CSkinDialog,統一處理 WM_NCPAINT、WM_NCHITTEST 等。詳細實現代碼請參考前作《讓你的軟件界面更漂亮 [VC][一]》及本文附帶的示例程序。

圖一:統一風格對話框示例