木兮₀₃₂₁ 2019-04-21 23:38 采纳率: 50%
浏览 184

Win32 menu 项使用bitmap为什么显示确实黑色块?



void AddHelpToSys(HINSTANCE hInstance,HWND hwnd)
{
    HMENU hMenu;
    HBITMAP hBitmap;
    hMenu=GetSystemMenu(hwnd, FALSE);
    hBitmap=LoadBitmap(hInstance, TEXT("bighelp"));

    AppendMenu(hMenu, MF_SEPARATOR, 0, 0);

    AppendMenu(hMenu, MF_BITMAP, ID_HELP, (PTSTR)(LONG)hBitmap);
}

HBITMAP StretchBitmap(HBITMAP hBitmap1)
{
    BITMAP bm1,bm2;
    HBITMAP hBitmap2;
    int cxChar, cyChar;
    HDC hdc, hdcMem1,hdcMem2;

    // ´´½¨É豸»·¾³
    hdc = CreateIC(TEXT("DISPLAY"), 0, 0, 0);
    hdcMem1 = CreateCompatibleDC(hdc);
    hdcMem2 = CreateCompatibleDC(hdc);
    DeleteDC(hdc);
    //»ñµÃ¶Ô»°¿ò»ù±¾µ¥Ôª£¬in pixel
    cxChar = LOWORD(GetDialogBaseUnits());
    cyChar = HIWORD(GetDialogBaseUnits());

    //»ñµÃhbitmap1µÄÊý¾Ý
    GetObject(hBitmap1, sizeof(BITMAP), &bm1);
    bm2 = bm1;
    //ÉèÖÃbm2µÄ´óС
    bm2.bmWidth = (cxChar*bm2.bmWidth) / 4;
    bm2.bmHeight=(cyChar*bm2.bmHeight) / 8;
    bm2.bmWidthBytes = ((bm2.bmWidth + 15) / 16) * 2;
    //´´½¨hbitmap2
    hBitmap2=CreateBitmapIndirect(&bm2);
    //¼ÓÔØbitmapµ½É豸»·¾³
    SelectObject(hdcMem1, hBitmap1);
    SelectObject(hdc, hBitmap2);

    StretchBlt(hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight, hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, SRCCOPY);
    DeleteObject(hBitmap1);
    DeleteDC(hdcMem1);
    DeleteDC(hdcMem2);
    return hBitmap2;
}

HMENU CreateMyMenu(HINSTANCE hinst)
{
    HBITMAP hBitmap;
    HMENU hMenu, hMenuPopup;
    int i;
    //´´½¨Ò»¸ö¿ÕµÄMenu
    hMenu = CreateMenu();

    hMenuPopup = LoadMenu(hinst, TEXT("MenuFile"));
    hBitmap = StretchBitmap(LoadBitmap(hinst, TEXT("FILE")));
    AppendMenu(hMenu, MF_BITMAP | MF_POPUP, (int)hMenuPopup, (PTSTR)(LONG)hBitmap);
    hMenuPopup = LoadMenu(hinst, TEXT("MenuEdit"));
    hBitmap = StretchBitmap(LoadBitmap(hinst, TEXT("EDIT")));
    AppendMenu(hMenu, MF_POPUP | MF_BITMAP, (int)hMenuPopup, (PTSTR)(LONG)hBitmap);

    hMenuPopup = CreateMenu();
    for (i=0;i<3;i++)
    {
        hBitmap = GetBitmapFont(i);
        AppendMenu(hMenuPopup, MF_BITMAP, ID_FONT_COUR + i, (PTSTR)(LONG)hBitmap);
    }
    hBitmap = StretchBitmap(LoadBitmap(hinst, TEXT("FONT")));
    AppendMenu(hMenu, MF_BITMAP | MF_POPUP, (int)hMenuPopup, (PTSTR)(LONG)hBitmap);
    return hMenu;

}


HBITMAP GetBitmapFont(int i)
{
    static TCHAR *szFaceName[3] = { TEXT("Courier New"),TEXT("Arial"),TEXT("Times New Roman") };

    HBITMAP hBitmap;
    HDC hdc, hdcMem;
    HFONT hFont;
    SIZE size;
    TEXTMETRIC tm;

    hdc = CreateIC(TEXT("DISPLAY"), 0, 0, 0);
    GetTextMetrics(hdc, &tm);

    hdcMem = CreateCompatibleDC(hdc);
    hFont = CreateFont(2 * tm.tmHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, szFaceName[i]);

    hFont = (HFONT)SelectObject(hdcMem, hFont);
    GetTextExtentPoint32(hdcMem, szFaceName[i], lstrlen(szFaceName[i]), &size);
    hBitmap = CreateBitmap(size.cx, size.cy, 1, 1, NULL);
    SelectObject(hdcMem, hBitmap);

    TextOut(hdcMem, 0, 0, szFaceName[i], lstrlen(szFaceName[i]));
    DeleteObject(SelectObject(hdcMem, hFont));
    DeleteDC(hdcMem);
    DeleteDC(hdc);
    return hBitmap;
}






在CreateMyMenu函数中,加载bitmap 最后显示确实黑色块为什么?

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP
    • ¥15 Python turtle 画图
    • ¥15 stm32开发clion时遇到的编译问题
    • ¥15 lna设计 源简并电感型共源放大器
    • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)