⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iconbutton.cpp

📁 对c++中的各种ui对象进行封装
💻 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 + -