【问题标题】:C++ Win32 Menubar being drawn over owner-drawn menu itemsC++ Win32 菜单栏被绘制在所有者绘制的菜单项上
【发布时间】:2021-11-24 22:46:30
【问题描述】:

我有 2 个自绘菜单项,当我启动程序时,我只看到一个自绘菜单项;第一个。它正在被绘制,除了菜单栏被绘制在未在第一个位置绘制的所有其他菜单项上,如果我将鼠标悬停在第二个所有者绘制的菜单项上或以它绘制的任何其他方式更新它,如果我随后与主窗口(ig Resizing)实际上更新了菜单栏,它继续绘制任何其他未在第一个位置绘制的所有者绘制的项目。

问题:如何让菜单栏不在菜单项上绘制,

// 测量项目:

VOID MeasureMenuItem(LPMEASUREITEMSTRUCT ItemStruct)
{
    ItemStruct->itemWidth = 50;
    ItemStruct->itemHeight = 10;
    return;
}

// 绘制项目:

VOID DrawMenuItem(LPDRAWITEMSTRUCT ItemStruct)
{
    HDC hDC = ItemStruct->hDC;

    SelectObject(hDC, GetStockObject(DC_PEN));
    SelectObject(hDC, GetStockObject(DC_BRUSH));
    SetBkMode(hDC, TRANSPARENT);
    if (ItemStruct->itemState & ODS_HOTLIGHT)
    {
        SetDCPenColor(hDC, RGB(20, 20, 20));
        SetDCBrushColor(hDC, RGB(20, 20, 20));
        SetTextColor(hDC, RGB(255, 255, 255));
    }
    else
    {
        SetDCPenColor(hDC, RGB(70, 70, 70));
        SetDCBrushColor(hDC, RGB(70, 70, 70));
        SetTextColor(hDC, RGB(255, 255, 255));
    }
    Rectangle(hDC, ItemStruct->rcItem.left, ItemStruct->rcItem.top, ItemStruct->rcItem.right, ItemStruct->rcItem.bottom);

    DrawText(hDC, (LPCWSTR)ItemStruct->itemData, -1, &ItemStruct->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    ReleaseDC(MainWindow, hDC);
    return;
}

// 菜单

    HMENU Bar = CreateMenu();
    HMENU File = CreateMenu();
    HMENU Edit = CreateMenu();
    AppendMenu(Bar, MF_OWNERDRAW, (UINT_PTR)File, L"File");
    AppendMenu(Bar, MF_OWNERDRAW, (UINT_PTR)Edit, L"Edit");
    MENUINFO Info;
    Info.cbSize = sizeof(Info);
    Info.fMask = MIM_BACKGROUND;
    Info.hbrBack = (HBRUSH)CreateSolidBrush(RGB(100, 100, 100));
    SetMenuInfo(Bar, &Info);
    SetMenu(MainWindow, Bar);

【问题讨论】:

    标签: c++ winapi menu drawing ownerdrawn


    【解决方案1】:

    为什么DrawMenuItem() 调用ReleaseDC(MainWindow, hDC);?那不属于那里,摆脱它。你没有从Get(Window)DC() 获得HDC,所以你不拥有它,也不应该试图释放它。

    此外,您不会取消选择您在HDC 中选择的对象。您需要恢复您替换的原始对象。

    试试这个:

    VOID DrawMenuItem(LPDRAWITEMSTRUCT ItemStruct)
    {
        HDC hDC = ItemStruct->hDC;
    
        HPEN oldPen = (HPEN) SelectObject(hDC, GetStockObject(DC_PEN));
        HBRUSH oldBrush = (HBRUSH) SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetBkMode(hDC, TRANSPARENT);
    
        if (ItemStruct->itemState & ODS_HOTLIGHT)
        {
            SetDCPenColor(hDC, RGB(20, 20, 20));
            SetDCBrushColor(hDC, RGB(20, 20, 20));
            SetTextColor(hDC, RGB(255, 255, 255));
        }
        else
        {
            SetDCPenColor(hDC, RGB(70, 70, 70));
            SetDCBrushColor(hDC, RGB(70, 70, 70));
            SetTextColor(hDC, RGB(255, 255, 255));
        }
    
        Rectangle(hDC, ItemStruct->rcItem.left, ItemStruct->rcItem.top, ItemStruct->rcItem.right, ItemStruct->rcItem.bottom);
    
        DrawText(hDC, (LPCWSTR)ItemStruct->itemData, -1, &ItemStruct->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    
        SelectObject(hDC, oldPen);
        SelectObject(hDC, oldBrush); 
    }
    

    【讨论】:

    • 非常感谢伙计!我开始郁闷想不通了,我之所以不做这些只是我的愚蠢,我的坏哈哈,欠你一个!
    猜你喜欢
    • 2023-03-12
    • 2012-11-19
    • 2011-02-12
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多