本文共 2880 字,大约阅读时间需要 9 分钟。
MFC 分割窗口 是软件开发 中 常见 的 UI 组织方式。本节将介绍如何 在 MFC 应用程序 中 实现 分割窗口。
分割窗口 即将一个 大型 窗口 分割 为 多个 小窗口(窗格),每个窗格 中 可以 显示 视图 或者 多个视图。MFC 提供了 CSplitterWnd 类来 实现 分割窗口功能。分割窗口 有 两种 模式:动态分割窗口 和 静态分割窗口。
动态分割窗口 通常用于 创建 与同一 文档 相关 的 多个 视图。这些视图 通常 是同一 类型 的 视图,能够 在 用户编辑 文档 的不同 部分 时 提供 方便。例如,Word 2007 中 的 拆分 功能 就 是 动态分割窗口 的 应用。
动态分割窗口 的 特点:
静态分割窗口 是更 常见 的分割方式。软件启动 时,窗口 通常 会 默认 被 静态 分割 为 多个 小窗格。静态分割窗口 的 窗格 数量 和 顺序 在 创建 时 就 被 确定,用户 无法 更改。
静态分割窗口 的 特点:
CSplitterWnd 类 是 MFC 中 实现 分割窗口功能 的核心 类。它 提供了 创建 动态分割窗口 和 静态分割窗口 的 方法。以下 是 CSplitterWnd 类 的 常用 成员函数:
用于 创建 动态分割窗口:
virtual BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST);
参数说明:
pParentWnd:分割窗口 的 父框架窗口。nMaxRows:分割窗口 的 最大 行数,不能超过 2。nMaxCols:分割窗口 的 最大 列数,不能超过 2。sizeMin:窗格 的 最小 显示 大小。pContext:指向 CCreateContext 结构的 指针。dwStyle:窗口 风格,支持多种 组合。nID:分割窗口 的 ID。用于 创建 静态分割窗口:
virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);
参数说明:
pParentWnd:分割窗口 的 父框架窗口。nRows:行数,不能超过 16。nCols:列数,不能超过 16。dwStyle:窗口 风格。nID:分割窗口 的 ID。用于 为静态分割窗口 创建窗格视图:
virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext);
参数说明:
row:窗格 在 分割窗口 中 的 行位置。col:窗格 在 分割窗口 中 的 列位置。pViewClass:窗格 的 视图 类。sizeInit:窗格 的 初始 大小。pContext:指向 CCreateContext 结构的 指针。动态分割窗口 的 创建 步骤 为:
CFrameWnd::OnCreateClient 成员函数。CFrameWnd::OnCreateClient 函数 中 调用 CSplitterWnd 成员对象 的 Create 方法。以下 是 一个 动态分割窗口 的 实例:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){ // 创建 动态分割窗口,两 行 两 列 return m_wndSplitter.Create(this, 2, 2, CSize(10, 10), pContext);} 静态分割窗口 的 创建 步骤 为:
CFrameWnd::OnCreateClient 成员函数。CFrameWnd::OnCreateClient 函数 中 调用 CSplitterWnd 成员对象 的 CreateStatic 方法,并 为每个 窗格 创建 视图。以下 是 一个 静态分割窗口 的 实例:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){ CRect rc; GetClientRect(rc); if (!m_wndSplitter.CreateStatic(this, 2, 1)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height() / 2), pContext)) return FALSE; if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height() / 2), pContext)) return FALSE; return TRUE;} 如果 需要 在 某个 窗格 中嵌入 分割窗口,只需 为父窗格 所在的 CSplitterWnd 对象 创建 分割窗口即可。分割窗口 的 内容 就 讲到 这里。
以上 就是关于 MFC 分割窗口 的 完整 教程。
转载地址:http://aqpk.baihongyu.com/