灰色菜单工具栏图标不会在Vista上绘制,而是在WM_DRAWITEM中绘制

时间:2015-06-21 13:17:08

标签: c winapi gdi

我的应用程序使用所谓的Internet Explorer样式菜单栏,即打开多个下拉菜单的工具栏。 hbmpItem设置为HBMMENU_CALLBACK,以便我的应用可以在WM_DRAWITEM上绘制自定义的24x24图标。

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

有没有人知道这种行为可能是什么原因?

以下是我在WM_DRAWITEM上绘制图标的方式:

case WM_DRAWITEM: {
    DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT *) lParam;

    if(!lpdis) return 0;

    if(lpdis->CtlType == ODT_MENU) {

        struct menuinfo *mi = (struct menuinfo *) lpdis->itemData;
        int ricon;
        HICON hIcon;

        if(lpdis->itemState & ODS_GRAYED) {
            ricon = mi->grayedicon;
        } else {
            ricon = mi->icon;
        }

        if(!(hIcon = LoadIcon(hInstance_g, MAKEINTRESOURCE(ricon)))) return 0;

        DrawIconEx(lpdis->hDC,
            lpdis->rcItem.left - 16,
            lpdis->rcItem.top + (lpdis->rcItem.bottom - lpdis->rcItem.top - 24) / 2,
            hIcon, 24, 24,
            0, NULL, DI_NORMAL);

        DestroyIcon(hIcon);         

        return 1;
    }

    return 0;   
    }

case WM_MEASUREITEM: {
    MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT *) lParam;

    if(!lpmis) break;

    lpmis->itemWidth += 24;
    if(lpmis->itemHeight < 24) lpmis->itemHeight = 24;
    return TRUE;    
    }

感谢您的帮助!

更新

有时会绘制部分图标。以下是截图:您可以看到撤消,复制,粘贴和删除的图标未被绘制。切割的图标部分绘制(它应该是一把完整的剪刀,但实际上只绘制了图标的下半部分)。重做的图标只是因为鼠标光标当前在它上面而正确绘制。只要鼠标光标离开项目,图标就会立即消失。

Screenshot

0 个答案:

没有答案