15,976
社区成员
发帖
与我相关
我的任务
分享
void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_CustomMenu.DrawItem(lpDrawItemStruct);
// m_PopMenu.DrawItem(lpDrawItemStruct);
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
#if !defined(AFX_CUSTOMMENU_H__3AF0EF07_A6CE_47D9_8840_A15350F03607__INCLUDED_)
#define AFX_CUSTOMMENU_H__3AF0EF07_A6CE_47D9_8840_A15350F03607__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CustomMenu.h : header file
//
#define MAXLIST 50
#define HEIGHT 28
#define WIDTH 120
/////////////////////////////////////////////////////////////////////////////
// CCustomMenu window
typedef struct
{
CString m_Text;
UINT m_MenuID;
UINT m_Icon;
}MenuItemInfo;
//m_MenuID -2:顶层菜单条 -1:弹出菜单 0:分隔条 >0:一般的菜单
//注意顶层菜单条和弹出菜单的区别
class CCustomMenu : public CMenu
{
// Construction
public:
CCustomMenu();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCustomMenu)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
void SetMenuImageList(CImageList *pImageList);
void DrawMenuIcon(CDC *m_dc,CRect m_rect,UINT IconIndex);
void DrawItemText(CDC *m_dc,CString str,CRect m_rect,BOOL m_Com,
BOOL bGray,BOOL bTop);
void DrawTopMenu(CDC *m_dc,CRect m_rect,BOOL bSelect);
void DrawComMenu(CDC* m_dc,CRect m_rect,BOOL bSelect,BOOL bGray);
void DrawSeparate(CDC *m_dc,CRect m_rect);
MenuItemInfo m_MenuInfoList[MAXLIST];
UINT m_Index;//用于m_MenuInfoList
UINT m_IconIndex;
CImageList *pImageList;
BOOL ChangeMenuItem(CMenu *m_Menu, BOOL bTop);
virtual ~CCustomMenu();
// Generated message map functions
protected:
//{{AFX_MSG(CCustomMenu)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_CUSTOMMENU_H__3AF0EF07_A6CE_47D9_8840_A15350F03607__INCLUDED_)
// CustomMenu.cpp : implementation file
//
#include "stdafx.h"
#include "CustomMenu.h"
#include "CMenuTest.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCustomMenu
CCustomMenu::CCustomMenu()
{
m_IconIndex = 0;
m_Index = 0;
}
CCustomMenu::~CCustomMenu()
{
}
/////////////////////////////////////////////////////////////////////////////
// CCustomMenu message handlers
void CCustomMenu::SetMenuImageList(CImageList *pImageList)
{
this->pImageList = pImageList;
}
void CCustomMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
if(lpDrawItemStruct->itemData == NULL)
return;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
MenuItemInfo *info=(MenuItemInfo*)(lpDrawItemStruct->itemData);
UINT m_MenuID=info->m_MenuID;
CString m_text=info->m_Text;
UINT IconIndex=info->m_Icon;
UINT m_state=lpDrawItemStruct->itemState;
CRect rect=lpDrawItemStruct->rcItem;
pDC->SetBkMode(TRANSPARENT);
switch(m_MenuID)
{
case -2://顶层菜单
// DrawTopMenu(pDC,rect,(m_state& ODS_SELECTED)||
// (lpDrawItemStruct->itemAction & (ODA_SELECT)));
DrawTopMenu(pDC,rect,(m_state & ODS_SELECTED)||(m_state & 0x0040));
//这里也不要用(m_state& ODS_SELECTED)||
// (lpDrawItemStruct->itemAction & (ODA_SELECT)));
//(m_state&0x0040)也要加上,否则鼠标移入没反应
//0x0040 ==ODS_HOTLIGHT
DrawItemText(pDC,m_text,rect,FALSE,FALSE,TRUE);
break;
case -1://弹出菜单
DrawComMenu(pDC,rect,(m_state & ODS_SELECTED)||(m_state & 0x0040),FALSE);
DrawItemText(pDC,m_text,rect,TRUE,FALSE,FALSE);
DrawMenuIcon(pDC,rect,IconIndex + 1);
break;//记住一定要break,否则,呵呵,后果自负
case 0:
DrawSeparate(pDC,rect);
break;
default:
//||(lpDrawItemStruct->itemAction & (ODA_SELECT))
//这个不要加,加了之后会出现一直处于高亮显示
if(m_state & ODS_GRAYED) //菜单不可用
{
DrawComMenu(pDC,rect,(m_state & ODS_SELECTED),TRUE);
DrawItemText(pDC,m_text,rect,TRUE,TRUE,FALSE);
}
else
{
DrawComMenu(pDC,rect,(m_state & ODS_SELECTED),FALSE);
DrawItemText(pDC,m_text,rect,TRUE,FALSE,FALSE);
}
if(m_state & ODS_CHECKED)//被 Check
DrawMenuIcon(pDC,rect,0);
else
DrawMenuIcon(pDC,rect,IconIndex + 1);
break;
}
}
void CCustomMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your code to determine the size of specified item
if(lpMeasureItemStruct->CtlType == ODT_MENU)
{
lpMeasureItemStruct->itemHeight = HEIGHT;
lpMeasureItemStruct->itemWidth = WIDTH;
MenuItemInfo *info = (MenuItemInfo*)lpMeasureItemStruct->itemData;
if(lpMeasureItemStruct->itemID == -2)
lpMeasureItemStruct->itemWidth = info->m_Text.GetLength() * 8;
else
lpMeasureItemStruct->itemWidth = info->m_Text.GetLength() * 8 + 32;
if(info->m_MenuID == 0)
lpMeasureItemStruct->itemHeight = 1;
}
}
BOOL CCustomMenu::ChangeMenuItem(CMenu *pMenu, BOOL bTop = FALSE)
{
if(pMenu != NULL)
{
int m_Count = pMenu->GetMenuItemCount();
for( int i=0 ; i < m_Count ; i++ )
{
int m_ID = pMenu->GetMenuItemID(i);
CMenu *pSubMenu = pMenu->GetSubMenu(i);
if(m_ID < 0 && bTop)//顶层菜单
{
m_MenuInfoList[m_Index].m_MenuID = -2;
}
else if(pSubMenu && m_ID != -2 && !bTop)//弹出菜单
{
m_MenuInfoList[m_Index].m_MenuID = -1;
m_MenuInfoList[m_Index].m_Icon = m_IconIndex;
m_IconIndex++;
}
else if(m_ID == 0)//分隔线
m_MenuInfoList[m_Index].m_MenuID = 0;
else if(m_ID > 0)//普通菜单
{
m_MenuInfoList[m_Index].m_MenuID = m_ID;
m_MenuInfoList[m_Index].m_Icon = m_IconIndex;
m_IconIndex++;
}
pMenu->GetMenuString(i,m_MenuInfoList[m_Index].m_Text,MF_BYPOSITION);
pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW|MF_STRING,
m_MenuInfoList[m_Index].m_MenuID,(LPCTSTR)(&m_MenuInfoList[m_Index]));
m_Index++;
if(pSubMenu)
ChangeMenuItem(pSubMenu);
}
}
return TRUE;
}
void CCustomMenu::DrawSeparate(CDC *m_dc, CRect m_rect)
{
m_rect.left = m_rect.left + 30;
m_dc->Draw3dRect(m_rect,RGB(255,255,255),RGB(255,255,255));
}
void CCustomMenu::DrawComMenu(CDC *m_dc, CRect m_rect, BOOL bSelect,BOOL bGray)
{
CRect rect(m_rect);
//rect.DeflateRect(20,1,0,1);
if(bSelect)
{
m_dc->FillSolidRect(rect,RGB(186,211,252));//208,235,255
}
else
{
if(bGray)
m_dc->FillSolidRect(rect,RGB(240,238,225));
else
m_dc->FillSolidRect(rect,RGB(255,255,255));
}
}
void CCustomMenu::DrawTopMenu(CDC *m_dc, CRect m_rect, BOOL bSelect)
{
if(bSelect)
{
m_dc->SelectStockObject(BLACK_PEN);
CRect rect(m_rect);
m_dc->Rectangle(rect);
rect.DeflateRect(1,1,1,1);
m_dc->FillSolidRect(rect,RGB(255,235,181));
}
else
{
CRect rect;
AfxGetMainWnd()->GetClientRect(&rect);
rect.left = 390;
rect.bottom = m_rect.bottom;
rect.top = m_rect.top;
rect.right += 4;
m_dc->FillSolidRect(m_rect,RGB(186,211,252));
m_dc->FillSolidRect(rect,RGB(186,211,252));//画出射剩余的部分
}
}
void CCustomMenu::DrawItemText(CDC *m_dc, CString str, CRect m_rect,BOOL m_Com,
BOOL bGray,BOOL bTop)
{
if(bGray)
m_dc->SetTextColor(RGB(127,127,127));
CRect rect(m_rect);
if(m_Com)
rect.DeflateRect(36,0,0,0);
if(bTop)
m_dc->DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
else
m_dc->DrawText(str,rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
}
void CCustomMenu::DrawMenuIcon(CDC *m_dc,CRect m_rect, UINT IconIndex)
{
pImageList->Draw(m_dc,IconIndex,CPoint(m_rect.left+2,m_rect.top+2),
ILD_TRANSPARENT);
//ILD_MASK不要加
}
void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_CustomMenu.DrawItem(lpDrawItemStruct);
// m_PopMenu.DrawItem(lpDrawItemStruct);
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}


void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_CustomMenu.DrawItem(lpDrawItemStruct);
// m_PopMenu.DrawItem(lpDrawItemStruct);
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
m_CustomMenu.MeasureItem(lpMeasureItemStruct);
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
m_MainMenuImage.Create(24,24,ILC_COLOR24|ILC_MASK,0,0);
m_MainMenuImage.Add(AfxGetApp()->LoadIcon(IDI_CHECK));//第一个图标为钩
m_MainMenuImage.Add(AfxGetApp()->LoadIcon(IDI_ADD_USER));
m_MainMenuImage.Add(AfxGetApp()->LoadIcon(IDI_USER));
...
m_PopMenuImage.Create(24,24,ILC_COLOR24|ILC_MASK,0,0);
m_PopMenuImage.Add(AfxGetApp()->LoadIcon(IDI_ICON_TEST));
m_PopMenuImage.Add(AfxGetApp()->LoadIcon(IDI_ICON_TEST));
...
//自定义菜单
m_CustomMenu.Attach(this->GetMenu()->GetSafeHmenu());
m_CustomMenu.ChangeMenuItem(&m_CustomMenu,TRUE);
m_CustomMenu.SetMenuImageList(&m_MainMenuImage);
//弹出式菜单
m_PopMenu.LoadMenu(IDR_MENU_TRACK);
m_PopMenu.ChangeMenuItem(&m_PopMenu,TRUE);
m_PopMenu.SetMenuImageList(&m_PopMenuImage);
...
void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu *pMenu;
pMenu = m_PopMenu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
}