1. VS2010新建MFC单文档项目
2. 添加基于 CSplitterWnd 基类的类CSplitter类(不直接使用CSplitterWnd成员变量,方便对分割线的消息事件处理)
class CSplitter : public CSplitterWnd { DECLARE_DYNAMIC(CSplitter) public: CSplitter(); virtual ~CSplitter(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); };
其中OnLButtonDown和OnMouseMove函数可以修改你对分割条的消息响应。如屏蔽鼠标左键和移动消息可如下:
void CSplitter::OnLButtonDown(UINT nFlags, CPoint point) { return; //CSplitterWnd::OnLButtonDown(nFlags, point); } void CSplitter::OnMouseMove(UINT nFlags, CPoint point) { return; //CSplitterWnd::OnMouseMove(nFlags, point); }还可以在构造函数中对分割线进行宽度等配置:
CSplitter::CSplitter() { m_cxSplitter = 1; m_cySplitter = 1; m_cxSplitterGap = 1; m_cySplitterGap = 1; m_cxBorder = 0; m_cyBorder = 0; }
public: CSplitter m_wndSplitter;
添加Dialog,Border为none,Style为Child(否则报错viewform.cpp line:91的Debug Assertion Failed错误),并创建基于CFormView基类的类ProcessArea
class ProcessArea : public CFormView { DECLARE_DYNCREATE(ProcessArea) public: ProcessArea(); // 动态创建所使用的受保护的构造函数 virtual ~ProcessArea(); public: enum { IDD = IDD_PROCESS_AREA }; #ifdef _DEBUG virtual void AssertValid() const; ……
4. 为CMainFrame类添加OnCreateClient函数(类向导)
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: 在此添加专用代码和/或调用基类 if(!m_wndSplitter.CreateStatic(this,1,2)) { return FALSE; } CRect rect; GetClientRect(&rect); if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(ProcessArea),CSize(400,rect.Height()),pContext)|| !m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CCADProjectView), CSize(rect.Width() - 400,rect.Height()),pContext)) { return FALSE; } SetActiveView((CCADProjectView*)m_wndSplitter.GetPane(0,0)); //指定类视图 m_bInitSplitter = TRUE; return TRUE; //return CFrameWndEx::OnCreateClient(lpcs, pContext);//导致窗口重绘 }CreateStatic函数创建一个一行两列的静态窗口,CreateView函数给以上创建的对应窗口根据对应的类创建需要的窗口,SetActiveView函数设定默认激活的窗口。效果如下图(tabctrl控件是后来加),如果需要CSplitter类型的成员变量,再对需要分割的窗体进行拆分。(详情)
5. 放大缩小自动调整:放大缩小时,可能会出现分割的窗口消失或不完全显示问题,需要进行调整。
添加WM_SIZE消息,重新按要求布局分割的窗口。
void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWndEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 CRect rect; GetClientRect(&rect); if (m_bInitSplitter && nType != SIZE_MINIMIZED) { m_wndSplitter.SetRowInfo(0, cy, 0); m_wndSplitter.SetColumnInfo(0, rect.Width() - 400, 100); m_wndSplitter.SetColumnInfo(1, 400, 100); m_wndSplitter.RecalcLayout(); } }详情