📄 iconbutton.cpp
字号:
// IconButton.cpp : implementation file
/////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "IconButton.h"
/////////////////////////////////////////////////////////////
// CIconButton
CIconButton::CIconButton()
{
m_nWidth = -6;
m_hIcon = NULL;
}
CIconButton::~CIconButton()
{
}
BEGIN_MESSAGE_MAP(CIconButton, CFlatButton)
//{{AFX_MSG_MAP(CIconButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////
// CIconButton message handlers
BOOL CIconButton::SetIcon(HICON hIcon, long nWidth)
{
m_hIcon = hIcon;
m_nWidth = nWidth;
if(m_hIcon == NULL) return FALSE;
return TRUE;
}
BOOL CIconButton::SetIcon(CImageList * lpList, long nImage)
{
m_hIcon = lpList->ExtractIcon(nImage);
if(m_hIcon == NULL) return FALSE;
// 获取Icon的信息
IMAGEINFO myInfo;
lpList->GetImageInfo(nImage, &myInfo);
m_nWidth = myInfo.rcImage.right -
myInfo.rcImage.left;
return TRUE;
}
void CIconButton::DrawItem(LPDRAWITEMSTRUCT lpStruct)
{
// 获取文字
TCHAR lpText[32];
long nLength = GetWindowText(lpText, 32);
// 获取句柄边界等
HDC hdc = lpStruct->hDC;
CRect rtRect(lpStruct->rcItem);
// 两种颜色
COLORREF rgbPen;
COLORREF rgbBrush;
// 选择画笔和画刷颜色
if( (lpStruct->itemState & ODS_DISABLED) ||
(!m_bMouseHover && !(lpStruct->itemState & ODS_SELECTED)) )
{
rgbBrush = m_bkColor;
SetTextColor(hdc, m_rgbText);
rgbPen = GetSysColor(COLOR_3DSHADOW);
}
else
{
rgbPen = GetSysColor(COLOR_HIGHLIGHT);
if( (lpStruct->itemState & ODS_SELECTED) )
{
rgbBrush = m_bkActive;
SetTextColor(hdc, m_rgbDown);
}
else
{
rgbBrush = m_bkHover;
SetTextColor(hdc, m_rgbText);
}
}
// Pen and Brush
HGDIOBJ hOldPen, hOldBrush;
HPEN hNewPen = CreatePen(PS_SOLID, 1, rgbPen);
HBRUSH hNewBrush = CreateSolidBrush(rgbBrush);
hOldPen = SelectObject(hdc, hNewPen);
hOldBrush = SelectObject(hdc, hNewBrush);
// 画出Button的效果
if( (lpStruct->itemState & ODS_FOCUS) )
Rectangle(hdc, rtRect.left + 1, rtRect.top + 1,
rtRect.right - 1, rtRect.bottom - 1);
else
Rectangle(hdc, rtRect.left, rtRect.top,
rtRect.right, rtRect.bottom);
// 去掉PREFIX字符
long nSave = 0;
TCHAR lpSave[32];
bool bTagging = false;
for(long i = 0; i < nLength; i ++)
{
if(lpText[i] != '&' || bTagging)
lpSave[nSave ++] = lpText[i];
if(lpText[i] == '&')
bTagging = !bTagging;
}
// 计算显示位置
SIZE txSize;
GetTextExtentPoint(hdc, lpSave, nSave, &txSize);
// Button的图标
RECT rcText = rtRect;
long nPy = rtRect.bottom - rtRect.top;
long nPx = rtRect.right - rtRect.left;
if(nPy & 0x0001) rcText.top ++;
nPy = (nPy - m_nWidth + 1) / 2;
nPx = (nPx - txSize.cx - m_nWidth - 6) / 2;
DrawIconEx(hdc, nPx, nPy, m_hIcon, m_nWidth,
m_nWidth, 0, NULL, DI_NORMAL);
// Button的文字
SetBkMode(hdc, TRANSPARENT);
if( !IsWindowEnabled() )
SetTextColor(hdc, RGB(128, 128, 128));
rcText.left = (nPx + m_nWidth + 6);
DrawText(hdc, lpText, nLength, &rcText,
DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// 画出Focus状态
if( (lpStruct->itemState & ODS_FOCUS) )
{
FrameRect( hdc, rtRect, (HBRUSH)
GetStockObject(BLACK_BRUSH));
rtRect.DeflateRect(3, 3);
DrawFocusRect(hdc, &rtRect);
}
// 释放画笔句柄
SelectObject(hdc, hOldPen);
DeleteObject(hNewPen);
// 释放画刷句柄
SelectObject(hdc, hOldBrush);
DeleteObject(hNewBrush);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -