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

MFC 使用對話框作為子視窗:Child Style 與 CFormView 兩種實作方式

     編輯:關於C語言

將對話框資源以 Child/無邊框樣式建立,並以非模態方式建立於父視窗中,可實現靈活的子視窗嵌入。本文介紹 `CDialog` 衍生類與 `CFormView` 衍生類兩種做法,涵蓋資源設定、建立流程、位置調整與 `CFormView` 需修改建構函數存取屬性的關鍵步驟。

方法一:CDialog 衍生類(最常用)

資源設定

  • 插入 Dialog 資源
  • 屬性:Style = Child、Border = Thin (或 None)、取消 Title Bar

建立代碼(在父視窗 `OnCreate` 中)


int CParentView::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CView::OnCreate(lpCreateStruct) == -1) return -1;

    m_childDlg.Create(IDD_CHILD_DLG, this);  // 非模態建立,指定父視窗
    m_childDlg.MoveWindow(0, 0, 400, 200);   // 定位大小
    m_childDlg.ShowWindow(SW_SHOW);          // 顯示

    return 0;
}

成員變數宣告:`CChildDlg m_childDlg;`

方法二:CFormView 衍生類(支援捲動/列印)

`CFormView` 繼承 `CScrollView`,自動支援捲動條與列印預覽,適合大面積表單。

資源設定

同 `CDialog`:Child + Thin Border + No Title。

關鍵修改:建構函數改為 public

ClassWizard 產生的 `CFormView` 衍生類建構函數預設為 `protected`,需手動修改頭檔:


class CMyFormView : public CFormView {
    DECLARE_DYNCREATE(CMyFormView)
public:
    CMyFormView();           // 改為 public
    virtual ~CMyFormView();  // 改為 public
    // ...
};

並在 `.cpp` 中實作建構函數:


CMyFormView::CMyFormView() : CFormView(IDD_MY_FORM) {}
CMyFormView::~CMyFormView() {}

建立方式

通常搭配 `CSplitterWnd` 分割視窗,或在框架視窗中動態建立:


// 在分割視窗中
m_wndSplitter.CreateView(row, col, RUNTIME_CLASS(CMyFormView), size, pContext);

比較與選擇建議

特性CDialog 子視窗CFormView 子視窗
捲動支援需自行實作內建 (CScrollView)
列印/預覽需自行繪製自動支援 OnDraw
建立複雜度低中 (需修改建構函數、常搭配 Splitter)
適用場景固定大小面板、工具箱、屬性頁大型表單、報表、需捲動的資料錄入

通用注意事項

  • 父視窗銷毀時會自動銷毀子視窗(`WS_CHILD` 特性)
  • 子視窗訊息先由自身處理,未處理再傳給父視窗
  • Tab 鍵導航需在父視窗 `PreTranslateMessage` 中呼叫 `IsDialogMessage` 或使用 `CFormView` 內建支援
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved