最近在研究菜单编程,前几天看到一个菜单自绘的代码,研究了2-3天了,还是一头雾水,真是愚钝啊,因此想请各位大神指点下: 首先从CMenu类派生一个CMenuEx类,在CMenuEx中重写DrawItem和MeasureItem方法(这个我大概懂其原因,自绘出我们想要的菜单样式)void CMenuEx::DrawItem(LPDRAWITEMSTRUCT lpDIS) //LPDRAWITEMSTRUCT结构体中包含了菜单的各种信息及状态
{ CDC dc;
CRect rect(lpDIS->rcItem);
dc.Attach(lpDIS->hDC);
lpItem =(LPMENUITEM)lpDIS->itemData;
.............................. //将LPDRAWITEMSTRUCT结构体中菜单的信息保存到变量中,备用 if(lpDIS->itemState & ODS_SELECTED)
dc.SetTextColor(rgb);
else
dc.SetTextColor(rgb);//如果菜单项被(没)选中,设置其显示形状及颜色 CBrush brush(rgb);
dc.FillRect(&rect, &brush); //菜单项的背景色
dc.SetBkMode(TRANSPARENT); //设定显示模式
.......................... //设置其他(没)选中时的各种外观
}
void CMenuEx::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemWidth = xxx
lpMIS->itemHeight =xxx //MSDN上将主要是这两个参数设置
} 然后再CMainFrame中添加DrawItem和MeasureItem方法(这个我大概也懂原因,菜单属于Frame窗口,让Frame窗口调用我们自 绘的菜单显示) void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
//int nIDCtl这个参数不知道是什么意思
{m_menu.DrawItem(lpDrawItemStruct);}
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{m_menu.MeasureItem(lpMeasureItemStruct);}这段就不懂其意义了,哦,这段貌似在最前面:
void CMyMenu::AlterStyle(int lay,CMyMenu *menu) /*菜单的精华*/(别人的注释)
{ for(UINT ui=0; ui<menu->GetMenuItemCount(); ui++)
{
.............................
.............................
menu->GetMenuString(ui, pItem->strText, MF_BYPOSITION);
pItem->uID =menu->GetMenuItemID(ui);
if(pItem->uID == -1 && pItem->nLay==0) //在此进行重点判断 顶级的弹出处理(别人的注释)
{
menu->ModifyMenu(ui, MF_BYPOSITION|MF_OWNERDRAW, 0, (TCHAR*) pItem);
}
else //普通弹出式处理(别人的注释)
{
menu->ModifyMenu(ui, MF_BYPOSITION|MF_OWNERDRAW, pItem->uID, (TCHAR*) pItem);
}
。。
。。 在自学中,稍微有点乱,遇到自绘问题总是看着代码研究几天才略懂12,新来的,分数不多,求高手详细指点下,越细越好,感激不尽!
{ CDC dc;
CRect rect(lpDIS->rcItem);
dc.Attach(lpDIS->hDC);
lpItem =(LPMENUITEM)lpDIS->itemData;
.............................. //将LPDRAWITEMSTRUCT结构体中菜单的信息保存到变量中,备用 if(lpDIS->itemState & ODS_SELECTED)
dc.SetTextColor(rgb);
else
dc.SetTextColor(rgb);//如果菜单项被(没)选中,设置其显示形状及颜色 CBrush brush(rgb);
dc.FillRect(&rect, &brush); //菜单项的背景色
dc.SetBkMode(TRANSPARENT); //设定显示模式
.......................... //设置其他(没)选中时的各种外观
}
void CMenuEx::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemWidth = xxx
lpMIS->itemHeight =xxx //MSDN上将主要是这两个参数设置
} 然后再CMainFrame中添加DrawItem和MeasureItem方法(这个我大概也懂原因,菜单属于Frame窗口,让Frame窗口调用我们自 绘的菜单显示) void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
//int nIDCtl这个参数不知道是什么意思
{m_menu.DrawItem(lpDrawItemStruct);}
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{m_menu.MeasureItem(lpMeasureItemStruct);}这段就不懂其意义了,哦,这段貌似在最前面:
void CMyMenu::AlterStyle(int lay,CMyMenu *menu) /*菜单的精华*/(别人的注释)
{ for(UINT ui=0; ui<menu->GetMenuItemCount(); ui++)
{
.............................
.............................
menu->GetMenuString(ui, pItem->strText, MF_BYPOSITION);
pItem->uID =menu->GetMenuItemID(ui);
if(pItem->uID == -1 && pItem->nLay==0) //在此进行重点判断 顶级的弹出处理(别人的注释)
{
menu->ModifyMenu(ui, MF_BYPOSITION|MF_OWNERDRAW, 0, (TCHAR*) pItem);
}
else //普通弹出式处理(别人的注释)
{
menu->ModifyMenu(ui, MF_BYPOSITION|MF_OWNERDRAW, pItem->uID, (TCHAR*) pItem);
}
。。
。。 在自学中,稍微有点乱,遇到自绘问题总是看着代码研究几天才略懂12,新来的,分数不多,求高手详细指点下,越细越好,感激不尽!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货