65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL MDI 命令栏控件

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2001年10月4日

3分钟阅读

viewsIcon

113907

downloadIcon

1358

WTL CCommandBarCtrl 的一个扩展,完全支持 MDI。

Sample Image

引言

这是一个 CCommandBarCtrl 扩展,用于完全支持 MDI 架构。

该实现包含三个类

  • CCommandBarCtrl2 管理额外的 MDI 按钮。
  • CMDIChildWindowImpl2 将大小更改转发到 CCommandBarCtrl2
  • CMDIChildWinImplTraits2 实现了一个辅助类,用于在创建新的 MDI 子窗口时保持最大化状态。
类定义和实现在文件 AtlCmdBar2.h 中,该文件包含在演示项目中。

要求

您将需要 WTL 库;可以从 Microsoft 站点下载它们。如果 WTL 库对您没有意义,请参阅 WTL 简介 - 第 1 部分

如何在你的 WTL 应用中使用该控件

首先,在您的应用程序的 .cpp 文件中包含文件 AtlCmdBar2.h。然后,将主框架命令栏 CCommandBarCtrl m_CmdBar; 的定义替换为 mainfrm.h 中的 CCommandBarCtrl2 m_CmdBar;。最后,将 ChildFrm.h 中所有 CMDIChildWindowImpl 的实例替换为 CMDIChildWindowImpl2。就这样。

历史

2001 年 10 月 3 日

首次公开发布。

2001 年 12 月 6 日

添加了折线支持(包括菜单带大小更新)。
修复了 MDI 系统菜单注入。
修复了 MDI 系统菜单的大小问题。
修复了窗口调整大小期间菜单栏的闪烁。

关于实现

额外的 MDI 按钮作为菜单工具栏的自定义绘制按钮实现,并通过 DrawFrameControl() 绘制。这些按钮在 MDI 子窗口的大小更改时添加/删除。此外,必须处理 WM_MDISETMENU 以将 MDI 子窗口菜单插入到新的框架窗口菜单中。

以下是关于最有趣功能的详细说明。

CCommandBarCtrl2

LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

检查 MDI 子窗口是否最大化,并在传递给 CCommandBarCtrl 处理程序之前修改给定的框架菜单。因为菜单工具栏是在默认处理程序中构建的,所以 MDI 按钮在调用后添加。

LRESULT OnMDIChildSized(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)

CMDIChildWindowImpl2 发送的消息,当 MDI 子窗口的大小已更改时。根据 MDI 子窗口的状态相应地修改菜单。如果 MDI 子窗口最大化,则返回值为非零。

LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)

因为当光标移动到 MDI 子窗口图标上时,文件菜单按钮将被绘制为选中状态,所以此处理程序重置当前热项。

void UpdateGapWidth()

更新最后一个菜单项和 MDI 按钮之间的间隙宽度。在命令栏的大小更改时调用。

bool UpdateMenu(bool fShow, HMENU hMenu)

将 MDI 子窗口菜单插入或删除到给定的菜单中。

void UpdateMDIButtons(bool fShow)

将 MDI 按钮添加到菜单工具栏或从菜单工具栏中删除。

void MDIChildChanged(HWND hWndMDIChild)

根据给定 MDI 子窗口的状态修改菜单和工具栏。

CMDIChildWindowImpl2

HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, UINT nMenuID = 0, LPVOID lpCreateParam = NULL)
HWND CreateEx(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)

提供用于防止在创建最大化的 MDI 子窗口期间闪烁。这是通过设置主框架窗口的重绘标志来实现的。

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)

当 MDI 子窗口创建为最大化时,将修改 MDI 客户端窗口边缘,以避免两个窗口都具有 WS_EX_CLIENTEDGE 样式。

LRESULT OnGetIcon(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)

加载窗口类中指定的图标资源。

LRESULT OnWindowPosChanging(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)

将大小更改信号发送到 CCommandBarCtrlImpl2 并在 CMDIChildWinImplTraits2 中设置最大化标志。

CMDIChildWinImplTraits2

static DWORD GetWndStyle(DWORD dwStyle)

如果设置了最大化标志,则添加 WS_MAXIMIZE 样式。

© . All rights reserved.