怎样将工具栏的图片加载到菜单项中? 只能是自绘实现吧,或者直接贴图 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把图片加入到工具栏的菜单中//CMenuItemInfo结构用于记录菜单项信息struct CMenuItemInfo{ CString m_ItemText;//菜单项文本 int m_IconIndex;//菜单项索引 int m_ItemID;//菜单标记 -2顶层菜单,-1弹出式菜单,0分隔条,其他普通菜单};//定义成员变量int m_index; //临时索引 int m_iconindex; //菜单项图标索引 CImageList m_imagelist;//存储菜单项图标//向CIconMenu菜单中添加AttatchMenu方法BOOL CIconMenu::AttatchMenu(HMENU m_hmenu){ this->Attach(m_hmenu); return TRUE;}//codego.net/tags/7/1///编写CIconMenu类构造函数CIconMenu::CIconMenu(){ m_index= 0; m_iconindex= 0; //创建图像列表 m_imagelist.Create(16,16,ILC_COLOR24|ILC_MASK,0,0); //添加图标 m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON4)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON5)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON6)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON7)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON8)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON9)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON10));}//向CIconMenu中添加修改菜单信息项并存储在成员变量中BOOL CIconMenu::ChangeMenuItem(CMenu* m_menu,BOOL m_Toped){ if (m_menu != NULL) { int m_itemcount = m_menu->GetMenuItemCount(); for (int i=0;i<m_itemcount;i++) { m_menu->GetMenuString(i,m_ItemLists[m_index].m_ItemText,MF_BYPOSITION); int m_itemID = m_menu->GetMenuItemID(i); if (m_itemID==-1 && m_Toped) { m_itemID = -2;//顶层菜单 }; m_ItemLists[m_index].m_ItemID = m_itemID; if (m_itemID>0) { m_ItemLists[m_index].m_IconIndex= m_iconindex; m_iconindex+=1; } m_menu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION |MF_STRING,m_ItemLists[m_index].m_ItemID,(LPSTR)&(m_ItemLists[m_index])); m_index+=1; CMenu* m_subMenu = m_menu->GetSubMenu(i); if (m_subMenu) { ChangeMenuItem(m_subMenu); } } } return TRUE ;}//改写菜单类的虚拟方法void CIconMenu::MeasureItem( LPMEASUREITEMSTRUCT lpStruct ){ if (lpStruct->CtlType==ODT_MENU) { lpStruct->itemHeight = ITEMHEIGHT; lpStruct->itemWidth = ITEMWIDTH; CMenuItemInfo* m_iteminfo; m_iteminfo = (CMenuItemInfo*)lpStruct->itemData; lpStruct->itemWidth = ((CMenuItemInfo*)lpStruct->itemData)->m_ItemText.GetLength()*10; switch(m_iteminfo->m_ItemID) { case 0: //分隔条 { lpStruct->itemHeight = 1; break; } } }}//添加成员函数用于绘制菜单项文本void CIconMenu::DrawItemText(CDC* m_pdc,LPSTR str,CRect m_rect){ m_rect.DeflateRect(20,0); m_pdc->DrawText(str,m_rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);}//绘制菜单项图标void CIconMenu::DrawMenuIcon(CDC* m_pdc,CRect m_rect,int m_icon ){ m_imagelist.Draw(m_pdc,m_icon,CPoint(m_rect.left+2,m_rect.top+4),ILD_TRANSPARENT);}//绘制分隔条void CIconMenu::DrawSeparater(CDC* m_pdc,CRect m_rect){ if (m_pdc != NULL) { m_pdc->Draw3dRect(m_rect,RGB(255,0,0),RGB(0,0,255)); }}//绘制顶层菜单void CIconMenu::DrawTopMenu(CDC* m_pdc,CRect m_rect,BOOL m_selected ){ if (m_selected) { m_pdc->SelectStockObject(BLACK_PEN); m_pdc->Rectangle(&m_rect); m_rect.DeflateRect(1,1); m_pdc->FillSolidRect(m_rect,RGB(150, 185, 255)); } else { CRect rect; AfxGetMainWnd()->GetClientRect(rect); rect.top = m_rect.top; rect.bottom = m_rect.bottom; rect.left= 360; rect.right +=4; //CRect c_rect(m_rect); m_pdc->FillSolidRect(&rect,RGB(200,187, 255)); m_pdc->FillSolidRect(&m_rect,RGB(200,187, 255)); //m_pdc->SelectStockObject(BLACK_PEN); //m_pdc->FillSolidRect(m_rect,RGB(100, 185, 255)); }}//改写菜单中的虚拟方法、绘制不同状态的菜单void CIconMenu::DrawItem( LPDRAWITEMSTRUCT lpStruct ){ if (lpStruct->CtlType==ODT_MENU) { if(lpStruct->itemData == NULL) return; unsigned int m_state = lpStruct->itemState; CDC* m_dc = CDC::FromHandle(lpStruct->hDC); //m_dc.Attach(lpStruct->hDC); CString str = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemText; LPSTR m_str = str.GetBuffer(str.GetLength()); int m_itemID = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemID; int m_itemicon = ((CMenuItemInfo*)(lpStruct->itemData))->m_IconIndex; CRect m_rect = lpStruct->rcItem; m_dc->SetBkMode(TRANSPARENT); switch(m_itemID) { case -2: { DrawTopMenu(m_dc,m_rect,(m_state&ODS_SELECTED)||(m_state&0x0040)); //0x0040 ==ODS_HOTLIGHT DrawItemText(m_dc,m_str,m_rect); break; } case -1: { DrawItemText(m_dc,m_str,m_rect); break; } case 0: { DrawSeparater(m_dc,m_rect); break; } default: { DrawComMenu(m_dc,m_rect,0xfaa0,0xf00ff,m_state&ODS_SELECTED); DrawItemText(m_dc,m_str,m_rect); DrawMenuIcon(m_dc,m_rect,m_itemicon); break; } }//框架中引入头文件、调用对象的菜单方法void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { m_menu.MeasureItem(lpMeasureItemStruct); // CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);}//关联菜单窗口m_menu.AttatchMenu(this->GetMenu()->GetSafeHmenu());m_menu.ChangeMenuItem(&m_menu,TRUE); TCP/IP服务端多线程,给客户端发心跳包。 RECT区域是指那个区域? 用过xtreme或是cjlib的进 如何发送paint消息 有没有用openssl做过邮件客户端的老大,我肯了好几天了一点门道都没有摸出来,求助啊 问个UNICODE的问题 急..大家帮帮忙..如何用ADO执行这个.sql文件里的内容.解决的给分100 有关CTreeCtrl的问题,请高手指点 求助(关于CComboBox。。。 高分求用vc编写的电脑故障智能排除专家系统的源代码 vs2008调用matlab中神经网络工具箱 usb虚拟的串口怎样达到最大通信速度
//CMenuItemInfo结构用于记录菜单项信息
struct CMenuItemInfo
{
CString m_ItemText;//菜单项文本
int m_IconIndex;//菜单项索引
int m_ItemID;//菜单标记 -2顶层菜单,-1弹出式菜单,0分隔条,其他普通菜单
};
//定义成员变量
int m_index; //临时索引
int m_iconindex; //菜单项图标索引
CImageList m_imagelist;//存储菜单项图标
//向CIconMenu菜单中添加AttatchMenu方法
BOOL CIconMenu::AttatchMenu(HMENU m_hmenu)
{
this->Attach(m_hmenu);
return TRUE;
}//codego.net/tags/7/1/
//编写CIconMenu类构造函数
CIconMenu::CIconMenu()
{
m_index= 0;
m_iconindex= 0; //创建图像列表
m_imagelist.Create(16,16,ILC_COLOR24|ILC_MASK,0,0); //添加图标
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON7));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON8));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON9));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON10));}
//向CIconMenu中添加修改菜单信息项并存储在成员变量中
BOOL CIconMenu::ChangeMenuItem(CMenu* m_menu,BOOL m_Toped)
{
if (m_menu != NULL)
{
int m_itemcount = m_menu->GetMenuItemCount();
for (int i=0;i<m_itemcount;i++)
{
m_menu->GetMenuString(i,m_ItemLists[m_index].m_ItemText,MF_BYPOSITION);
int m_itemID = m_menu->GetMenuItemID(i);
if (m_itemID==-1 && m_Toped)
{
m_itemID = -2;//顶层菜单
};
m_ItemLists[m_index].m_ItemID = m_itemID;
if (m_itemID>0)
{
m_ItemLists[m_index].m_IconIndex= m_iconindex;
m_iconindex+=1;
}
m_menu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION |MF_STRING,m_ItemLists[m_index].m_ItemID,(LPSTR)&(m_ItemLists[m_index]));
m_index+=1;
CMenu* m_subMenu = m_menu->GetSubMenu(i); if (m_subMenu)
{
ChangeMenuItem(m_subMenu);
}
}
}
return TRUE ;
}
//改写菜单类的虚拟方法
void CIconMenu::MeasureItem( LPMEASUREITEMSTRUCT lpStruct )
{
if (lpStruct->CtlType==ODT_MENU)
{
lpStruct->itemHeight = ITEMHEIGHT;
lpStruct->itemWidth = ITEMWIDTH;
CMenuItemInfo* m_iteminfo;
m_iteminfo = (CMenuItemInfo*)lpStruct->itemData;
lpStruct->itemWidth = ((CMenuItemInfo*)lpStruct->itemData)->m_ItemText.GetLength()*10;
switch(m_iteminfo->m_ItemID)
{
case 0: //分隔条
{
lpStruct->itemHeight = 1;
break;
}
}
}
}
//添加成员函数用于绘制菜单项文本
void CIconMenu::DrawItemText(CDC* m_pdc,LPSTR str,CRect m_rect)
{
m_rect.DeflateRect(20,0);
m_pdc->DrawText(str,m_rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);
}
//绘制菜单项图标
void CIconMenu::DrawMenuIcon(CDC* m_pdc,CRect m_rect,int m_icon )
{
m_imagelist.Draw(m_pdc,m_icon,CPoint(m_rect.left+2,m_rect.top+4),ILD_TRANSPARENT);
}
//绘制分隔条
void CIconMenu::DrawSeparater(CDC* m_pdc,CRect m_rect)
{
if (m_pdc != NULL)
{
m_pdc->Draw3dRect(m_rect,RGB(255,0,0),RGB(0,0,255));
}
}
//绘制顶层菜单
void CIconMenu::DrawTopMenu(CDC* m_pdc,CRect m_rect,BOOL m_selected )
{
if (m_selected)
{
m_pdc->SelectStockObject(BLACK_PEN);
m_pdc->Rectangle(&m_rect);
m_rect.DeflateRect(1,1);
m_pdc->FillSolidRect(m_rect,RGB(150, 185, 255));
}
else
{
CRect rect;
AfxGetMainWnd()->GetClientRect(rect);
rect.top = m_rect.top;
rect.bottom = m_rect.bottom;
rect.left= 360;
rect.right +=4;
//CRect c_rect(m_rect);
m_pdc->FillSolidRect(&rect,RGB(200,187, 255));
m_pdc->FillSolidRect(&m_rect,RGB(200,187, 255));
//m_pdc->SelectStockObject(BLACK_PEN);
//m_pdc->FillSolidRect(m_rect,RGB(100, 185, 255));
}
}
//改写菜单中的虚拟方法、绘制不同状态的菜单
void CIconMenu::DrawItem( LPDRAWITEMSTRUCT lpStruct )
{
if (lpStruct->CtlType==ODT_MENU)
{
if(lpStruct->itemData == NULL) return;
unsigned int m_state = lpStruct->itemState;
CDC* m_dc = CDC::FromHandle(lpStruct->hDC);
//m_dc.Attach(lpStruct->hDC); CString str = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemText;
LPSTR m_str = str.GetBuffer(str.GetLength()); int m_itemID = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemID;
int m_itemicon = ((CMenuItemInfo*)(lpStruct->itemData))->m_IconIndex;
CRect m_rect = lpStruct->rcItem; m_dc->SetBkMode(TRANSPARENT); switch(m_itemID)
{
case -2:
{ DrawTopMenu(m_dc,m_rect,(m_state&ODS_SELECTED)||(m_state&0x0040)); //0x0040 ==ODS_HOTLIGHT DrawItemText(m_dc,m_str,m_rect);
break;
}
case -1:
{
DrawItemText(m_dc,m_str,m_rect);
break;
}
case 0:
{
DrawSeparater(m_dc,m_rect);
break;
}
default:
{
DrawComMenu(m_dc,m_rect,0xfaa0,0xf00ff,m_state&ODS_SELECTED);
DrawItemText(m_dc,m_str,m_rect);
DrawMenuIcon(m_dc,m_rect,m_itemicon);
break;
}
}
//框架中引入头文件、调用对象的菜单方法
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
m_menu.MeasureItem(lpMeasureItemStruct);
// CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
//关联菜单窗口
m_menu.AttatchMenu(this->GetMenu()->GetSafeHmenu());
m_menu.ChangeMenuItem(&m_menu,TRUE);