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

2016-01-29 11:59 82 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

C++ At Work 专栏...
计算MDI子窗口数,仅显示文件夹的打开对话框

原著:Paul DiLascia
翻译:NorthTibet

下载源代码:CAtWork0506.exe (195KB)
原文出处:Counting MDI Children, Browsing for Folders

本文发布后内容有更新,详情参见文章的“编辑更新”


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


我正在写一个 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)枚举列表中的窗口:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
CWinList& wl = theApp.m_winlist;for (CWinList::iterator it=wl.begin(); it!=wl.end(); it++) {    CWnd* pWnd = *it;    // do something}

我写了一个小程序 WinCount,它用 CWinList 计数 MDI 子窗口。运行画面如 Figure 2 所示。


Figure 2 计算子窗口的 WinCount

  WinCount 右下角有一个状态栏窗格显示打开的窗口数量,该程序的“关于”对话框列出了窗口的标题。这个“关于”对话框就是用 CWinList::iterator 来产生它的反馈消息;该状态栏窗格是一个标准的 MFC 指示器窗格,使用 ON_UPDATE_COMMAND_UI 来显示视图数量。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
void CMainFrame::OnUpdateWinIndicator(CCmdUI* pCmdUI){    CString s;    s.Format(_T("Open:%d"), theApp.m_winlist.size());    pCmdUI-SetText(s);}

  List::size 是 STL list 方法,返回列表中的项数,注意在 WinCount 中,视图与子窗口是一对一的,所以计算出的视图数就是 MDI 子窗口的数量。如果你的 MDI 是更复杂的多视图子框架,那么你必须重写 CMDIChildWnd 以便在派生类中进行 Add/Remove 调用,或者你可以用其它窗口类,保证它在每个子框架中只出现一次。你可以随便使用多少个 CWinList 来跟踪不同的窗口类。
  我知道我们处在一个令人兴奋得 MFC、.NET 和 GUI 框架时代,很多事情都可以让它们代劳——但不要忘了如何使用基本的数据结构!
  [编辑更新 - 5/9/2005:在 Figure 1 所示的 CWinList 原创实现里,它是从 list<CWnd* 派生而来的。然而,一般情况下,从 STL 容器派生被认为是一种糟糕的做法,因为这样做搞不好会导致不可预知的结果。本文最终下载的代码是一个新版本的 CWinList,使用 typedef。需要用 push_back 和 remove 来代替 Add 和 Remove。]


我正在用 Visual Studio .NET 和 MFC 做一个程序。在我的程序里,用户要选择一个文件夹,并在其中拷贝文件。我可以调用 OpenFileDialog 让用户选择

来源:http://www.tulaoshi.com/n/20160129/1484119.html

延伸阅读
VisualBasic提供了过时的FileCopy语句.问题是使用该函数时并不显示文件复制对话框,也就是说,当拷贝一个大文件时,用户看不到Windows的标准 文件复制对话框,无法从进度条上判断当前复制的进度.那么,如何做到这一点呢?请看下面: PublicTypeSHFILEOPSTRUCT hWndAsLong wFuncAsLong pFromAsString pToAsString fFl...
标签: autocad教程
在执行AutoCAD命令的过程中,用户与AutoCAD之间主要是通过文本窗口和对话框来进行人机交互。 2.3.1 使用文本窗口 AutoCAD的文本窗口与AutoCAD窗口相对独立,用户可通过如下方式来显示该窗口: (1) 在AutoCAD中按F2键 (2) 选择菜单【View(视图)】→【Display(显示)】→【Text Window(文本窗口)】 (3) 在命令...
问:程序是基于对话框的,我显示两个对话框,一个在另一个后面,下面是我的做法: CMyApp::InitInstance () { ... CMyDialog1 dlg1; m_hMainWnd = &dlg1; int result = dlg1.DoModal (); CMyDialog2 dlg2; result = dlg2.DoModal (); ... } 在上面的代码中,首先一个对话框得到了适当地调用...
标签: 办公软件
    Excel 2000 新增的在对话框中输入区域引用可以折叠的按钮,这样用户在工作表上选定所需的区域时,对话框就不会阻挡视线。对这类对话框的操作是,在折叠按钮上单击可以将其折叠,再次单击则返回到对话框,图2-9和图2-10分别显示了折叠前后的效果。
获取静态控件文本的方法:GetDlgItem函数获得对话框中控件的指针,然后调用GetWindowText获得文本。注意:静态控件的属性必须将Notify选为可能。同理:SetWindowText可以指定文本。 获取编辑框内容:GetDlgItem(ID)-GetWindowText(); 字符内容转换为数值:atoi()把字符串转换为数值;同理:数字到字符串itoa(); GetDlgItemText(ID)可以完成...

经验教程

649

收藏

63
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部