📄 xpmenu.cpp
字号:
// XPMenu.cpp: implementation of the CXPMenu class.
/***********************************************************
Written by : FanWenSheng
Address : HeFei University of Technology
Email : fanwenshengcom@sohu.com
Copyright (c) 2002.9.25
***********************************************************/
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XPMenu.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#ifndef GRAY_AREA_LENGTH
#define GRAY_AREA_LENGTH 0x00000019
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CXPMenu::CXPMenu()
{}
CXPMenu::~CXPMenu()
{}
// draw the menu with XP styles
void CXPMenu::DrawItem (LPDRAWITEMSTRUCT lpDIS)
{
// get dc
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
VERIFY(pDC);
pDC->SetBkMode(TRANSPARENT);
// get position
CRect rcItem = lpDIS->rcItem;
// get states
UINT uState = lpDIS->itemState;
// the data of menu item is NULL then return
if(lpDIS->itemData == NULL)
return;
// get item informations
UINT uIdNormal = ((CItemInfo*)(lpDIS->itemData))->uIdNormal;
UINT uIdSelect = ((CItemInfo*)(lpDIS->itemData))->uIdSelect;
CString sText = ((CItemInfo*)(lpDIS->itemData))->sText;
// get icon position and text position
CRect rcIcon(rcItem);
rcIcon.right = rcIcon.left + GRAY_AREA_LENGTH;
CRect rcText(rcItem);
rcText.left = rcIcon.right;
// draw background and icon
if(uState & ODS_SELECTED)
{
DrawBgClr(pDC, rcItem, TRUE);
DrawIcon(pDC, rcIcon, uIdNormal, uIdSelect, TRUE);
}
else
{
DrawBgClr(pDC, rcItem, FALSE);
DrawIcon(pDC, rcIcon, uIdNormal, uIdSelect, FALSE);
}
// draw text
DrawText(pDC, rcText, sText);
}
// draw background color
void CXPMenu::DrawBgClr(CDC* pDC, CRect rect, BOOL bSelected)
{
if(bSelected)
{
// draw frame
pDC->SelectStockObject(NULL_BRUSH);
pDC->SelectStockObject(BLACK_PEN);
pDC->Rectangle(&rect);
// fill background with XP color
rect.DeflateRect(0x00000001, 0x00000001);
pDC->FillSolidRect(&rect, RGB(0x000000B1, 0x000000B9, 0x000000CF));
}
else
{
CRect rcGray(rect);
rcGray.right = rcGray.left + GRAY_AREA_LENGTH;
pDC->FillSolidRect(&rcGray, RGB(0x000000DB, 0x000000D8, 0x000000D1));
CRect rcWhite(rect);
rcWhite.left = rcGray.right;
pDC->FillSolidRect(&rcWhite, RGB(0x000000F9, 0x000000F8, 0x000000F7));
}
}
// draw everyone icon for menu items
void CXPMenu::DrawIcon(CDC* pDC, CRect rect, UINT uIdNormal, UINT uIdSelect, BOOL bSelected)
{
rect.DeflateRect(0x03, 0x03, 0x03, 0x03);
if(bSelected)
{
HICON hIcon = AfxGetApp()->LoadIcon(uIdSelect);
ASSERT(hIcon);
rect.OffsetRect(-1, -1);
::DrawIconEx(pDC->m_hDC, rect.left, rect.top,
hIcon, 16, 16, 0, NULL, DI_NORMAL);
}
else
{
HICON hIcon = AfxGetApp()->LoadIcon(uIdNormal);
ASSERT(hIcon);
::DrawIconEx(pDC->m_hDC, rect.left, rect.top,
hIcon, 16, 16, 0, NULL, DI_NORMAL);
}
}
// draw everyone text for menu items
void CXPMenu::DrawText(CDC* pDC, CRect rect, CString sText)
{
rect.DeflateRect(0x08, 0x00, 0x00, 0x00);
pDC->DrawText(sText, &rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}
void CXPMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemWidth = 130;
lpMIS->itemHeight = 22;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -