WTL MDI 命令栏控件





4.00/5 (1投票)
2001年10月4日
3分钟阅读

113907

1358
WTL CCommandBarCtrl 的一个扩展,
引言
这是一个 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
样式。