在MFC对话框界面中添加工具栏,控制条

时间:2021-05-31 00:18:56
文章编号: 141751 - 最后修改: 2006年11月21日 - 修订: 5.1

如何将控制条添加到在 MFC 中的对话框

将控制条添加到对话框中,您必须像通常那样创建控制条,然后进行对话框中的工作区中的为控制栏留出空间。正常运行在控件栏对话框必须复制框架窗口的功能的一些。您是否为可用于控制条 ON_UPDATE_COMMAND_UI 处理程序还需要派生新的控件栏类和处理 WM_IDLEUPDATECMDUI 消息。如果您的对话框不是您的应用程序的主窗口,还需要修改其父框架窗口,将传递到对话框上 WM_IDLEUPDATECMDUI 消息框的控制条。

要腾出对话框中的工作区中为控件条,请按照下列步骤在您的对话框 OnInitDialog() 函数中:

  1. 创建控制条。
  2. 算出控制条将会通过使用 reposQuery 选项的 RepositionBars() 多少空间:
          CRect rcClientStart;
          CRect rcClientNow;
          GetClientRect(rcClientStart);
          RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                         AFX_IDW_CONTROLBAR_LAST,
                         0, reposQuery, rcClientNow);
    						
  3. 在您的共享空间顶部或左侧的客户端区域的控制条所使用的帐户对话框中移动所有控件。如果您的对话框中包含一个菜单,您还需要考虑所使用的菜单空间:
          CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                           rcClientNow.top - rcClientStart.top);
    
          CRect  rcChild;
          CWnd* pwndChild = GetWindow(GW_CHILD);
          while (pwndChild)
          {
             pwndChild->GetWindowRect(rcChild);
             ScreenToClient(rcChild);
             rcChild.OffsetRect(ptOffset);
             pwndChild->MoveWindow(rcChild, FALSE);
             pwndChild = pwndChild->GetNextWindow();
          }
    						
  4. 增加对话框框窗口尺寸的控制条所用的空间量:
          CRect rcWindow;
          GetWindowRect(rcWindow);
          rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
          rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
          MoveWindow(rcWindow, FALSE);
    						
  5. 将使用 RepositionBars() 控制条。
用来更新状态条的第一个窗格菜单项文本,则必须处理 WM_MENUSELECT、 WM_ENTERIDLE 和 WM_SETMESSAGESTRING 您对话框类中。您需要复制该 CFrameWnd 的功能的这些消息处理程序。请参阅 CModelessMain 类中的这些消息处理程序示例的示例程序。

若要以便 ON_UPDATE_COMMAND_UI 处理程序来处理其他状态栏窗格和工具栏按钮,您必须新控件条类派生的类,并为 WM_IDLEUPDATECMDUI 实现消息处理程序。这是必要的因为 OnUpdateCmdUI() 的默认控件条实现假定父窗口是框架窗口。但是,它不会执行任何操作,但传递父窗口鼠标指针到只需要一个 CCmdTarget 指针的函数。因此,您可以暂时告诉 OnUpdateCmdUI() 则赋予了其父窗口鼠标指针是指向符合编译器要求 CFrameWnd 指针。下面是一个示例:
      LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam,
                                             LPARAM lParam)
      {
         if (IsWindowVisible())
         {
            CFrameWnd* pParent = (CFrameWnd*)GetParent();
            if (pParent)
               OnUpdateCmdUI(pParent, (BOOL)wParam);
         }
         return 0L;
      }
				
WM_IDLEUPDATECMDUI 邮件传递到对话框,而不在主窗口,在框架窗口类中保存对话框指针和在该类中创建 WM_IDLEUPDATECMDUI 处理程序。将该处理程序应 WM_IDLEUPDATECMDUI 消息发送到对话框子窗口使用 CWnd::SendMessageToDescendants()。然后,执行处理的框架窗口中消息的默认值。

这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2 当用于
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 企业版
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 4.2 专业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
在一个 Microsoft 基础类 (MFC) 应用程序中可以将控制条如状态栏和工具栏附加到框架窗口。 许多应用程序的一个简单的对话框基于框的用户界面是足够。 MFC 不提供将控制条添加到对话框的内置支持。

DLGCBR32 是一个示例应用程序演示如何将一个状态栏和工具栏添加到对话框。 在另外它演示了若干与将无模式对话框用作 MFC 应用程序主窗口有关的方法。 可从 Microsoft 下载中心下载下列文件:

visual c + + 6.0

折叠此图像 展开此图像
在MFC对话框界面中添加工具栏,控制条
立即下载 Dlgcbr32.exe () http://download.microsoft.com/download/vc60pro/sample14/1/nt4/en-us/dlgcbr32.exe
有关如何下载 Microsoft 支持文件,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591  (http://support.microsoft.com/kb/119591/EN-US/) 如何从在线服务获得 Microsoft 支持文件
Microsoft 扫描此文件的病毒。 Microsoft 使用最新的病毒检测软件,可在该文件被发送的日期。 该文件存储在安全性得到增强的服务器上,有助于防止对该文件进行任何未经授权的更改。