WEB开发网
开发学院软件开发VC 计算MDI子窗口数,仅显示文件夹的打开对话框 阅读

计算MDI子窗口数,仅显示文件夹的打开对话框

 2006-07-19 11:29:33 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 我正在写一个 MFC 的多文档(MDI)应用,在父窗口中,计算MDI子窗口数,仅显示文件夹的打开对话框,我如何检查所有的MDI子窗口是否都已经关闭?如果都关闭了,那么我想在我的主窗口激活一个窗格,因为 CWinList 是从 list<CWnd*> 派生而来的,所以处理过程

本文示例源代码或素材下载

我正在写一个 MFC 的多文档(MDI)应用。在父窗口中,我如何检查所有的MDI子窗口是否都已经关闭?如果都关闭了,那么我想在我的主窗口激活一个窗格。

Ramesh

Windows 和 MFC 不提供任何专门的函数来获取 MDI 子窗口数,但实现你想要的这个功能很容易。实际上,我可以想到半打方法来解决这个问题。你可以捕获 WM_CREATE/WM_DESTROY 消息;可以用 SetWindowsHookEx 安装 Windows 钩子;可以用 EnumWindows 来枚举子窗口并计算它的数量。但最简单的解决方法常常是最容易被忽视的方法。

这个问题说白了,无非就是——应用程序使用 MDI 界面或者其它你自己设计的多窗口用户界面——说到底就是一个窗口列表。Figure 1 展示的是一个基于标准模板库(STL) list 的类,很难说这样封装是否值得,但我只是觉得 Windows 程序员在代码中敲入 “push_back”太不可思议。CWinList 使你用“Add”取而代之。为了使用 CWinList,只需要在某个地方添加一个全局实例,既可以是一个全局变量,也可以是主应用程序类中的一个数据成员:

class CMyApp : public CWinApp {
public:
  CWinList m_winlist; // 打开的恶窗口列表
};

为了跟踪子窗口,你只需要在创建或销毁子窗口时对此列表进行添加或删除操作既可。显然做这件事情的最佳地点是在拟跟踪窗口的构造函数和析构函数中:

CMyView::CMyView()
{
  theApp.m_winlist.Add(this);
}
CMyView::~CMyView()
{
  theApp.m_winlist.Remove(this);
}

除此之外,你还可以从 OnCreate 和 OnDestroy 处理函数中调用 Add 和 Remove,以保证你的列表之包含具备有效的 HWNDs 的窗口对象。因为 CWinList 是从 list<CWnd*> 派生而来的,所以处理过程中可以充分借助 STL的威力。例如,你可以用 STL list 的迭代器(iterator)枚举列表中的窗口:

1 2 3 4 5 6  下一页

Tags:计算 MDI 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接