拆分視窗類CSplitterWnd在對話方塊中的應用及拆分子視窗間的通訊
阿新 • • 發佈:2019-02-11
當你在GOOGLE或者百度鍵入"如何在對話方塊中使用CSplitterWnd“時,搜尋出來的帖子大多千篇一律,鮮有真正是基於對話方塊的CSplitterWnd應用,大多是基於單文件框架的說明。至於具有參考價值的一篇博文,請參見Codeguru。
本文將告訴你如何在對話方塊中使用CSplitterWnd將主視窗拆分成兩個子視窗,並且只與檢視類有關,不涉及文件類。過載OnSize(), 使得視窗的大小可隨主視窗的變化而改變。
步驟如下:
1,在主視窗類(某對話方塊)標頭檔案中分別宣告一個框架類以及一個CSplitterWnd拆分視窗類的指標型別成員變數
- private:
-
CFrameWnd* m_pFrameSplit; // 分隔視窗
- CSplitterWnd m_wndSpliter; // 左右分隔
2,在主視窗類實現檔案中的OnInitDialog()方法事件中進行初始化工作,註冊框架類及初始CSplitterWnd
- // 取得主視窗區域
- CRect rc;
- GetDlgItem(IDC_CHILDWND)->GetWindowRect(rc); //IDC_CHILDWND是一個PictureBox的ID,表示要拆分的區域
- ScreenToClient(&rc);
- // 註冊框架類
-
CString sClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
- ::LoadCursor(NULL, IDC_ARROW), (HBRUSH)::GetStockObject(WHITE_BRUSH),
- ::LoadIcon(NULL, IDI_APPLICATION));
- // 建立分隔視窗框架
- m_pFrameSplit = new CFrameWnd;
- m_pFrameSplit->Create(sClass, _T(""), WS_CHILD, CRect(0,0,0,0), this);
- m_pFrameSplit->MoveWindow(rc);
-
m_pFrameSplit->ShowWindow(SW_SHOW);
- // 建立分割視窗
- m_wndSpliter.CreateStatic(m_pFrameSplit, 1, 2);
- m_wndSpliter.CreateView(0, 0, RUNTIME_CLASS(CEditView), CSize((int)(rc.Width() * 0.265), 0), NULL); // 左視窗所佔比例26.5%
- m_wndSpliter.CreateView(0, 1, RUNTIME_CLASS(CEditView), CSize(0,0), NULL);
- m_wndSpliter.MoveWindow(0, 0, rc.Width(), rc.Height());
- m_wndSpliter.ShowWindow(SW_SHOW);
注意倒數第三、四行。這裡是要拆分的兩個視窗對應的檢視類,為了方便演示CSplitterWnd類拆分的效果,可以先直接用CEditView代替。
執行結果,主視窗的PictureBox區域被拆分成兩個EditBox,中間有可移動的分隔欄用以調節大小。
3.過載OnSize(),使得視窗及控制元件自適應大小。傳控制元件指標或ID兩種方式均可。
- void CMainWndDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
- staticint nLastCx = 0;
- staticint nLastCy = 0;
- int nWidth = cx - nLastCx;
- int nHeight = cy - nLastCy;
- AdjustDlgItem(m_pFrameSplit, 0, 0, nWidth, nHeight);
- nLastCx = cx;
- nLastCy = cy;
- }
- // 移動控制元件 以實現視窗自適應
- void CMainWndDlg::AdjustDlgItem(UINT nId, int nLeft, int nTop,int nRight, int nBottom)
- {
- AdjustDlgItem(GetDlgItem(nId), nLeft, nTop, nRight, nBottom);
- }
- // 移動控制元件 以實現視窗自適應
- void CMainWndDlg::AdjustDlgItem(CWnd* pItem, int nLeft, int nTop,int nRight, int nBottom)
- {
- if(NULL == pItem)
- return;
- if(!IsWindow(pItem->GetSafeHwnd()))
- return;
- // 取得控制元件區域
- CRect rcWnd;
- pItem->GetWindowRect(&rcWnd);
- ScreenToClient(&rcWnd);
- // 重新計算區域
- rcWnd.top += nTop;
- rcWnd.bottom += nBottom;
- rcWnd.left += nLeft;
- rcWnd.right += nRight;
- // 移動控制元件
- pItem->MoveWindow(rcWnd.left, rcWnd.top, rcWnd.Width(), rcWnd.Height());
- }
為分割窗新增一些自己需要的功能