
圖一

圖二
Win32 SDK 對話框使用系統提供的視窗程序與對話框程序;MFC 則統一使用同一視窗程序,對話框程序僅處理 WM_INITDIALOG,其餘交由視窗程序。因此自訂介面必須在視窗程序相關訊息中實作。
WM_NCPAINT:重繪非客戶區(標題列、邊框)WM_NCLBUTTONDOWN:非客戶區左鍵按下WM_NCMOUSEMOVE:非客戶區滑鼠移動WM_SIZE:視窗大小改變,需重新排版控制項繼承 CDialog,重寫非客戶區繪製與滑鼠回應。
BOOL CTitleBarDlg::OnInitDialog()
{
// 此處不可修改,供子類別使用
m_ToolTip.Create(this, TTS_ALWAYSTIP);
m_ReSizeFlag = TRUE;
CRect rtWnd; GetClientRect(&rtWnd);
m_OldWidth = rtWnd.Width(); m_OldHeight = rtWnd.Height();
OldPoint.x = rtWnd.Width(); OldPoint.y = rtWnd.Height();
if (!m_BaseFlag)
{
m_BaseFlag = TRUE;
CDialog::OnInitDialog();
//**************************************
// 這裡才能加入主視窗專屬初始化代碼
//**************************************
}
return TRUE;
}
CDialog).h、.cpp 中所有 CDialog 改為 CTitleBarDlg(建議用編輯器取代功能).h 加入 #include "TitleBarDlg.h"CTitleBarDlg nID 須刪除,否則無法編譯CYourDlg* pDlg = new CYourDlg;
pDlg->Create(IDD_YOUR_DLG);
pDlg->ShowWindow(SW_SHOW);
// 需適當時機 delete pDlg 防止記憶體洩漏
注意:目前僅支援非模態顯示,DoModal() 會失敗。作者建立了統一介面開發模板,有需求可聯繫交流。
後續將探討更多介面美化難點,敬請期待。