📄 mymenu1.cpp
字号:
// MyMenu1.cpp: implementation of the CMyMenu class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "打字游戏.h"
#include "MyMenu1.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyMenu::CMyMenu()
{
m_nCount = 0 ;
m_nMaxWidth = 0;
m_array.RemoveAll();
m_bFirst =TRUE;
}
CMyMenu::~CMyMenu()
{
if(m_bitmap.m_hObject != NULL)
m_bitmap.DeleteObject();
m_array.RemoveAll();
}
BOOL CMyMenu::CreateMenu(UINT nIDBitmap)
{
if(!CMenu::CreatePopupMenu())
return FALSE;
if( nIDBitmap != 0 )
{
m_bitmap.LoadBitmap(nIDBitmap);
}
SetColor();
return TRUE;
}
void CMyMenu::SetColor(COLORREF clrText ,COLORREF clrBackGround ,COLORREF clrHighLight )
{
ASSERT(m_hMenu != NULL);
m_clrText = clrText;
m_clrBackGround = clrBackGround;
m_clrHighLight = clrHighLight;
}
BOOL CMyMenu::InsertMenu(UINT nID,LPCTSTR pszText,UINT nIconID)
{
ASSERT(m_hMenu != NULL);
MENUICONSTRUCT MenuIcon;
lstrcpy(MenuIcon.pszMenuCaption,pszText);
if(lstrlen(pszText) > m_nMaxWidth )
{
m_nMaxWidth = lstrlen(pszText);
}
if(nIconID != 0)
{
MenuIcon.hIcon = ::LoadIcon(AfxGetInstanceHandle(),(LPCTSTR)nIconID);
}
else
{
MenuIcon.hIcon = NULL;
}
m_nCount++;
if(m_bitmap.m_hObject != NULL)
{
BITMAP bmp;
m_bitmap.GetObject(sizeof(BITMAP),&bmp);
MenuIcon.rect.left=0;
MenuIcon.rect.right=bmp.bmWidth;
MenuIcon.rect.top=max(2,bmp.bmHeight-m_nCount*32);//32 is icon width and height
MenuIcon.rect.bottom=MenuIcon.rect.top+32;
}
MenuIcon.uID=nID;
m_array.Add(MenuIcon);
if(!CMenu::AppendMenu( MF_OWNERDRAW|MF_BYCOMMAND|MF_STRING,
nID,
(LPCTSTR)NULL))
return FALSE;
return TRUE;
}
void CMyMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(m_hMenu != NULL);
int i;
if(m_bFirst)
{
m_bFirst = FALSE;
InfoArray tempArray;
for(i=m_array.GetSize()-1;i>=0;i--)
{
tempArray.Add(m_array[i]);
}
for(i=0;i<tempArray.GetSize();i++)
{
m_array[i].rect=tempArray[i].rect;
}
}
CBrush brushHighLight(m_clrHighLight);
CBrush brushBackGround(m_clrBackGround);
CRect rect;
CDC dc;
CDC dcMem;
CBitmap *pOldBitmap;
CRect rt;
dc.Attach(lpDrawItemStruct->hDC);
int nTabs[3]={50,100,150};
for(i=0;i<m_array.GetSize();i++)
{
if(m_array.GetAt(i).uID ==lpDrawItemStruct->itemID)
{
MENUICONSTRUCT MenuIcon=m_array.GetAt(i);
if(m_bitmap.m_hObject != NULL)
{
dcMem.CreateCompatibleDC(&dc);
pOldBitmap = (CBitmap *)dcMem.SelectObject(&m_bitmap);
dc.BitBlt( lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top,
MenuIcon.rect.right,32,
&dcMem,
MenuIcon.rect.left,
MenuIcon.rect.top,
SRCCOPY);
dcMem.SelectObject(pOldBitmap);
rect= lpDrawItemStruct->rcItem;
rect.left+=32;
if( (lpDrawItemStruct->itemState & ODS_SELECTED))
{
dc.FillRect(&rect,&brushHighLight);
}
else
{
dc.FillRect(&rect,&brushBackGround);
}
if(MenuIcon.hIcon!=NULL)
{
dc.DrawIcon(rect.left,rect.top,MenuIcon.hIcon);
rt = rect;
rt.right = rt.left +32;
if((lpDrawItemStruct->itemState & ODS_SELECTED))
dc.DrawEdge(&rt,EDGE_RAISED,BF_RECT);
}
rect.left += 38;
dc.SetBkMode(TRANSPARENT);
if((lpDrawItemStruct->itemState & ODS_SELECTED))
dc.SetTextColor(RGB(~GetRValue(m_clrHighLight),~GetGValue(m_clrHighLight),~GetBValue(m_clrHighLight)));
else
dc.SetTextColor(m_clrText);
dc.DrawText(MenuIcon.pszMenuCaption,&rect,DT_EXPANDTABS|DT_SINGLELINE|DT_VCENTER|DT_VCENTER);
}
else
{
rect = lpDrawItemStruct->rcItem;
if((lpDrawItemStruct->itemState & ODS_SELECTED))
{
dc.FillRect(&rect,&brushHighLight);
}
else
{
dc.FillRect(&rect,&brushBackGround);
}
if(MenuIcon.hIcon!=NULL)
{
dc.DrawIcon(rect.left,rect.top,MenuIcon.hIcon);
rt = rect;
rt.right = rt.left +32;
if((lpDrawItemStruct->itemState & ODS_SELECTED))
dc.DrawEdge(&rt,EDGE_RAISED,BF_RECT);
}
rect.left += 38;
if((lpDrawItemStruct->itemState & ODS_SELECTED))
dc.SetTextColor(~m_clrBackGround);
else
dc.SetTextColor(m_clrText);
dc.DrawText(MenuIcon.pszMenuCaption,&MenuIcon.rect,DT_TABSTOP|DT_SINGLELINE|DT_VCENTER|DT_VCENTER);
}
break;
}
}
dc.Detach();
}
void CMyMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight=32;
lpMeasureItemStruct->itemWidth =260;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -