vc网络视频会议系统设计(需求分析+总体设计+系统设计+参考文献) 第3页
int m_MenuID;//菜单标识,-2顶层菜单,-1弹出式菜单,0分隔条,命令ID普通菜单
};
(3)为CMyMenu类添加3个成员变量,如下:
UINT m_index;
UINT m_imageindex;
CMenuItemInfo Menus[100];//记录菜单项信息
(4)添加ResetMenuStyle方法,该方法用于修改菜单项的风格,使菜单项具有重绘功能,设置菜单项信息。在ResetMenuStyle方法中利用递归的方式遍历菜单资源中的每个菜单项,代码如下:
void CMyMenu::ResetMenuStyle(HMENU m_hmenu,BOOL IsTop)
{
CMenu* m_pMenu;//菜单指针
m_pMenu = CMenu::FromHandle(m_hmenu);//根据句柄获取菜单指针
if (m_pMenu!= NULL)
{
for (UINT i = 0;i <m_pMenu->GetMenuItemCount();i++)
{
int m = m_pMenu->GetMenuItemID(i);//获取菜单项ID
Menus[m_index].m_MenuID = m;// m_pMenu->GetMenuItemID(i); //如果为弹出式菜单,返回-1,
//分隔条返回0,普通菜单,返回ID
if ( ((Menus[m_index].m_MenuID<0) &&IsTop== TRUE)) //顶层菜单
Menus[m_index].m_MenuID = -2;
Menus[m_index].m_Iconindex = -1;
m_pMenu->GetMenuString(i,Menus[m_index].m_Text,MF_BYPOSITION);//获取菜单项文本
m_pMenu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION |MF_STRING,
Menus[m_index].m_MenuID,(LPCTSTR)(&Menus[m_index]));//修改菜单信息
if (Menus[m_index].m_MenuID>0)
{
Menus[m_index].m_Iconindex = m_imageindex;//设置菜单项图标索引
m_imageindex += 1;
}
m_index+=1;
CMenu* m_pSubmenu = m_pMenu->GetSubMenu(i);//获取子菜单
if (m_pSubmenu )//如果存在子菜单,利用递归修改其风格
{
ResetMenuStyle(m_pSubmenu->GetSafeHmenu());
}
}
}
}
(5)添加AttachMenu方法,该方法将菜单与指定的句柄关联,并调用ResetMenuStyle方法修改菜单风格。代码如下:
/***************************************
函 数 名: AttachMenu
作 用: 将菜单资源与菜单类关联,改变菜单风格
参 数: m_hmenu是菜单资源句柄
返 回 值: 执行成功返回值为true,否则出错
***************************************/
bool CMyMenu::AttachMenu(HMENU m_hmenu)
{
Attach(m_hmenu);
ResetMenuStyle(m_hmenu,true);
return true;
}
(6)改写菜单项的MeasureItem方法,设置顶层菜单、弹出示菜单、分隔条、普通菜单的大小。代码如下:
//根据菜单的风格确定菜单项的大小
void CMyMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
{
lpMeasureItemStruct->itemHeight = 26;
lpMeasureItemStruct->itemWidth = 130;
UINT m_type;
毕业论文http://www.751com.cn/ 论文网http://www.lwfree.com/
break;
}
case -1: //弹出式菜单
{
lpMeasureItemStruct->itemWidth = ((CMenuItemInfo*)
(lpMeasureItemStruct->itemData))->m_Text.GetLength()*10;
break;
}
case 0: //分隔条
{
lpMeasureItemStruct->itemHeight = 10;
break;
}
default: //普通菜单项
{
break;
}
}
}
(7)改写菜单项的DrawItem方法,修改绘制菜单。在该方法中调用了多个自定义的方法,这些方法用户绘制菜单的图标、文本、背景颜色等,由于篇幅关系,具体代码请参考光盘。
//重新绘制菜单项
void CMyMenu::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if (lpDrawItemStruct->CtlType = ODT_MENU)
{
if(lpDrawItemStruct->itemData == NULL) return;
CDC* pdc = CDC::FromHandle(lpDrawItemStruct->hDC);
pdc->SetBkMode(TRANSPARENT);
CRect m_rect (lpDrawItemStruct->rcItem);
CString m_text = ((CMenuItemInfo*)(lpDrawItemStruct->itemData))->m_Text;
UINT m_MenuID,m_State,m_imageid;
m_imageid = ((CMenuItemInfo*)(lpDrawItemStruct->itemData))->m_Iconindex;
m_State = lpDrawItemStruct->itemState;
m_MenuID = ((CMenuItemInfo*)(lpDrawItemStruct->itemData))->m_MenuID;
switch(m_MenuID)
{
case -2:
{
DrawTopMenu(pdc,m_rect,m_State&ODS_SELECTED);
DrawText(pdc,m_rect,m_text);
break;
}
case -1:
{
if (m_State&ODS_SELECTED)
DrawBestRect(pdc,m_rect,0xff00ff,0xfffff,false);
else
DrawTopMenu(pdc,m_rect,false);
DrawText(pdc,m_rect,m_text); break;
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页