Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 灰色菜单工具栏图标不会在Vista和WM_DRAWITEM中绘制_C_Winapi_Gdi - Fatal编程技术网

C 灰色菜单工具栏图标不会在Vista和WM_DRAWITEM中绘制

C 灰色菜单工具栏图标不会在Vista和WM_DRAWITEM中绘制,c,winapi,gdi,C,Winapi,Gdi,我的应用程序使用所谓的Internet Explorer风格的菜单栏,即打开多个下拉菜单的工具栏hbmpItem设置为HBMMENU\u CALLBACK,这样我的应用程序就可以在WM\u DRAWITEM上绘制定制的24x24图标 这在Windows XP上运行良好,但在Vista(及以上)上,不会为灰色菜单项绘制图标。然而,处于正常状态的菜单项在Vista上也可以很好地绘制。但当项目处于灰色状态时,Vista上不会绘制任何图标。例外:当用户将鼠标移到灰色项目上时,图标绘制正确。但所有其他灰色

我的应用程序使用所谓的Internet Explorer风格的菜单栏,即打开多个下拉菜单的工具栏
hbmpItem
设置为
HBMMENU\u CALLBACK
,这样我的应用程序就可以在
WM\u DRAWITEM
上绘制定制的24x24图标

这在Windows XP上运行良好,但在Vista(及以上)上,不会为灰色菜单项绘制图标。然而,处于正常状态的菜单项在Vista上也可以很好地绘制。但当项目处于灰色状态时,Vista上不会绘制任何图标。例外:当用户将鼠标移到灰色项目上时,图标绘制正确。但所有其他灰色项目都不会在Vista上绘制

有人知道这种行为的原因吗

以下是我如何在
WM\u DRAWITEM
上绘制图标:

case WM_DRAWITEM:{
DRAWITEMSTRUCT*lpdis=(DRAWITEMSTRUCT*)LPRAM;
如果(!lpdis)返回0;
如果(lpdis->CtlType==ODT\U菜单){
struct menuinfo*mi=(struct menuinfo*)lpdis->itemData;
国际利康;
HICON HICON;
如果(lpdis->itemState&ODS_灰显){
ricon=mi->grayedicon;
}否则{
ricon=mi->icon;
}
如果(!(hIcon=LoadIcon(hInstance\u g,MAKEINTRESOURCE(ricon)))返回0;
DrawIconEx(lpdis->hDC、,
lpdis->rcItem.left-16,
lpdis->rcItem.top+(lpdis->rcItem.bottom-lpdis->rcItem.top-24)/2,
希肯,24,24,
0,空,DI_正常);
破坏图标(hIcon);
返回1;
}
返回0;
}
案例WM_测量项目:{
MEASUREITEMSTRUCT*lpmis=(MEASUREITEMSTRUCT*)LPRAM;
如果(!lpmis)中断;
lpmis->itemWidth+=24;
如果(lpmis->itemHeight<24)lpmis->itemHeight=24;
返回TRUE;
}
谢谢你的帮助

更新

有时会绘制部分图标。这里是一个屏幕截图:您可以看到,撤消、复制、粘贴和删除的图标没有绘制出来。剪切的图标是部分绘制的(它应该是一把完整的剪刀,但实际上只绘制了图标的下半部分)。只有当鼠标光标当前位于重做图标上时,才能正确绘制重做图标。一旦鼠标光标离开项目,图标将立即消失


您是否尝试过调试器来查看何时接收到
WM_DRAWITEM
?是的,它接收得很好,当项目处于灰色状态时也会调用DrawIconEx(),但除非鼠标当前位于灰色项目上方,否则不会显示图标。为什么不使用普通菜单并传递PARGB位图呢。然后系统可以绘制它,并绘制它的主题。你需要为XP使用不同的代码。你有可以在XP上运行的代码,你可以让系统在Vista上正常运行。如果你自己在Vista和更高版本上绘制它,那么你的菜单将看起来完全不合适。为什么不让系统为你做呢?无论如何,是时候停止支持XP了。