以下代码是在视图类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;请大家给点意见,不知道哪里出问题了,查了资料都是这样处理的
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;请大家给点意见,不知道哪里出问题了,查了资料都是这样处理的
再使用 StretchBlt 得到所需位图
这个函数好像是用来画图的
这个函数用来把一个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,但道理是一样的。
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;
我又用过SetBitmapBit()这个函数去改变大小;而且成功了;
或者
SetMenuItemBitmaps(0,MF_BYPOSITION,&m_CheckBitmap,&m_CheckBitmap);
应该可以
我用这种方式来改变位图的大小;
再用int i=pMenu->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_CheckBitmap,&m_CheckBitmap);
可以在菜单显示位图;
但是位图是不完整的,好像是原图的一个部分,而不是缩放
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);
我测试了一下:结果返回是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);