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

为 WindowsXP 和 Windows Vista 的标准菜单添加图标

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (5投票s)

2007年11月24日

2分钟阅读

viewsIcon

26629

downloadIcon

672

为 WindowsXP 和 Windows Vista 的标准菜单添加图标

Screenshot - MenuIcon1.png Screenshot - MenuIcon2.png

引言

这个项目简化了在 WindowsXP 和 Windows Vista C++ 项目中使用菜单图标的过程。该项目包含一个名为 'CMenuIcon' 的小类,可以快速集成到任何 Windows C++ 项目中。

背景

在互联网上有很多关于如何将图标添加到菜单的示例。然而,大多数示例都基于所有者绘制菜单。这种方法的缺点是,每次 Windows 发布新版本时,菜单的样式都会很快过时。此外,对于一个小应用程序来说,用于所有者绘制菜单的类有点过于复杂。这些是我寻找一种易于使用且代码库小的解决方案的原因。

我在互联网上找到了两个可以做到这一点的示例,但是这些示例仅适用于 WindowsXP 或 Windows Vista。我的类 'CMenuIcon' 将这两个示例合并到一个类中。

使用代码

该类可以分为三个步骤集成到您的 C++ 项目中。

第一步是创建 CMenuIcon 类的实例,并添加命令 ID 和图标(位图)的组合。这可以在应用程序的初始化步骤中完成。建议仅使用一个 CMenuIcon 类实例,以便拥有命令和图标的全局组合。

//Create an instance of the CMenuIcon class

oMenuIcon = new CMenuIcon(hInstance);

//Add the icon-command combinations

oMenuIcon->AddMenuCommandIcon(ID_FILE_NEW, IDB_NEW, RGB(255,0,255));
oMenuIcon->AddMenuCommandIcon(ID_FILE_OPEN, IDB_OPEN, RGB(255,0,255));
oMenuIcon->AddMenuCommandIcon(ID_FILE_SAVE, IDB_SAVE, RGB(255,0,255));

第二步是处理菜单。必须处理菜单,因为图标必须与菜单关联。您无需更改菜单资源。该类将处理此操作。

//Process the menu

hCurrentMenu = GetMenu(hWnd);
oMenuIcon->ProcessMenu(hCurrentMenu);

最后一步是添加到您的 WndProc 中。

//This is an addition for ownerdrawing icons in WindowsXP

if (oMenuIcon->WndProc(hWnd, message, wParam, lParam, iReturn)) return iReturn;

关注点

将此类视为一个概念验证。还有很多可能的增强功能。例如,我的类使用 GDI+ 将 RGB 位图转换为 ARGB 位图,以便在 Windows Vista 中使用。这可以更快且更简洁地完成。

历史

版本 1.0:初始发布。

© . All rights reserved.