以下代码是在视图类CView的OnDraw中的
CWnd *pWnd=AfxGetApp()->GetMainWnd();
CMenu *pMenu=pWnd->GetMenu();
pMenu=pMenu->GetSubMenu(4);
int i=pMenu->SetMenuItemBitmaps(0,MF_BYCOMMAND,&m_CheckBitmap,&m_CheckBitmap);
CString str;
str.Format("%d",i);
AfxMessageBox(str);发现调用SetMenuItemBitMaps()返回的是0;请大家给点意见,不知道哪里出问题了,查了资料都是这样处理的

解决方案 »

  1.   

    函数返回值是TRUE;当时位图没法显示
      

  2.   

    你要先把位图转换成合适的尺寸!使用GetSystemMetrics (以CXMENUCHECK 和CYMENUCHECK作参数)得到所需位图尺寸,
    再使用 StretchBlt 得到所需位图
      

  3.   

    请问 stretchBlt()函数怎么使用,返回值是什么;
    这个函数好像是用来画图的
      

  4.   

    你参考一下:
    这个函数用来把一个64×64的位图压缩成所需大小,返回新位图句柄。
    HBITMAP APIENTRY ShrinkBitmap (
            HWND hwnd,
            HBITMAP hbm)
    {
        HDC     hdc;
        HDC     hmemorydcNew;
        HDC     hmemorydcOld;
        LONG    checkMarkSize;
        HBITMAP hCheckBitmap;
        HBITMAP hOldBitmapSave;
        HBITMAP hNewBitmapSave;    hdc = GetDC (hwnd);    /* Create DCs for the source (old) and target (new) bitmaps */
        hmemorydcNew = CreateCompatibleDC (hdc);
        hmemorydcOld = CreateCompatibleDC (hdc);    /* Determine the dimensions of the default menu check and
         * create a target bitmap of the same dimensions
         */
        checkMarkSize = GetMenuCheckMarkDimensions ();
        hCheckBitmap  = CreateCompatibleBitmap (hdc,
                                                LOWORD (checkMarkSize),
                                                HIWORD (checkMarkSize));    /* Select the source bitmap and the target bitmap into their
         * respective DCs.
         */
        hOldBitmapSave = SelectObject (hmemorydcNew, hCheckBitmap);
        hNewBitmapSave = SelectObject (hmemorydcOld, hbm);    /* Shrink the source bitmap into the target DC */
        StretchBlt (hmemorydcNew,
                    0,
                    0,
                    LOWORD(checkMarkSize),
                    HIWORD(checkMarkSize),
                    hmemorydcOld,
                    0,
                    0,
                    64,
                    64,
                    SRCCOPY);    /* De-select the bitmaps and clean up .. */
        SelectObject (hmemorydcNew, hOldBitmapSave);
        SelectObject (hmemorydcOld, hNewBitmapSave);
        DeleteDC (hmemorydcNew);
        DeleteDC (hmemorydcOld);
        ReleaseDC (hwnd, hdc);    /* .. and return a handle to the target bitmap */
        return hCheckBitmap;
    }以下是调用:    hbmCheckOn  = ShrinkBitmap (hwnd, LoadBitmap (hInst, "checkon"));
        hbmCheckOff = ShrinkBitmap (hwnd, LoadBitmap (hInst, "checkoff"));    /* Set up the user-defined check s */
        SetMenuItemBitmaps (hMenu, 0, MF_BYPOSITION, hbmCheckOff, hbmCheckOn);这里虽然是用的API,但道理是一样的。
      

  5.   

    CWnd *pWnd=AfxGetApp()->GetMainWnd();
    CMenu *pMenu=pWnd->GetMenu();
    pMenu=pMenu->GetSubMenu(4);
    int x=GetSystemMetrics(SM_CXMENUCHECK);
    int y=GetSystemMetrics(SM_CYMENUCHECK);
    //m_CheckBitmap.SetBitmapBits(x*y,m_CheckBitmap.GetSafeHandle());
    CDC dcMemory;
    dcMemory.CreateCompatibleDC(pDC);
    dcMemory.SelectObject(&m_CheckBitmap);
    //pDC->BitBlt(40,40,x,y,&dcMemory,x,y,SRCCOPY);
    dcMemory.StretchBlt(0,0,13,13,&dcMemory,0,0,x,y,SRCCOPY);
    CBitmap *p=dcMemory.SelectObject(&m_Bitmap);
    int i=pMenu->SetMenuItemBitmaps(0,MF_BYPOSITION,p,p);
    CString str;
    str.Format("%d %d %d",i,x,y);
    AfxMessageBox(str);
    这是我修改后的代码,但是不行;我用的是mfc;
      

  6.   

    但是运行的结果是SetMenuItemBitmaps返回TRUE
    我又用过SetBitmapBit()这个函数去改变大小;而且成功了;
      

  7.   

    SetMenuItemBitmaps(ID_,MF_BYCOMMAND,&m_CheckBitmap,&m_CheckBitmap);
    或者
    SetMenuItemBitmaps(0,MF_BYPOSITION,&m_CheckBitmap,&m_CheckBitmap);
    应该可以
      

  8.   

    m_CheckBitmap.SetBitmapBits(x*y,m_CheckBitmap.GetSafeHandle());
    我用这种方式来改变位图的大小;
    再用int i=pMenu->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_CheckBitmap,&m_CheckBitmap);
    可以在菜单显示位图;
    但是位图是不完整的,好像是原图的一个部分,而不是缩放
      

  9.   

    CMenu *pMenu = ::AfxGetMainWnd()->GetMenu();
    pMenu = pMenu->GetSubMenu(0); 
    int cx = GetSystemMetrics(SM_CXMENUCHECK); 
    int cy = GetSystemMetrics(SM_CYMENUCHECK); 
    TRACE2("%d %d\n", cx, cy);  // 载入资源并获取源位图尺寸
    CBitmap bmp;
    VERIFY( bmp.LoadBitmap(IDB_BITMAP1) );
    BITMAP BMP;
    bmp.GetBitmap(&BMP);
    int cxSrc = BMP.bmWidth;
    int cySrc = BMP.bmHeight;
    TRACE2("%d %d\n", cxSrc, cySrc);  // 创建源内存DC,并选择源位图
    CDC * pDC = this->GetDC();
    CDC dcSrc;
    dcSrc.CreateCompatibleDC(pDC); 
    CBitmap * pOldBmp = dcSrc.SelectObject(&bmp); // 初始化用于位图菜单的位图
    m_Bitmap.CreateCompatibleBitmap(pDC, cx, cy); // 创建目标内存DC,并选择位图
    CDC dcDest; 
    dcDest.CreateCompatibleDC(pDC); 
    CBitmap * pOldBmp1 = dcDest.SelectObject(&m_Bitmap);  // 伸缩拷贝位图
    VERIFY( dcDest.StretchBlt(0, 0, cx, cy,
    &dcSrc, 0, 0, cxSrc, cySrc, SRCCOPY) );  pMenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_Bitmap, &m_Bitmap); 
      pMenu->SetMenuItemBitmaps(1, MF_BYPOSITION, &m_Bitmap, &m_Bitmap);  // 选择原设备
    dcDest.SelectObject(pOldBmp1);
    dcSrc.SelectObject(pOldBmp); // 释放DC
    dcDest.DeleteDC();
    dcSrc.DeleteDC();
    ReleaseDC(pDC);
      

  10.   

    你的代码是对的吧!
    我测试了一下:结果返回是1(正确)
             CBitmap m_CheckBitmap;
    m_CheckBitmap.LoadBitmap(IDB_BITMAP1);
    CWnd *pWnd=AfxGetApp()->GetMainWnd(); 
    CMenu *pMenu=pWnd->GetMenu(); 
    pMenu=pMenu->GetSubMenu(1); 
    int i=pMenu->SetMenuItemBitmaps     (0,MF_BYPOSITION,&m_CheckBitmap,&m_CheckBitmap); 
    CString str; 
    str.Format("%d",i); 
    AfxMessageBox(str);