首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

統一風格介面設計理論與實作(二)

     編輯:關於VC++

圖一

圖二

一、理論基礎

視窗與對話框的差異

Win32 SDK 對話框使用系統提供的視窗程序與對話框程序;MFC 則統一使用同一視窗程序,對話框程序僅處理 WM_INITDIALOG,其餘交由視窗程序。因此自訂介面必須在視窗程序相關訊息中實作。

關鍵非客戶區訊息

  • WM_NCPAINT:重繪非客戶區(標題列、邊框)
  • WM_NCLBUTTONDOWN:非客戶區左鍵按下
  • WM_NCMOUSEMOVE:非客戶區滑鼠移動
  • WM_SIZE:視窗大小改變,需重新排版控制項

二、統一風格實作步驟

1. 建立自訂標題列主視窗

繼承 CDialog,重寫非客戶區繪製與滑鼠回應。

2. 處理 OnInitDialog

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;
}

3. 建立子對話框並修改基底類別

  • 用資源編輯器建立對話框模板,ClassWizard 產生類別(基類 CDialog)
  • 將 .h、.cpp 中所有 CDialog 改為 CTitleBarDlg(建議用編輯器取代功能)
  • .h 加入 #include "TitleBarDlg.h"
  • 建構函式第一個參數 CTitleBarDlg nID 須刪除,否則無法編譯

4. 以非模態方式顯示

CYourDlg* pDlg = new CYourDlg;
pDlg->Create(IDD_YOUR_DLG);
pDlg->ShowWindow(SW_SHOW);
// 需適當時機 delete pDlg 防止記憶體洩漏

注意:目前僅支援非模態顯示,DoModal() 會失敗。作者建立了統一介面開發模板,有需求可聯繫交流。

三、已知限制

  1. 自訂風格視窗必須為主視窗,尚無法獨立使用
  2. 子視窗僅支援非模態對話框
  3. 需在特定模板架構下開發才能確保風格一致

後續將探討更多介面美化難點,敬請期待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved