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
直接构造。通过文档模板间接构造。
在调用 Create
或 LoadFrame
之前,必须使用 C++ new
运算符在堆上构造框架窗口对象。 在调用 Create
之前,还可以向 AfxRegisterWndClass 全局函数注册窗口类,以设置框架的图标和类样式。
使用 Create
成员函数将框架的创建参数作为即时自变量传递。
LoadFrame
需要的自变量少于 Create
,并且是从资源检索其大部分默认值,包括框架的标题、图标、快捷键表和菜单。 若要由 LoadFrame
访问,所有这些资源都必须具有相同的资源 ID(例如 IDR_MAINFRAME)。
当 CMDIChildWnd
对象包含视图和文档时,它们由框架间接创建,而不是由程序员直接创建。 CDocTemplate
对象协调框架的创建、包含视图的创建以及视图与相应文档的连接。 CDocTemplate
构造函数的参数指定涉及的三个类(文档、框架和视图)的 CRuntimeClass
。 CRuntimeClass
对象由框架使用,在由用户指定时动态创建新框架(例如,通过使用“新建文件”命令或 MDI“新建窗口”命令)。
必须使用 DECLARE_DYNCREATE 声明派生自 CMDIChildWnd
的框架窗口类,以便上述 RUNTIME_CLASS 机制能够正常工作。
CMDIChildWnd
类从 CFrameWnd
中继承了其大部分默认实现。 有关这些功能的详细列表,请参阅 CFrameWnd 类说明。 CMDIChildWnd
类具有下列附加功能:
与
CMultiDocTemplate
类结合使用时,同一文档模板中的多个CMDIChildWnd
对象共享同一菜单,从而节省了 Windows 系统资源。当前活动的 MDI 子窗口菜单完全替换了 MDI 框架窗口的菜单,并且当前活动的 MDI 子窗口的标题被添加到 MDI 框架窗口的标题。 有关与 MDI 框架窗口一起实现的 MDI 子窗口功能的更多示例,请参阅
CMDIFrameWnd
类说明。
请勿使用 C++ delete
运算符销毁框架窗口。 请改用 CWnd::DestroyWindow
。 当销毁窗口时,PostNcDestroy
的 CFrameWnd
实现删除 C++ 对象。 当用户关闭框架窗口时,默认 OnClose
处理程序将调用 DestroyWindow
。
有关 CMDIChildWnd
的详细信息,请参阅框架窗口。
继承层次结构
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 类