XP系统下的菜单是不使用主题的,所以不在讨论范围。在VISTA\WIN7下的菜单使用了系统主题文件,所以只有使用了这样的系统的朋友才有测试环境。现在有无数疑问如下:
1、系统默认菜单的单个菜单项的高度怎么获得?
我在WIN7下测试,用tHeight = GetSystemMetrics(SM_CYMENU)获得的高度比实际的小。
用GetThemePartSize hTheme, 0, MENU_POPUPITEM, MBI_NORMAL, lpRect, TS_TRUE, lpSize2,然后取tHeight = lpSize2.CY,失败,值为0.2、WIN7默认主题菜单背景似乎是使用了背景图,我用
DrawThemeBackground hTheme, MeDIS.hdc, MENU_POPUPBACKGROUND, MBI_NORMAL, MeDIS.rcItem, MeDIS.rcItem
并没有绘制出菜单背景来。3、(该问题可能无解)假设我有一下拉菜单,其中一部分菜单是自绘风格,另外一些不是自绘的。此时,系统在对付这些不是自绘的这部分菜单的时候,也没有按照主题绘制,而是类似XP的样式。希望各位踊跃发言、讨论。若解决,可另开贴送分。谢谢
1、系统默认菜单的单个菜单项的高度怎么获得?
我在WIN7下测试,用tHeight = GetSystemMetrics(SM_CYMENU)获得的高度比实际的小。
用GetThemePartSize hTheme, 0, MENU_POPUPITEM, MBI_NORMAL, lpRect, TS_TRUE, lpSize2,然后取tHeight = lpSize2.CY,失败,值为0.2、WIN7默认主题菜单背景似乎是使用了背景图,我用
DrawThemeBackground hTheme, MeDIS.hdc, MENU_POPUPBACKGROUND, MBI_NORMAL, MeDIS.rcItem, MeDIS.rcItem
并没有绘制出菜单背景来。3、(该问题可能无解)假设我有一下拉菜单,其中一部分菜单是自绘风格,另外一些不是自绘的。此时,系统在对付这些不是自绘的这部分菜单的时候,也没有按照主题绘制,而是类似XP的样式。希望各位踊跃发言、讨论。若解决,可另开贴送分。谢谢
SM_CYMENU 是菜单栏的高度,单个菜单没有统一高度(比如分割线和普通菜单项高度就不一样),用 GetMenuItemRect() 取。可以用下面的工具检查一下当前主题是否有相应类的定义。
http://www.vbaccelerator.com/home/VB/Code/Libraries/XP_Visual_Styles/Drawing_with_XP_Visual_Styles/article.asp
这里的21楼的代码是可以绘制的,这个代码是vbaccelerator的改进版本。我自己做的时候,用
DrawThemeBackground hTheme, MeDIS.hdc, MENU_POPUPITEM, MBI_HOT, MeDIS.rcItem, MeDIS.rcItem这样的代码是可以绘制出菜单选中状态的。说明已经部分成功了,但就是还存在一些问题
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
回头再看改进的代码。
对应实现在
'IUxThemeHook.cls
Private Sub IAPIHook_OnHook(...)
...
Case hTheme_Menu
...
Case 14 'vista:menu item
附近检查一下,是否你调用有问题的没有相应的实现?
即菜单高度,还包括图标区域的宽度等在OpenThemeData成功的前提下,GetThemePartSize和GetThemeInt都失败了……,这样一来,就无法继续下去了
你就当作每个菜单项的高度都不同。
b)反过来说,既然 OwnerDraw,样式(高度)自己决定。
www.vbaccelerator.com 有绘制图形菜单的,可以在 Win7 下试试。