將對話框資源以 Child/無邊框樣式建立,並以非模態方式建立於父視窗中,可實現靈活的子視窗嵌入。本文介紹 `CDialog` 衍生類與 `CFormView` 衍生類兩種做法,涵蓋資源設定、建立流程、位置調整與 `CFormView` 需修改建構函數存取屬性的關鍵步驟。
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` 繼承 `CScrollView`,自動支援捲動條與列印預覽,適合大面積表單。
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) |
| 適用場景 | 固定大小面板、工具箱、屬性頁 | 大型表單、報表、需捲動的資料錄入 |