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

📄 btnst.cpp

📁 一个能轻松实现界面设计比特图按钮的小程序
💻 CPP
字号:
// BtnST.cpp : implementation file
//

#include "stdafx.h"
#include "BtnST.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CButtonST

CButtonST::CButtonST()
{
	m_MouseOnButton = FALSE;
	
	m_hIconIn = NULL;
	m_hIconOut = NULL;
	m_cxIcon = 0;
	m_cyIcon = 0;
	
	//默认为平按钮(注意PPC按钮本来就是平的)
	m_bIsFlat = TRUE; 
	
	//默认为平按钮绘画边框
	m_bDrawBorder = FALSE; 
	
	// 默认水平绘画图标
	m_nAlign = ST_ALIGN_HORIZ; 
	
	//默认显示按钮文本
	m_bShowText = TRUE; 
	
	//默认对平按钮不成为焦点
	m_bDrawFlatFocus = FALSE;
	
	SetDefaultInactiveBgColor();
	SetDefaultInactiveFgColor();
	SetDefaultActiveBgColor();
	SetDefaultActiveFgColor();
}


CButtonST::~CButtonST()
{
	//销毁图标
	if (m_hIconIn != NULL)
	{
		::DeleteObject(m_hIconIn);
	}
	if (m_hIconOut != NULL)
	{
		::DeleteObject(m_hIconOut);
	}
}


BEGIN_MESSAGE_MAP(CButtonST, CButton)
    //{{AFX_MSG_MAP(CButtonST)
	ON_WM_CAPTURECHANGED()
	ON_WM_SETCURSOR()
	ON_WM_KILLFOCUS()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()

	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CButtonST::SetIcon(int nIconInId, int nIconOutId, BYTE cx, BYTE cy)
{
	HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),RT_GROUP_ICON);

	//鼠标在按钮内时的图标(对PPC这项没用)
	m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
	
	//鼠标在按钮外时的图标(对PPC这项没用)
	m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
	
	m_cxIcon = cx;
	m_cyIcon = cy;
	
	RedrawWindow();
}


void CButtonST::SetFlat(BOOL bState)
{
	m_bIsFlat = bState;
	Invalidate();
}


BOOL CButtonST::GetFlat()
{
	return m_bIsFlat;
}


void CButtonST::SetAlign(int nAlign)
{
	switch (nAlign)
	{    
    case ST_ALIGN_HORIZ:
		m_nAlign = ST_ALIGN_HORIZ;
		break;
    case ST_ALIGN_VERT:
		m_nAlign = ST_ALIGN_VERT;
		break;
	}
	Invalidate();
}


int CButtonST::GetAlign()
{
	return m_nAlign;
}


void CButtonST::DrawBorder(BOOL bEnable)
{
	m_bDrawBorder = bEnable;
}


const char* CButtonST::GetVersionC()
{
	return "2.3";
}


const short CButtonST::GetVersionI()
{
	return 23;
}


void CButtonST::SetShowText(BOOL bShow)
{
	m_bShowText = bShow;
	Invalidate();
}


BOOL CButtonST::GetShowText()
{
	return m_bShowText;
}


void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
	CWnd* pWnd;
	CWnd* pParent;
	
	CButton::OnMouseMove(nFlags, point);
	
	TRACE(L"Move!!  ");
	//如果鼠标在按下的情况下进入按钮范围
	//不做操作
	if (((nFlags & MK_LBUTTON)||(nFlags & MK_RBUTTON)) && m_MouseOnButton == FALSE)
	{
		return;
	}
	
	//如果不是平按钮,不做操作
	if (m_bIsFlat == FALSE)
	{
		return;
	}
	
	pWnd = GetActiveWindow();
	pParent = GetOwner();

	if ((GetCapture() != this) && (pParent != NULL)) 
	{
		m_MouseOnButton = TRUE;
		//SetFocus();
		SetCapture();
		Invalidate();
	}
	else
	{
		CRect rc;
		GetClientRect(&rc);
		if (!rc.PtInRect(point))
		{
			//如果鼠标在按钮外,则重绘
			if (m_MouseOnButton == TRUE)
			{
				m_MouseOnButton = FALSE;
				Invalidate();
			}
			//如果左键没有按下,则停止捕获
			if (!(((nFlags & MK_LBUTTON)||(nFlags & MK_RBUTTON))))
			{
				ReleaseCapture();
			}
		}
	}
}

void CButtonST::OnLButtonDown(UINT nFlags, CPoint point)
{
	CWnd* pWnd;
	CWnd* pParent;
	
	CButton::OnMouseMove(nFlags, point);
	
	TRACE(L"LDown!!  ");
	//如果鼠标在按下的情况下进入按钮范围
	//不做操作
	if (((nFlags & MK_LBUTTON)||(nFlags & MK_RBUTTON)) && m_MouseOnButton == FALSE)
	{
		return;
	}
	
	//如果不是平按钮,不做操作
	if (m_bIsFlat == FALSE)
	{
		return;
	}
	
	pWnd = GetActiveWindow();
	pParent = GetOwner();

	if ((GetCapture() != this) && (pParent != NULL)) 
	{
		m_MouseOnButton = TRUE;
		//SetFocus();
		SetCapture();
		Invalidate();
	}
	else
	{
		CRect rc;
		GetClientRect(&rc);
		if (!rc.PtInRect(point))
		{
			//如果鼠标在按钮外,则重绘
			if (m_MouseOnButton == TRUE)
			{
				m_MouseOnButton = FALSE;
				Invalidate();
			}
			//如果左键没有按下,则停止捕获
			if (!(((nFlags & MK_LBUTTON)||(nFlags & MK_RBUTTON))))
			{
				ReleaseCapture();
			}
		}
	}
}


void CButtonST::OnKillFocus(CWnd * pNewWnd)
{
	CButton::OnKillFocus(pNewWnd);
	
	//如果不是平按钮,不做操作
	if (m_bIsFlat == FALSE)
	{
		return;
	}
	
	if (m_MouseOnButton == TRUE)
	{
		m_MouseOnButton = FALSE;
		Invalidate();
	}
}


void CButtonST::OnCaptureChanged(CWnd *pWnd) 
{
	if (m_MouseOnButton == TRUE)
	{
		ReleaseCapture();
		Invalidate();
	}

	// Call base message handler
	CButton::OnCaptureChanged(pWnd);
}


void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	
	TRACE(L"DRAWITEM\r\n");
	
	CPen *pOldPen;
	BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
	BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
	BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
	
	CRect itemRect = lpDIS->rcItem;
	
	if (m_bIsFlat == FALSE)
	{
		if (bIsFocused)
		{
			CBrush br(RGB(0,0,0));  
			pDC->FrameRect(&itemRect, &br);
			itemRect.DeflateRect(1, 1);
		}
	}
	
	//准备绘画,用背景颜色填充背景区域
	COLORREF bgColor;
	if ((m_MouseOnButton == TRUE) || (bIsPressed))
	{
		bgColor = GetActiveBgColor();
	}
	else
	{
		bgColor = GetInactiveBgColor();
	}
	
	CBrush br(bgColor);
	pDC->FillRect(&itemRect, &br);
	
	
	//画按下的按钮
	if(bIsPressed)
	{
		TRACE(L"PRESSED\r\n");
		if (m_bIsFlat == TRUE)
		{
			if (m_bDrawBorder == TRUE)
			{
				CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_HIGHLIGHT)); // Bianco
				CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
				
				//话边框
				//深灰线
				pOldPen = pDC->SelectObject(&penBtnShadow);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.left, itemRect.top);
				pDC->LineTo(itemRect.right, itemRect.top);
				//白线
				pDC->SelectObject(penBtnHiLight);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.top-1);
				//恢复画笔
				pDC->SelectObject(pOldPen);
			}
		}
		else    
		{
			CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
			pDC->FrameRect(&itemRect, &brBtnShadow);
		}
	}
	else //画未按下的按钮
	{
		CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_HIGHLIGHT)); //白
		CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       //浅灰
		CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   //深灰
		CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); //黑
		
		if (m_bIsFlat == TRUE)
		{
			if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
			{
				//画边框
				//白线
				pOldPen = pDC->SelectObject(&penBtnHiLight);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.left, itemRect.top);
				pDC->LineTo(itemRect.right, itemRect.top);
				//深灰线
				pDC->SelectObject(penBtnShadow);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.top-1);
				//恢复画笔
				pDC->SelectObject(pOldPen);
			}
		}
		else
		{
			//白线
			pOldPen = pDC->SelectObject(&penBtnHiLight);
			pDC->MoveTo(itemRect.left, itemRect.bottom-1);
			pDC->LineTo(itemRect.left, itemRect.top);
			pDC->LineTo(itemRect.right, itemRect.top);
			//浅灰线
			pDC->SelectObject(pen3DLight);
			pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
			pDC->LineTo(itemRect.left+1, itemRect.top+1);
			pDC->LineTo(itemRect.right, itemRect.top+1);
			//黑线
			pDC->SelectObject(pen3DDKShadow);
			pDC->MoveTo(itemRect.left, itemRect.bottom-1);
			pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
			pDC->LineTo(itemRect.right-1, itemRect.top-1);
			//深灰线
			pDC->SelectObject(penBtnShadow);
			pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
			pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
			pDC->LineTo(itemRect.right-2, itemRect.top);
			//恢复画笔
			pDC->SelectObject(pOldPen);
		}
	}
	
	//读取按钮字符
	CString sTitle;
	GetWindowText(sTitle);
	
	//如果不想显示字符
	if (m_bShowText == FALSE)
	{
		sTitle.Empty();
	}
	
	CRect captionRect = lpDIS->rcItem;

	captionRect.top += captionRect.Height()/2-8;
	
	//画图标
	if (m_hIconIn != NULL)
	{
		DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
	}
	
	//如果有的话,写上字符
	if (sTitle.IsEmpty() == FALSE)
	{
		if (bIsPressed)
		{
			captionRect.OffsetRect(1,1);
		}
		
		if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
		{
			pDC->SetTextColor(GetActiveFgColor());
			pDC->SetBkColor(GetActiveBgColor());
		} 
		else 
		{
			pDC->SetTextColor(GetInactiveFgColor());
			pDC->SetBkColor(GetInactiveBgColor());
		}
		//文本居中
		CRect centerRect = captionRect;
		pDC->DrawText(sTitle, sTitle.GetLength(), captionRect, NULL);//DT_SINGLELINE|DT_CALCRECT);
		captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
		
	}
	
	if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
	{
		//画焦点边框
		if (bIsFocused)
		{
			CRect focusRect = itemRect;
			focusRect.DeflateRect(3, 3);
			pDC->DrawFocusRect(&focusRect);
		}
	}
}


void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
{
	CRect iconRect = rcItem;
	
	switch (m_nAlign)
	{
    case ST_ALIGN_HORIZ:
		if (title->IsEmpty())
		{
			//图标水平居中
			iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
		}
		else
		{
			iconRect.left += 3;  
			captionRect->left += m_cxIcon + 3;
		}
		//图标竖直居中
		iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
		break;
    case ST_ALIGN_VERT:
		//图标水平居中
		iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
		if (title->IsEmpty())
		{
			//图标竖直居中
			iconRect.top += ((iconRect.Height() - m_cyIcon)/2);           
		}
		else
		{
			captionRect->top += m_cyIcon;
		}
		break;
	}
    
	//如果按钮按下,图标也要按下
	if (IsPressed)
	{
		iconRect.OffsetRect(1,1);
	}
	//Ole
	pDC->DrawIcon(iconRect.TopLeft().x, 
		iconRect.TopLeft().y, 
		(m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut);
}


void CButtonST::PreSubclassWindow() 
{
	//增加BS_OWNERDRAW样式
	SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
	CButton::PreSubclassWindow();
}


void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
{
	m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crInactiveBg = crNew; 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


const COLORREF CButtonST::GetInactiveBgColor()
{
	return m_crInactiveBg;
}


void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
{
	m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crInactiveFg = crNew; 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


const COLORREF CButtonST::GetInactiveFgColor()
{
	return m_crInactiveFg;
}


void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
{
	m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crActiveBg = crNew; 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


const COLORREF CButtonST::GetActiveBgColor()
{
	return m_crActiveBg;
}


void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
{
	m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crActiveFg = crNew; 
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


const COLORREF CButtonST::GetActiveFgColor()
{
	return m_crActiveFg;
}


void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
{
	m_bDrawFlatFocus = bDrawFlatFocus;
	
	if (bRepaint == TRUE)
	{
		Invalidate();
	}
}


BOOL CButtonST::GetFlatFocus()
{
	return m_bDrawFlatFocus;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -