CMDIChildWnd 类

提供 Windows 多文档界面 (MDI) 子窗口功能,并提供管理窗口的成员。

语法

class CMDIChildWnd : public CFrameWnd

成员

公共构造函数

名称 描述
CMDIChildWnd::CMDIChildWnd 构造 CMDIChildWnd 对象。

公共方法

名称 描述
CMDIChildWnd::Create 创建与 CMDIChildWnd 对象关联的 Windows MDI 子窗口。
CMDIChildWnd::GetMDIFrame 返回 MDI 客户端窗口的父 MDI 框架。
CMDIChildWnd::MDIActivate 激活此 MDI 子窗口。
CMDIChildWnd::MDIDestroy 销毁此 MDI 子窗口。
CMDIChildWnd::MDIMaximize 最大化此 MDI 子窗口。
CMDIChildWnd::MDIRestore 从最大或最小大小还原此 MDI 子窗口。
CMDIChildWnd::SetHandles 设置菜单和加速器资源的句柄。

备注

MDI 子窗口看起来与典型的框架窗口非常类似,只不过 MDI 子窗口显示在 MDI 框架窗口内而不是桌面上。 MDI 子窗口本身没有菜单栏,而是共享 MDI 框架窗口的菜单。 框架会自动更改 MDI 框架菜单以表示当前活动的 MDI 子窗口。

若要为应用程序创建有用的 MDI 子窗口,请从 CMDIChildWnd 派生一个类。 将成员变量添加到该派生类,以存储特定于应用程序的数据。 可派生类中实现消息处理程序成员函数和消息映射,以指定在消息定向到窗口时所发生的情况。

有三种方法可以构造 MDI 子窗口:

  • 使用 Create 直接构造。

  • 使用 LoadFrame 直接构造。

  • 通过文档模板间接构造。

在调用 CreateLoadFrame 之前,必须使用 C++ new 运算符在堆上构造框架窗口对象。 在调用 Create 之前,还可以向 AfxRegisterWndClass 全局函数注册窗口类,以设置框架的图标和类样式。

使用 Create 成员函数将框架的创建参数作为即时自变量传递。

LoadFrame 需要的自变量少于 Create,并且是从资源检索其大部分默认值,包括框架的标题、图标、快捷键表和菜单。 若要由 LoadFrame 访问,所有这些资源都必须具有相同的资源 ID(例如 IDR_MAINFRAME)。

CMDIChildWnd 对象包含视图和文档时,它们由框架间接创建,而不是由程序员直接创建。 CDocTemplate 对象协调框架的创建、包含视图的创建以及视图与相应文档的连接。 CDocTemplate 构造函数的参数指定涉及的三个类(文档、框架和视图)的 CRuntimeClassCRuntimeClass 对象由框架使用,在由用户指定时动态创建新框架(例如,通过使用“新建文件”命令或 MDI“新建窗口”命令)。

必须使用 DECLARE_DYNCREATE 声明派生自 CMDIChildWnd 的框架窗口类,以便上述 RUNTIME_CLASS 机制能够正常工作。

CMDIChildWnd 类从 CFrameWnd 中继承了其大部分默认实现。 有关这些功能的详细列表,请参阅 CFrameWnd 类说明。 CMDIChildWnd 类具有下列附加功能:

  • CMultiDocTemplate 类结合使用时,同一文档模板中的多个 CMDIChildWnd 对象共享同一菜单,从而节省了 Windows 系统资源。

  • 当前活动的 MDI 子窗口菜单完全替换了 MDI 框架窗口的菜单,并且当前活动的 MDI 子窗口的标题被添加到 MDI 框架窗口的标题。 有关与 MDI 框架窗口一起实现的 MDI 子窗口功能的更多示例,请参阅 CMDIFrameWnd 类说明。

请勿使用 C++ delete 运算符销毁框架窗口。 请改用 CWnd::DestroyWindow。 当销毁窗口时,PostNcDestroyCFrameWnd 实现删除 C++ 对象。 当用户关闭框架窗口时,默认 OnClose 处理程序将调用 DestroyWindow

有关 CMDIChildWnd 的详细信息,请参阅框架窗口

继承层次结构

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIChildWnd

要求

标头:afxwin.h

CMDIChildWnd::CMDIChildWnd

调用,用于构造 CMDIChildWnd 对象。

CMDIChildWnd();

备注

调用 Create 以创建可见窗口。

示例

请参阅 CMDIChildWnd::Create 的示例。

CMDIChildWnd::Create

调用此成员函数以创建 Windows MDI 子窗口,并将其附加到 CMDIChildWnd 对象。

virtual BOOL Create(
    LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    const RECT& rect = rectDefault,
    CMDIFrameWnd* pParentWnd = NULL,
    CCreateContext* pContext = NULL);

参数

lpszClassName
指向命名 Windows 类(WNDCLASS 结构)的以 null 终止的字符串。 类名可以是向 AfxRegisterWndClass 全局函数注册的任何名称。 对于标准 CMDIChildWnd,应为 NULL。

lpszWindowName
指向表示窗口名称的以 null 终止的字符串。 用作标题栏的文本。

dwStyle
指定窗口样式特性。 需要 WS_CHILD 样式。

rect
包含窗口的大小和位置。 rectDefault 值允许 Windows 指定新 CMDIChildWnd 的大小和位置。

pParentWnd
指定窗口的父级。 如果为 NULL,则使用主应用程序窗口。

pContext
指定 CCreateContext 结构。 此参数可以为 NULL。

返回值

如果成功,则不为 0;否则为 0。

备注

当前活动的 MDI 子框架窗口可以确定父框架窗口的标题。 可通过关闭子框架窗口的 FWS_ADDTOTITLE 样式位禁用此功能。

框架调用此成员函数以响应用户命令创建子窗口,并且框架使用 pContext 参数将子窗口正确连接到应用程序。 调用 Create 时,pContext 可以为 NULL

示例 1

此示例菜单命令处理程序调用 Create 以创建 MDI 子窗口:

// CMainFrame::OnFileNewCMdiChildWnd() is a menu command handler for the
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a standard Windows MDI child window using
// the registered CMDIChildWnd class.
void CMainFrame::OnFileNewMdiChildWnd()
{
   CMDIChildWnd *pMDIChildWnd = new CMDIChildWnd;
   VERIFY(pMDIChildWnd->Create(
       NULL,                                        // standard CMDIChildWnd class
       _T("My MDIChildWnd"),                        // caption of MDI child window
       WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, // window styles
       rectDefault,                                 // default rectangle size
       this));                                      // parent window; can be NULL

   // the default PostNcDestroy handler will delete this object when destroyed
}

示例 2

示例代码调用 CHelloWnd(一个派生自 CMDIChildWnd 的类)的 Create 方法:

// CMainFrame::OnHello() is a menu command handler for the CMainFrame
// class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a Windows MDI child window using a custom
// window class. The custom window class is registered in
// CHelloWnd::Create(). CHelloWnd is a CMDIChildWnd-derived class.
void CMainFrame::OnHello()
{
   CHelloWnd *pHelloWnd = new CHelloWnd;
   if (!pHelloWnd->Create(_T("Hello"),
                          WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                          rectDefault, this))
      return;

   // the default PostNcDestroy handler will delete this object when destroyed
}

此示例展示了 CHelloWnd 类的 Create 实现:

BOOL CHelloWnd::Create(
    LPCTSTR szTitle,
    LONG style /* = 0 */,
    const RECT &rect /* = rectDefault */,
    CMDIFrameWnd *parent /* = NULL */)
{
   // Setup the shared menu
   SetHandles(::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_HELLO)),
              NULL);

   // Register a custom WndClass and create a window.
   // This must be done because CHelloWnd has a custom icon.
   LPCTSTR lpszHelloClass =
       AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
                           LoadCursor(NULL, IDC_ARROW),
                           (HBRUSH)(COLOR_WINDOW + 1),
                           LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_HELLO)));

   return CMDIChildWnd::Create(lpszHelloClass, szTitle, style, rect, parent);
}

CMDIChildWnd::GetMDIFrame

调用此函数以返回 MDI 父框架。

CMDIFrameWnd* GetMDIFrame();

返回值

指向 MDI 父框架窗口的指针。

备注

返回的框架是从 CMDIChildWnd 中删除的两个父框架,并且是管理 CMDIChildWnd 对象的 MDICLIENT 类型的窗口的父级。 调用 GetParent 成员函数以将 CMDIChildWnd 对象的直接 MDICLIENT 父级作为临时 CWnd 指针返回。

示例

请参阅 CMDIFrameWnd::MDISetMenu 的示例。

CMDIChildWnd::MDIActivate

调用此成员函数以独立于 MDI 框架窗口激活 MDI 子窗口。

void MDIActivate();

备注

当框架变为活动状态时,上次激活的子窗口也将被激活。

示例

请参阅 CMDIFrameWnd::GetWindowMenuPopup 的示例。

CMDIChildWnd::MDIDestroy

调用此成员函数以销毁 MDI 子窗口。

void MDIDestroy();

备注

成员函数从框架窗口中删除子窗口的标题,并停用子窗口。

示例

// CMainFrame::OnCloseWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It closes and destroys the current active MDI child window.
void CMainFrame::OnCloseWindow()
{
   CMDIChildWnd *child = MDIGetActive();
   if (child)
      child->MDIDestroy();
}

CMDIChildWnd::MDIMaximize

调用此成员函数以最大化 MDI 子窗口。

void MDIMaximize();

备注

当子窗口最大化时,Windows 会调整其大小,使其工作区填充框架窗口的工作区。 Windows 将子窗口的控制菜单置于框架的菜单栏中,以便用户可以还原或关闭子窗口,并且它将子窗口的标题添加到框架窗口标题。

示例

// CMainFrame::OnMaximizeWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It maximizes the current active MDI child window.
void CMainFrame::OnMaximizeWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (!maximized))
      child->MDIMaximize(); // or MDIMaximize(child);
}

CMDIChildWnd::MDIRestore

调用此成员函数以从最大或最小大小还原 MDI 子窗口。

void MDIRestore();

示例

// CMainFrame::OnRestoreWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It restores the current active MDI child window from maximized
// or minimized size.
void CMainFrame::OnRestoreWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (maximized || child->IsIconic()))
      child->MDIRestore(); // or MDIRestore(child);
}

CMDIChildWnd::SetHandles

设置菜单和加速器资源的句柄。

void SetHandles(
    HMENU hMenu,
    HACCEL hAccel);

参数

hMenu
菜单资源的句柄。

hAccel
加速器资源的句柄。

注解

调用此函数可设置 MDI 子窗口对象使用的菜单和加速器资源。

另请参阅

MFC 示例 MDI
MFC 示例 MDIDOCVW
MFC 示例 SNAPVW
CFrameWnd 类
层次结构图
CWnd 类
CMDIFrameWnd 类