比如绘制系统菜单:在绘制"还原"."最大化"."最小化"."关闭"几个菜单项目的时候,他们带有位图.初始化:::ModifyMenu(hMenu,
item,
itemInfo.fState | MF_BYPOSITION | MF_OWNERDRAW,
itemID,
(LPCTSTR)item);在OnMeasureItem设置高度,没有接收到这几个带有位图标记的菜单的OnMeasureItem函数,请问:需要怎么设置才能修改其高度,又怎么在OnDrawItem中绘制位图标记?谢谢....
item,
itemInfo.fState | MF_BYPOSITION | MF_OWNERDRAW,
itemID,
(LPCTSTR)item);在OnMeasureItem设置高度,没有接收到这几个带有位图标记的菜单的OnMeasureItem函数,请问:需要怎么设置才能修改其高度,又怎么在OnDrawItem中绘制位图标记?谢谢....
绘制位图就是创建一个内存DC,将要绘制的位图选入,然后BitBlt贴到DRAWITEMSTRUCT结构中的dc上。
除非是重载控件截获右键菜单消息, 但还是不能修改系统菜单啊,不可能每个系统菜单都自己画一个吧.
请求高手解答!
系统菜单收不到OnMeasureItem消息, 如果能收到那肯定可以改变大小,
我试的是这样的, 弹出系统菜单的时候收不到OnMeasureItem消息(没办法修改宽度,还有"最大化","最小化",两个高度也变小了.), 但OnDrawItem是可以收到的,
只不过是系统图标没有办法获得,不可能自己找图标吧?
我最近就在做这个问题, 一直没有解决.
如果楼上的有什么好方法可以说出来,
如果楼上的亲自试过的话可以把代码贴出来,除非是你还有什么其它的方法没有说出来.
我看楼主的问题也是和我的问题一样,没有解决
谢谢你的指点, 我的代码如下:void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
// TODO: Add your message handler code here
if(bSysMenu)
{
CMenu *pMenu = CMenu::FromHandle(pPopupMenu->GetSafeHmenu());
if(pMenu != NULL)
{
UINT nState;
for(UINT i = 0; i < pMenu->GetMenuItemCount(); i ++)
{
LPCOOLMENU lpMenu = new COOLMENU;
lpMenu->nMenuID = pMenu->GetMenuItemID(i);
nState=pMenu->GetMenuState(i,MF_BYPOSITION);
pMenu->GetMenuString(i, lpMenu->strText, MF_BYPOSITION); pMenu->ModifyMenu(i, nState|MF_BYPOSITION | MF_OWNERDRAW, lpMenu->nMenuID, LPCTSTR(lpMenu));
}
}
}确实是可以收到WM_MEASUREITEM消息, 这一点是我以前没有弄清楚,
但是收到的只有"移动","大小",这两个ITEM的消息, 正如楼主说的 "还原"."最大化"."最小化"."关闭"几个菜单项是收不到WM_MEASUREITEM消息的,所以高度和前面的图标没办法设置, 我想这几个菜单一定是很特殊,系统自己处理了,所以这个方法对一般菜单还行,对系统菜单就不一定行了!
对于"还原"."最大化"."最小化"."关闭"这几个带bitmap图标的Item,需要把bitmap去掉再设置MF_OWNERDRAW。可以先GetMenuItemInfo,把hbmpItem赋值为NULL,再SetMenuItemInfo。LZ的帖子标题上打着[加急]字样,怎么发完帖子就见不到人了?莫非LS就是LZ?
我在上面的代码pMenu->ModifyMenu(i, nState|MF_BYPOSITION | MF_OWNERDRAW, lpMenu->nMenuID, LPCTSTR(lpMenu)); 前加了
MENUITEMINFO mii = {0};
pMenu->GetMenuItemInfo(i,&mii);
if(mii.hbmpItem != NULL)
mii.hbmpItem = NULL; SetMenuItemInfo(pMenu->GetSafeHmenu(), i, true, &mii);结果发现mii.hbmpItem都是NULL, 这是怎么回事, 是不是我GetMenuItemInfo用的不对?
怎样才能获得系统菜单前面的图标数据呢?
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA; pMenu->GetMenuItemInfo(i,&mii);
if(mii.hbmpItem != NULL)
{
CBitmap *bm;
CImageList *pImageList;
bm = new CBitmap;
// Bit= (HBITMAP)LoadImage(NULL,"test.bmp" ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
bm->Attach(mii.hbmpItem);
pImageList = new CImageList;
pImageList->Create(16, 16, ILC_MASK, 1, 1);
pImageList->Add(bm, RGB(192,192,192));
int C=pImageList->GetImageCount(); mii.hbmpItem = NULL;
}mii.fType = MFT_STRING;
mii.cch = sizeof(lpMenu->strText);
mii.dwTypeData = lpMenu->strText.GetBuffer(0);SetMenuItemInfo(pMenu->GetSafeHmenu(), i, true, &mii);
经过上面的修改,系统菜单的长度和宽度都可以自己控制了,if(mii.hbmpItem != NULL) 也能进去了,但是前面的图标获取不到,
int C=pImageList->GetImageCount();
返回的是0,
如果用加载自己的BMP图片是可以的,我就想知道系统菜单是不是获取不到图片还是我获取的方法不对?
出来隔壁帮帮我啦.
地址:<菜单的问题>