文章编号: 141751 - 最后修改: 2006年11月21日 - 修订: 5.1
如何将控制条添加到在 MFC 中的对话框
将控制条添加到对话框中,您必须像通常那样创建控制条,然后进行对话框中的工作区中的为控制栏留出空间。正常运行在控件栏对话框必须复制框架窗口的功能的一些。您是否为可用于控制条 ON_UPDATE_COMMAND_UI 处理程序还需要派生新的控件栏类和处理 WM_IDLEUPDATECMDUI 消息。如果您的对话框不是您的应用程序的主窗口,还需要修改其父框架窗口,将传递到对话框上 WM_IDLEUPDATECMDUI 消息框的控制条。
要腾出对话框中的工作区中为控件条,请按照下列步骤在您的对话框 OnInitDialog() 函数中:
若要以便 ON_UPDATE_COMMAND_UI 处理程序来处理其他状态栏窗格和工具栏按钮,您必须新控件条类派生的类,并为 WM_IDLEUPDATECMDUI 实现消息处理程序。这是必要的因为 OnUpdateCmdUI() 的默认控件条实现假定父窗口是框架窗口。但是,它不会执行任何操作,但传递父窗口鼠标指针到只需要一个 CCmdTarget 指针的函数。因此,您可以暂时告诉 OnUpdateCmdUI() 则赋予了其父窗口鼠标指针是指向符合编译器要求 CFrameWnd 指针。下面是一个示例:
WM_IDLEUPDATECMDUI 邮件传递到对话框,而不在主窗口,在框架窗口类中保存对话框指针和在该类中创建 WM_IDLEUPDATECMDUI 处理程序。将该处理程序应 WM_IDLEUPDATECMDUI 消息发送到对话框子窗口使用 CWnd::SendMessageToDescendants()。然后,执行处理的框架窗口中消息的默认值。
要腾出对话框中的工作区中为控件条,请按照下列步骤在您的对话框 OnInitDialog() 函数中:
- 创建控制条。
- 算出控制条将会通过使用 reposQuery 选项的 RepositionBars() 多少空间:
CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);
- 在您的共享空间顶部或左侧的客户端区域的控制条所使用的帐户对话框中移动所有控件。如果您的对话框中包含一个菜单,您还需要考虑所使用的菜单空间:
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(); }
- 增加对话框框窗口尺寸的控制条所用的空间量:
CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE);
- 将使用 RepositionBars() 控制条。
若要以便 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;
}
这篇文章中的信息适用于:
DLGCBR32 是一个示例应用程序演示如何将一个状态栏和工具栏添加到对话框。 在另外它演示了若干与将无模式对话框用作 MFC 应用程序主窗口有关的方法。 可从 Microsoft 下载中心下载下列文件:
visual c + + 6.0
折叠此图像