求救--自绘菜单问题

叶恭介叶恭介 2011-07-21 05:14:45


每一位进来的,先说声:谢谢..

自绘菜单,本来完成的差不多了,像DrawItem,MeasureItem写好了,能显示了菜单.

可是问题来了,当我右键打开菜单时,它只绘制了第一个,要鼠标经过其它菜单才会显示。我希望最终的效果是图1。我自己想了一下,是因为一开始时只DrawItem第一个,其它的没有绘制..不知道怎么搞,跪求指导.

下面呈现DrawItem函数:
void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

CDC dc;

dc.Attach(lpDrawItemStruct->hDC);//CDC类里的ATTACH函数用于把HDC转换成CDC

UINT state=lpDrawItemStruct->itemState;

CRect MenuRect = lpDrawItemStruct->rcItem;

CRect ColorRect = MenuRect;
ColorRect.right = ColorRect.right - 30;

COLORREF MenuColor;

CString str;

switch( lpDrawItemStruct->itemID)
{
case ID_MENU_RED:
MenuColor = RGB( 255, 0, 0 );
str = _T("红色");
break;
case ID_MENU_ORANGE:
MenuColor = RGB( 240, 133, 25 );
str = _T("橙色");
break;
case ID_MENU_YELLOW:
MenuColor = RGB( 255,255, 0 );
str = _T("黄色");
break;
case ID_MENU_GREEN:
MenuColor = RGB( 0, 255, 0 );
str = _T("绿色");
break;
case ID_MENU_BLUE:
MenuColor = RGB( 0, 0, 255 );
str = _T("蓝色");
break;
case ID_MENU_BLACK:
MenuColor = RGB( 0, 0, 0 );
str = _T("黑色");
break;
case ID_MENU_PURPLE:
MenuColor = RGB( 160, 32, 240 );
str = _T("紫色");
break;
case ID_MENU_WHITE:
MenuColor = RGB( 255, 255, 255 );
str = _T("白色");
break;
default:
MenuColor = RGB( 255, 255, 255 );
str = _T("");
break;
}

CBrush ColorBrush( MenuColor );

CBrush *pOldBrush = dc.SelectObject( &ColorBrush );

dc.RoundRect( ColorRect, CPoint( 5, 5 ) );

dc.SetTextColor(RGB(0,0,0));

dc.SetBkMode(TRANSPARENT);//设置文字背景透明

dc.DrawText(str,&MenuRect,DT_RIGHT|DT_VCENTER|DT_SINGLELINE);//输出按钮文本

dc.DeleteDC();

}
...全文
146 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pop1210 的回复:]
The application should restore all graphics device interface (GDI) objects selected for the display context supplied in lpDrawItemStruct before the termination of this member function. [from MSDN--CMe……
[/Quote]

更改回去也不行,继续等..人也憔悴
lslsyqyq 2011-07-22
  • 打赏
  • 举报
回复
不涉及机密的话 完整代码传来看看
pop1210 2011-07-22
  • 打赏
  • 举报
回复
The application should restore all graphics device interface (GDI) objects selected for the display context supplied in lpDrawItemStruct before the termination of this member function. [from MSDN--CMenu::DrawItem]
所以建议lz先把对DC的更改恢复回去(CBrush、BKMode)...
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 buyong 的回复:]
switch( lpDrawItemStruct->itemID)
我觉得这句有问题,应该是第一个确实是菜单ID,但是后面的就不是菜单ID了。
我觉得好像这个函数里不用switch
我也不太懂,给你个链接吧
http://www.codeproject.com/KB/menus/bcmenu.aspx
[/Quote]
谢谢了,还没看,现还没解决。switch( lpDrawItemStruct->itemID)这句应该没问题,去掉Switch后,直接用MenuColor = RGB( 255, 0, 0 );也是出现一样的问题.
buyong 2011-07-22
  • 打赏
  • 举报
回复
switch( lpDrawItemStruct->itemID)
我觉得这句有问题,应该是第一个确实是菜单ID,但是后面的就不是菜单ID了。
我觉得好像这个函数里不用switch
我也不太懂,给你个链接吧
http://www.codeproject.com/KB/menus/bcmenu.aspx
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lslsyqyq 的回复:]
把default部分去掉试试
[/Quote]

去掉不行..
lslsyqyq 2011-07-22
  • 打赏
  • 举报
回复
把default部分去掉试试
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ycf8788 的回复:]
菜单关闭再打开,刚开始还是只显示一个吗?绘图的部分只有在DrawItem ?
[/Quote]
是啊,要经过其它菜单才显示。绘图也只有DrawItem。
不二星空 2011-07-22
  • 打赏
  • 举报
回复
菜单关闭再打开,刚开始还是只显示一个吗?绘图的部分只有在DrawItem ?
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ndy_w 的回复:]
wm_InitMenuPopup处理了没?
[/Quote]

没有啊。那要怎么写呢,是在这消息里对菜单先绘一遍吗?
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
是因为右键打开菜单时DrawItem只调用一次(为红色ID,所以只绘制一个)。而参考其它的类似程序,DrawItem则根据菜单个数,调用多次,现不知道哪里没写好啊.天啊
叶恭介叶恭介 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lslsyqyq 的回复:]
不涉及机密的话 完整代码传来看看
[/Quote]

代码已上传到115网盘,大家可以下载来分析,是用VS2008 MFC做的 http://u.115.com/file/bhzcbn70
ndy_w 2011-07-21
  • 打赏
  • 举报
回复
wm_InitMenuPopup处理了没?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧