📄 cmmenu.cpp
字号:
#include "stdafx.h"
#include "CMMenu.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_CMMENU(CMMenu, CMenu);
CMMenu::CMMenu()
{
mrectex.top=29;mrectex.bottom=48;mrectex.left=279;mrectex.right=1023;
FMouse1=false;FMouse2=false;FMouse3=false;FMouse4=false;
Seticon();
}
CMMenu::~CMMenu()
{
}
BOOL CMMenu::AttachMenu(HMENU hMenu)
{
Attach(hMenu);
ChangeMenuStyle(hMenu, TRUE);
return TRUE;
}
BOOL CMMenu::ChangeMenuStyle(HMENU hMenu, BOOL bTop = FALSE)
{
CMenu *pMenu = CMenu::FromHandle(hMenu);
if(pMenu != NULL)
{
UINT j= pMenu->GetMenuItemCount();
for(UINT i = 0; i < pMenu->GetMenuItemCount(); i ++)
{
CMenuItemContext *lpMenu = new CMenuItemContext;
lpMenu->nMenuID = pMenu->GetMenuItemID(i);
if(lpMenu->nMenuID < 0 && bTop)
{
lpMenu->nMenuID = -2;
}
pMenu->GetMenuString(i, lpMenu->strText, MF_BYPOSITION);
pMenu->ModifyMenu(i, MF_BYPOSITION | MF_OWNERDRAW,
lpMenu->nMenuID,LPCTSTR(lpMenu));//LPCTSTR(lpMenu)
CMenu *pSubMenu = pMenu->GetSubMenu(i);
if(pSubMenu && lpMenu->nMenuID != -2 && !bTop)
{
lpMenu->nMenuID = -1;
}
if(pSubMenu)
{
ChangeMenuStyle(pSubMenu->GetSafeHmenu());
}
}
}
return TRUE;
}
void CMMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemWidth = 180;
lpMIS->itemHeight = 34;
UINT nMenuID= ((CMenuItemContext*)(lpMIS->itemData))->nMenuID;
switch(nMenuID)
{
case -2:
lpMIS->itemWidth =((CMenuItemContext*)(lpMIS->itemData))->strText.GetLength()*6;
break;
case -1:
lpMIS->itemWidth =((CMenuItemContext*)(lpMIS->itemData))->strText.GetLength()*10;
break;
case 0:
lpMIS->itemHeight =10;
break;
default:
break;
}
}
void CMMenu::DrawBestRect(CDC *pDC, CRect rect, COLORREF cr1,COLORREF cr2, BOOL bHor)
{
int r1 = GetRValue(cr1);//Red color1
int g1 = GetGValue(cr1);//Green color1
int b1 = GetBValue(cr1);//blue color1
int r2 = GetRValue(cr2);//red color2
int g2 = GetGValue(cr2);//green color2
int b2 = GetBValue(cr2);//blue color2
if(bHor)
{
float dr = ((float)(r2 - r1))/(float)(rect.Width());
float dg = ((float)(g2 - g1))/(float)(rect.Width());
float db = ((float)(b2 - b1))/(float)(rect.Width());
for(int i = rect.left; i < rect.right; i ++)
{
int r = r1 + (int)(dr*((float)(i - rect.left)));
int g = g1 + (int)(dg*((float)(i - rect.left)));
int b = b1 + (int)(db*((float)(i - rect.left)));
CPen pen(PS_SOLID, 1, RGB(r, g, b));
CPen *old = pDC->SelectObject(&pen);
pDC->MoveTo(i, rect.top);
pDC->LineTo(i, rect.bottom);
pDC->SelectObject(old);
}
}
else
{
float dr = ((float)(r2 - r1))/(float)(rect.Height());
float dg = ((float)(g2 - g1))/(float)(rect.Height());
float db = ((float)(b2 - b1))/(float)(rect.Height());
for(int i = rect.top; i < rect.bottom; i ++)
{
int r = r1 + (int)(dr*((float)(i - rect.top)));
int g = g1 + (int)(dg*((float)(i - rect.top)));
int b = b1 + (int)(db*((float)(i - rect.top)));
CPen pen(PS_SOLID, 1, RGB(r, g, b));
CPen *old = pDC->SelectObject(&pen);
pDC->MoveTo(rect.left, i);
pDC->LineTo(rect.right, i);
pDC->SelectObject(old);
}
}
}
void CMMenu::DrawTop(CDC *pDC,CRect rect,int i,BOOL bSelected)
{
if(bSelected)
{
pDC->SelectStockObject(BLACK_PEN);
pDC->Rectangle(&rect);//a rectangle
rect.DeflateRect(1, 1);
CRect rectst1,rectst2,rectst3,rectst4;
rectst1.left=rect.left;
rectst1.top=rect.top;
rectst1.bottom =rect.bottom;
rectst1.right=rectst1.left+rect.Width()/4;
pDC->FillSolidRect(&rectst1, RGB(255, 242, 200));
rectst2.left= rectst1.right;
rectst2.top=rect.top;
rectst2.bottom =rect.bottom;
rectst2.right=rectst2.left+rect.Width()/4;
pDC->FillSolidRect(&rectst2, RGB(255, 238, 196));
rectst3.left= rectst2.right;
rectst3.top=rect.top;
rectst3.bottom =rect.bottom;
rectst3.right=rectst3.left+rect.Width()/4;
pDC->FillSolidRect(&rectst3, RGB(255, 234, 192));
rectst4.left= rectst3.right;
rectst4.top=rect.top;
rectst4.bottom =rect.bottom;
rectst4.right=rect.right;
pDC->FillSolidRect(&rectst4, RGB(255, 230, 189));
CRect recttemp;
recttemp.left=mrectex.left;
for(int i=0;i<=3;i++)
{
recttemp.top=mrectex.top;
recttemp.bottom=mrectex.bottom;
recttemp.left=mrectex.Width()/4*i+recttemp.left;
recttemp.right=recttemp.left+mrectex.Width();
pDC->FillSolidRect(&recttemp,RGB(194+2*i,218+2*i,249));
}
recttemp.left=recttemp.right;
recttemp.right=mrectex.right;
pDC->FillSolidRect(&recttemp,RGB(200,224,249));
CRect roundrect2;
roundrect2.top=mrectex.top;
roundrect2.bottom=mrectex.bottom;
roundrect2.right=mrectex.right-70;
roundrect2.left=mrectex.right-30;
pDC->DrawState(roundrect2.TopLeft(),
roundrect2.Size(),
SMicon,
DSS_NORMAL,
(CBrush*)NULL);
}
else
{
CRect rcGray(rect);
int j;
switch(i)
{
case 1:
for(j=0;j<4;j++)
{
rcGray.left=rect.left+rect.Width()*j/4;
rcGray.right=rcGray.left+rect.Width()/4;
pDC->FillSolidRect(&rcGray,RGB(168+2*j,188+2*j,249));
}
rcGray.left=rcGray.right;
rcGray.right=rect.right;
pDC->FillSolidRect(&rcGray,RGB(168+2*j,188+2*j,249));
break;
case 2:
for(j=0;j<4;j++)
{
rcGray.left=rect.left+rect.Width()*j/4;
rcGray.right=rcGray.left+rect.Width()/4;
pDC->FillSolidRect(&rcGray,RGB(178+2*j,194+2*j,249));
}
rcGray.left=rcGray.right;
rcGray.right=rect.right;
pDC->FillSolidRect(&rcGray,RGB(178+2*3,194+2*3,249));
break;
case 3:
for(j=0;j<4;j++)
{
rcGray.left=rect.left+rect.Width()*j/4;
rcGray.right=rcGray.left+rect.Width()/4;
pDC->FillSolidRect(&rcGray,RGB(184+2*j,200+2*j,249));
}
rcGray.left=rcGray.right;
rcGray.right=rect.right;
pDC->FillSolidRect(&rcGray,RGB(184+2*3,200+2*3,249));
break;
case 4:
for(j=0;j<4;j++)
{
rcGray.left=rect.left+rect.Width()*j/4;
rcGray.right=rcGray.left+rect.Width()/4;
pDC->FillSolidRect(&rcGray,RGB(192+2*j,206+2*j,249));
}
rcGray.left=rcGray.right;
rcGray.right=rect.right;
pDC->FillSolidRect(&rcGray,RGB(192+2*3,206+2*3,249));
break;
}
CRect recttemp;
recttemp.left=mrectex.left;
for(int i=0;i<=3;i++)
{
recttemp.top=mrectex.top;
recttemp.bottom=mrectex.bottom;
recttemp.left=mrectex.Width()/4*i+recttemp.left;
recttemp.right=recttemp.left+mrectex.Width();
pDC->FillSolidRect(&recttemp,RGB(202+2*i,218+2*i,249));
}
recttemp.left=recttemp.right;
recttemp.right=mrectex.right;
pDC->FillSolidRect(&recttemp,RGB(208,224,249));
CRect roundrect2;
roundrect2.top=mrectex.top;
roundrect2.bottom=mrectex.bottom;
roundrect2.right=mrectex.right-70;
roundrect2.left=mrectex.right-30;
pDC->DrawState(roundrect2.TopLeft(),
roundrect2.Size(),
SMicon,
DSS_NORMAL,
(CBrush*)NULL);
}
}
void CMMenu::DrawBGColor(CDC* pDC, CRect rect, BOOL bSelected)
{
if(bSelected)
{
pDC->SelectStockObject(NULL_BRUSH);
pDC->SelectStockObject(BLACK_PEN);
pDC->Rectangle(&rect);
rect.DeflateRect(1, 1);
DrawBestRect(pDC,rect,0xf000,0xff00ff,TRUE);
}
else
{
CRect rcGray(rect);
rcGray.right = rcGray.left + 34;
pDC->FillSolidRect(&rcGray, RGB(0x000000DB, 0x000000D8, 0x000000D1));
CRect rcWhite(rect);
rcWhite.left = rcGray.right;
pDC->FillSolidRect(&rcWhite,RGB(0x000000F9, 0x000000F8, 0x000000F7));
}
}
void CMMenu::DrawIcon(CDC* pDC, CRect rect, UINT uIndex, BOOL IsEnabled)
{
rect.DeflateRect(3, 3, 3, 3);
UINT uStyle =ILD_TRANSPARENT; //CImageList::Draw()绘制位图的风格
if(IsEnabled)
{
uStyle |=ILD_BLEND50;//菜单无效所以位图也要经过处理
}
else
{
uStyle |=ILD_BLEND25 ;
}
m_ImageList.Draw(pDC, uIndex, CPoint(rect.left, rect.top), uStyle);
// HICON hIcon = m_ImageList.ExtractIcon(uIndex);
}
void CMMenu::DrawText(CDC* pDC, CRect rect, CString sText,BOOL Tflag)
{
rect.DeflateRect(8,0,0,0);
if(Tflag)
pDC->SetTextColor(RGB(0,0,146));
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -