VC++ CButton自绘

头文件定义(CSWButton.h):

#pragma once
#include "afxwin.h"
#include <afxcmn.h>

class CSWButton :
	public CButton
{
	DECLARE_DYNAMIC(CSWButton)

public:
	enum BUTTON_STATUS//按钮状态
	{
		BTNST_NULL,	// 正常
		BTNST_STAY,	// 鼠标停留
		BTNST_DISB,	// 失效
	};

	enum ICON_ALIGN//图片对齐方式
	{
		ICOALIGN_CENTER,
		ICOALIGN_LEFT,
		ICOALIGN_RIGHT,
		ICOALIGN_TOP,
		ICOALIGN_BOTTOM,
	};
public:
	CSWButton();
	~CSWButton();

	void SetToolTipText(LPCSTR lpszWindowText, BOOL bActivate = TRUE);
	void ActivateTooltip(BOOL bActivate = TRUE);
	void NoticeBkgrUpdate();

protected:
	void CommonConstruct(); // 初始化
	void InitToolTip();

private:
	std::string			m_sFontName;
	int					m_nFontSize;
	Gdiplus::Color		m_crFont;
	int					m_nIcoAlign;
	
protected:
	CToolTipCtrl		m_ToolTip;
	RECT				m_rcImageWindow;
	Gdiplus::Image*		m_pBkgrBitmap;
	CSize				m_sizeBkgrBitmap;
	CBrush				m_brBkgr;
	CPen				m_penBorder;
	CDC					m_dcBkgr;
	BOOL				m_bTracking;
	BOOL				m_bTabStop;
	BOOL				m_bMuliStatus;//是否多态

protected:
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	virtual void PreSubclassWindow();
	virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);

protected:
	DECLARE_MESSAGE_MAP()
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnCaptureChanged(CWnd *pWnd);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);

public:
	// 设置窗口背景图片
	void SetBackgroundColor(COLORREF color, COLORREF border, BOOL bRepaint = TRUE);

	/*
	lpszImageName: 背景图片句柄
	rcWindow: 窗口区域
	rcClient:客户区区域
	*/
	void SetBackgroundImage(HBITMAP hBitmap, BOOL bMuliStatus = FALSE, RECT* rcWindow = NULL, BOOL bRepaint = TRUE);

	/*
	lpszImageName: 背景图片资源ID
	rcWindow: 窗口区域
	rcClient:客户区区域
	*/
	void SetBackgroundImage(UINT uiBmpResId, BOOL bMuliStatus = FALSE, RECT* rcWindow = NULL, BOOL bRepaint = TRUE);

	/*
		lpszImageName: 背景图片名称
		rcWindow: 窗口区域
		rcClient:客户区区域
	*/
	void SetBackgroundImage(LPCTSTR lpszImageName, BOOL bMuliStatus = FALSE, RECT* rcWindow = NULL, BOOL bRepaint = TRUE);

	// 图标对齐方式
	void SetIcoAlign(int nAlign = ICOALIGN_CENTER);
};

源码实现(CSWButton.cpp):

#include "StdAfx.h"
#include "CSWButton.h"


IMPLEMENT_DYNAMIC(CSWButton, CButton)

CSWButton::CSWButton()
{
	CommonConstruct();
}

CSWButton::~CSWButton(void)
{
}

void CSWButton::CommonConstruct()
{
	m_ToolTip.m_hWnd = NULL;
	m_crFont = Gdiplus::Color(255, 0, 0, 0);
	m_nIcoAlign = ICOALIGN_CENTER;
	m_sFontName = _T("宋体");
	m_nFontSize = 9;
	m_bTabStop = FALSE;
	m_bTracking = FALSE;
	m_penBorder.CreatePen(PS_DOT, 2, RGB(255, 255, 255));
}

void CSWButton::SetBackgroundColor(COLORREF color, COLORREF border, BOOL bRepaint)
{
	if (m_brBkgr.GetSafeHandle() != NULL)
	{
		m_brBkgr.DeleteObject();
	}

	if (color != (COLORREF)-1)
	{
		m_brBkgr.CreateSolidBrush(color);
	}

	if (m_penBorder.GetSafeHandle() != NULL)
	{
		m_penBorder.DeleteObject();
	}

	if (border != (COLORREF)-1)
	{
		m_penBorder.CreatePen(PS_DOT, 2, border);
	}
	else
	{
		m_penBorder.CreatePen(PS_DOT, 2, RGB(255, 255, 255));
	}

	if (bRepaint && GetSafeHwnd() != NULL)
	{
		Invalidate();
		UpdateWindow();
	}
}

void CSWButton::SetBackgroundImage(HBITMAP hBitmap, BOOL bMuliStatus, RECT* rcWindow, BOOL bRepaint)
{
	m_pBkgrBitmap = NULL;
	m_bMuliStatus = bMuliStatus;

	// 如果图像中没有透明度,调用方法如下:
	// m_pBkgrBitmap = Gdiplus::Bitmap::FromHBITMAP(hBitmap, NULL),
	// 但是如果存在透明度,上面方法就是丢失掉图像中的Alpha信息,具有透明度的像素点将显示黑色,改用如下方法:
	BITMAP bmp = { 0 };
	if (0 == GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bmp))
		return;

	BYTE *piexlsSrc = NULL;
	LONG cbSize = bmp.bmWidthBytes * bmp.bmHeight;
	piexlsSrc = new BYTE[cbSize];

	BITMAPINFO bmpInfo = { 0 };
	bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
	bmpInfo.bmiHeader.biHeight = bmp.bmHeight;
	bmpInfo.bmiHeader.biPlanes = bmp.bmPlanes;
	bmpInfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
	bmpInfo.bmiHeader.biCompression = BI_RGB;

	HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
	LONG cbCopied = GetDIBits(hdcScreen, hBitmap, 0,
		bmp.bmHeight, piexlsSrc, &bmpInfo, DIB_RGB_COLORS);
	DeleteDC(hdcScreen);
	if (0 == cbCopied)
	{
		delete[] piexlsSrc;
		return;
	}

	PixelFormat pf = bmp.bmBitsPixel == 32 ? PixelFormat32bppPARGB : PixelFormat24bppRGB;
	Bitmap *pBitmap = new Bitmap(bmp.bmWidth, bmp.bmHeight, pf);
	BitmapData bitmapData;
	Rect rect(0, 0, bmp.bmWidth, bmp.bmHeight);
	if (Ok != pBitmap->LockBits(&rect, ImageLockModeRead,
		pf, &bitmapData))
	{
		delete pBitmap;
		pBitmap = NULL;
		return;
	}

	BYTE *pixelsDest = (BYTE*)bitmapData.Scan0;
	int nLinesize = (((bmp.bmBitsPixel*bmp.bmPlanes*bmp.bmWidth + 31) & ~31) >> 3);
	int nHeight = bmp.bmHeight;
	for (int y = 0; y < nHeight; y++)
	{
		memcpy_s((pixelsDest + y * nLinesize), nLinesize,
			(piexlsSrc + (nHeight - y - 1) * nLinesize), nLinesize);
	}

	if (Ok != pBitmap->UnlockBits(&bitmapData))
	{
		delete pBitmap;
		pBitmap = NULL;
	}

	delete[] piexlsSrc;
	m_pBkgrBitmap = pBitmap;
	if (m_pBkgrBitmap)
	{
		if (rcWindow == NULL)
			m_rcImageWindow = CRect(0, 0, m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		else
			m_rcImageWindow = *rcWindow;
		if (m_bMuliStatus)
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth() / 3, m_pBkgrBitmap->GetHeight());
		else
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		if (bRepaint && GetSafeHwnd() != NULL)
		{
			Invalidate();
			UpdateWindow();
		}
	}
}

void CSWButton::SetBackgroundImage(UINT uiBmpResId, BOOL bMuliStatus, RECT* rcWindow, BOOL bRepaint)
{
	m_bMuliStatus = bMuliStatus;
	m_pBkgrBitmap = CImageFactory::getSingletonPtr()->GetSkinItemImage(uiBmpResId, RT_BITMAP);
	if (m_pBkgrBitmap)
	{
		if (rcWindow == NULL)
			m_rcImageWindow = CRect(0, 0, m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		else
			m_rcImageWindow = *rcWindow;
		if (m_bMuliStatus)
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth() / 3, m_pBkgrBitmap->GetHeight());
		else
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		if (bRepaint && GetSafeHwnd() != NULL)
		{
			Invalidate();
			UpdateWindow();
		}
	}
}

void CSWButton::SetBackgroundImage(LPCTSTR lpszImageName, BOOL bMuliStatus, RECT* rcWindow,BOOL bRepaint)
{
	m_bMuliStatus = bMuliStatus;
	m_pBkgrBitmap = CImageFactory::getSingletonPtr()->GetSkinItemImage(lpszImageName);
	if (m_pBkgrBitmap)
	{
		if (rcWindow == NULL)
			m_rcImageWindow = CRect(0, 0, m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		else
			m_rcImageWindow = *rcWindow;
		if (m_bMuliStatus)
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth() / 3, m_pBkgrBitmap->GetHeight());
		else
			m_sizeBkgrBitmap = CSize(m_pBkgrBitmap->GetWidth(), m_pBkgrBitmap->GetHeight());
		if (bRepaint && GetSafeHwnd() != NULL)
		{
			Invalidate();
			UpdateWindow();
		}
	}
}

void CSWButton::InitToolTip()
{
	if (m_ToolTip.m_hWnd == NULL)
	{
		m_ToolTip.Create(this);
		m_ToolTip.Activate(FALSE);
	}
}

void CSWButton::SetToolTipText(LPCSTR lpszWindowText, BOOL bActivate/* = TRUE*/)
{
	if (lpszWindowText == NULL)
		return;

	InitToolTip();
	if (m_ToolTip.GetToolCount() == 0)
	{
		CRect rectBtn; 
		GetClientRect(rectBtn);
		m_ToolTip.AddTool(this, (LPCTSTR)lpszWindowText, rectBtn, 1);
	}
	m_ToolTip.UpdateTipText((LPCTSTR)lpszWindowText, this, 1);
	m_ToolTip.Activate(bActivate);
}

void CSWButton::ActivateTooltip(BOOL bActivate/* = TRUE*/)
{
	if (m_ToolTip.GetToolCount() == 0) 
		return;

	m_ToolTip.Activate(bActivate);
}

BOOL CSWButton::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	InitToolTip();
	m_ToolTip.RelayEvent(pMsg);

	return CButton::PreTranslateMessage(pMsg);
}

void CSWButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// TODO:  添加您的代码以绘制指定项
	CRect rcClient;
	GetClientRect(&rcClient);
	CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	pDC->SetBkMode(TRANSPARENT); //BST_UNCHECKED ODS_FOCUS	
	BOOL bIsFocused = /*(lpDrawItemStruct->itemState & ODS_FOCUS) ||*/ (lpDrawItemStruct->itemState & ODS_SELECTED) || (lpDrawItemStruct->itemState & ODS_CHECKED) || (GetCheck() == BST_CHECKED);
	BOOL bIsDisabled = (lpDrawItemStruct->itemState & ODS_GRAYED) || (lpDrawItemStruct->itemState & ODS_DISABLED);
	pDC->FillRect(rcClient, &m_brBkgr);
	if (m_pBkgrBitmap == NULL)
	{
		if (m_brBkgr.GetSafeHandle() != NULL)
		{
			pDC->FillRect(rcClient, &m_brBkgr);
		}
		else
		{
			// 复制父窗口背景
			CClientDC dcParentBkgr(GetParent());
			CRect rcWindow;	GetWindowRect(rcWindow);
			GetParent()->ScreenToClient(rcWindow);

			if (m_dcBkgr.m_hDC == NULL)
			{
				m_dcBkgr.CreateCompatibleDC(&dcParentBkgr);
				CBitmap		m_bmpBk;
				CBitmap*	m_pbmpOldBk;
				HBITMAP hBmp = ::CreateCompatibleBitmap(dcParentBkgr.GetSafeHdc(), rcClient.Width(), rcClient.Height());
				HBITMAP hOldBmp = (HBITMAP)dcParentBkgr.SelectObject(hBmp);
				m_dcBkgr.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcParentBkgr, rcWindow.left, rcWindow.top, SRCCOPY);
				dcParentBkgr.SelectObject(hOldBmp);
				DeleteObject(hBmp);
			}

			pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_dcBkgr, 0, 0, SRCCOPY);
		}

		if (m_penBorder.GetSafeHandle() != NULL)
		{
			HBRUSH hOldBrush = (HBRUSH)::SelectObject(pDC->GetSafeHdc(), (HBRUSH)::GetStockObject(HOLLOW_BRUSH)); // 选择一个空的画刷
			HPEN hOldPen = (HPEN)::SelectObject(pDC->GetSafeHdc(), (HPEN)m_penBorder.GetSafeHandle());
			pDC->Rectangle(rcClient);
			::SelectObject(pDC->GetSafeHdc(), hOldBrush);
			::SelectObject(pDC->GetSafeHdc(), hOldPen);
		}

		return;
	}
	else
	{
		CRect rcWindow;	GetWindowRect(rcWindow);
		GetParent()->ScreenToClient(rcWindow);
		if (m_dcBkgr.m_hDC == NULL)
		{
			// 复制父窗口背景
			CClientDC dcParentBkgr(GetParent());
			m_dcBkgr.CreateCompatibleDC(&dcParentBkgr);
			CBitmap		m_bmpBk;
			CBitmap*	m_pbmpOldBk;
			HBITMAP hBmp = ::CreateCompatibleBitmap(dcParentBkgr.GetSafeHdc(), rcClient.Width(), rcClient.Height());
			HBITMAP hOldBmp = (HBITMAP)dcParentBkgr.SelectObject(hBmp);
			m_dcBkgr.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcParentBkgr, rcWindow.left, rcWindow.top, SRCCOPY);
			dcParentBkgr.SelectObject(hOldBmp);
			DeleteObject(hBmp);
		}

		pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_dcBkgr, 0, 0, SRCCOPY);
	}

	sw::CMemDC dcMem(*pDC, rcClient);
	Gdiplus::Graphics g(dcMem);
	CRect rcClipImage = m_rcImageWindow;
	if (m_bMuliStatus)
	{
		if (bIsDisabled)
			rcClipImage.OffsetRect(m_sizeBkgrBitmap.cx * 2, 0);
		else if (bIsFocused)
			rcClipImage.OffsetRect(m_sizeBkgrBitmap.cx, 0);
	}
	else
	{
		if (bIsDisabled)
			;// rcClipImage灰度调节
		else if (bIsFocused)
			;// rcClipImage亮度调节
	}

	char szWindowText[_MAX_PATH] = { 0 };
	GetWindowText(szWindowText, _MAX_PATH);
	CRect rcShowImage = rcClient;
	CRect rcShowText = rcClient;
	int nEdge = 5;	// 为了保证图标显示不至于靠近边缘,这里设置边缘间距为5
	if (m_nIcoAlign == ICOALIGN_LEFT)
	{
		rcShowImage.left += nEdge;
		rcShowImage.top = (rcClient.Height() - m_sizeBkgrBitmap.cy) / 2;
		rcShowImage.bottom = rcShowImage.top + m_sizeBkgrBitmap.cy;
		rcShowImage.right = rcShowImage.left + m_sizeBkgrBitmap.cx;

		rcShowText.left = rcShowImage.right;
	}
	else if (m_nIcoAlign == ICOALIGN_RIGHT)
	{
		rcShowImage.left = rcClient.right - m_sizeBkgrBitmap.cx - nEdge;
		rcShowImage.right = rcClient.right - nEdge;
		rcShowImage.top = rcClient.bottom - m_sizeBkgrBitmap.cy;
		rcShowImage.bottom = rcShowImage.top + m_sizeBkgrBitmap.cy;

		rcShowText.right = rcShowImage.left;
	}
	else if (m_nIcoAlign == ICOALIGN_TOP)
	{
		rcShowImage.top += nEdge;
		rcShowImage.left = (rcClient.Width() - m_sizeBkgrBitmap.cx) / 2;
		rcShowImage.right = rcShowImage.left + m_sizeBkgrBitmap.cx;
		rcShowImage.bottom = rcShowImage.top + m_sizeBkgrBitmap.cy + 2;

		rcShowText.top = rcShowImage.bottom;
	}
	else if (m_nIcoAlign == ICOALIGN_BOTTOM)
	{
		rcShowImage.left = (rcClient.Width() - m_sizeBkgrBitmap.cx) / 2;
		rcShowImage.right = rcShowImage.left + m_sizeBkgrBitmap.cx;
		rcShowImage.top = rcClient.bottom - m_sizeBkgrBitmap.cy - nEdge;
		rcShowImage.bottom = rcClient.bottom - nEdge;

		rcShowText.bottom = rcShowImage.top;
	}
	else
	{
		if (!rcShowText.IsRectEmpty() && strlen(szWindowText) > 0)
		{
			// 显示文字
			rcShowImage.left = (rcClient.Width() - m_sizeBkgrBitmap.cx) / 2;
			rcShowImage.right = rcShowImage.left + m_sizeBkgrBitmap.cx;
			rcShowImage.bottom = m_sizeBkgrBitmap.cy;
			rcShowText.top = rcShowImage.bottom;
		}
// 		rcShowImage.left = (rcClient.Width() - m_sizeBkgrBitmap.cx / 3) / 2;
// 		rcShowImage.right = rcShowImage.left + m_sizeBkgrBitmap.cx / 3;
// 		rcShowImage.top = rcClient.bottom - m_sizeBkgrBitmap.cy / 2;
// 		rcShowImage.bottom = rcShowImage.top + m_sizeBkgrBitmap.cy;
	}

	g.DrawImage(m_pBkgrBitmap, RectF(rcShowImage.left, rcShowImage.top, rcShowImage.Width(), rcShowImage.Height()), rcClipImage.left, rcClipImage.top, rcClipImage.Width(), rcClipImage.Height(), UnitPixel, NULL, NULL, NULL);
    if (!rcShowText.IsRectEmpty() && strlen(szWindowText)>0)
	{
		std::wstring wsFont = CStringHelper::Ansi2Unicode(m_sFontName.c_str());
		Gdiplus::Font font(wsFont.c_str(), m_nFontSize, (bIsFocused|| m_bTracking) ? (FontStyleRegular | FontStyleUnderline) : FontStyleRegular);
		StringFormat stringFormat;
		stringFormat.SetFormatFlags(StringFormatFlagsNoWrap);
		stringFormat.SetAlignment(StringAlignmentCenter);
		stringFormat.SetLineAlignment(StringAlignmentCenter);
		std::wstring wsTitle = CStringHelper::Ansi2Unicode(szWindowText);
		SolidBrush brush(m_crFont);
		g.SetTextRenderingHint(TextRenderingHintAntiAlias);
		g.DrawString(wsTitle.c_str(), wsTitle.size(), &font, RectF(rcShowText.left, rcShowText.top, rcShowText.Width(), rcShowText.Height()), &stringFormat, &brush);
	}

	if ((m_bTracking) || (!m_bMuliStatus && bIsFocused && m_penBorder.GetSafeHandle() && m_bTabStop))
	{
		rcClient.DeflateRect(1, 1, 1, 1);

		LOGPEN logPen;
		m_penBorder.GetLogPen(&logPen);
		Gdiplus::Pen pen(Color(255, 255-GetRValue(logPen.lopnColor), 255-GetGValue(logPen.lopnColor), 255-GetBValue(logPen.lopnColor)));
		pen.SetDashStyle(Gdiplus::DashStyle::DashStyleDot);
		// 直角矩形
		//g.DrawRectangle(&pen, rcClient.left+1, rcClient.top+1, rcClient.Width()-2, rcClient.Height()-2);
		// 圆角矩形
		int nRadius = 2;
		GraphicsPath* path = new GraphicsPath;
		path->StartFigure();
		path->AddArc((REAL)rcClient.left, (REAL)rcClient.top, (REAL)nRadius * 2, (REAL)nRadius * 2, 180.0, 90.0);
		path->AddArc((REAL)rcClient.left + rcClient.Width() - nRadius * 2, (REAL)rcClient.top, (REAL)nRadius  * 2, (REAL)nRadius * 2, 270.0, 90.0);
		path->AddArc((REAL)rcClient.left + rcClient.Width() - nRadius * 2, (REAL)rcClient.top + rcClient.Height() - nRadius * 2, (REAL)nRadius * 2, (REAL)nRadius * 2, 0.0, 90.0);
		path->AddArc((REAL)rcClient.left, (REAL)rcClient.top + rcClient.Height() - nRadius * 2, (REAL)nRadius * 2, (REAL)nRadius * 2, 90.0, 90.0);
		path->CloseFigure();
		g.DrawPath(&pen, path);
	}
}

void CSWButton::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE);// GetButtonStyle();
	if (dwStyle & BS_DEFPUSHBUTTON)
		m_bTracking = TRUE;
	if (dwStyle & WS_TABSTOP)
		m_bTabStop = TRUE;
	SetButtonStyle(dwStyle | BS_OWNERDRAW);
	CButton::PreSubclassWindow();
	//ModifyStyle(WS_TABSTOP, 0);
}

BEGIN_MESSAGE_MAP(CSWButton, CButton)
	ON_WM_DRAWITEM()
	ON_WM_KILLFOCUS()
	ON_WM_MOUSEMOVE()
	ON_WM_CAPTURECHANGED()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

void CSWButton::OnKillFocus(CWnd* pNewWnd)
{
	CButton::OnKillFocus(pNewWnd);

	// TODO: 在此处添加消息处理程序代码
	m_bTracking = FALSE;
	Invalidate();
}


void CSWButton::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CButton::OnMouseMove(nFlags, point);

	if (nFlags & MK_LBUTTON && m_bTracking == FALSE)
		return;

	CWnd* pWnd = GetActiveWindow();
	CWnd* pParent = GetOwner();
	if ((GetCapture() != this) && (pWnd != NULL && pParent != NULL)) 
	{
		m_bTracking = TRUE;
		SetCapture();
		InvalidateRect(NULL, TRUE);
	}
	else
	{
		POINT p2 = point;
		ClientToScreen(&p2);
		CWnd* wndUnderMouse = WindowFromPoint(p2);
		if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd)
		{
			if (m_bTracking == TRUE)
			{
				m_bTracking = FALSE;
				InvalidateRect(NULL, TRUE);
			}
			if (!(nFlags & MK_LBUTTON)) 
				ReleaseCapture();
		}
	}
}


void CSWButton::OnCaptureChanged(CWnd *pWnd)
{
	// TODO: 在此处添加消息处理程序代码
	if (m_bTracking == TRUE)
	{
		ReleaseCapture();
		Invalidate();
	}

	CButton::OnCaptureChanged(pWnd);
}


void CSWButton::NoticeBkgrUpdate()
{
	if (m_dcBkgr.m_hDC != NULL)
		m_dcBkgr.DeleteDC();
	
	InvalidateRect(NULL, FALSE);
}

BOOL CSWButton::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rcClient;
	GetClientRect(&rcClient);
	CRect rcWindow;	GetWindowRect(rcWindow);
	GetParent()->ScreenToClient(rcWindow);
	if (m_dcBkgr.m_hDC == NULL)
	{
		// 复制父窗口背景
		CClientDC dcParentBkgr(GetParent());
		m_dcBkgr.CreateCompatibleDC(&dcParentBkgr);
		CBitmap		m_bmpBk;
		CBitmap*	m_pbmpOldBk;
		HBITMAP hBmp = ::CreateCompatibleBitmap(dcParentBkgr.GetSafeHdc(), rcClient.Width(), rcClient.Height());
		HBITMAP hOldBmp = (HBITMAP)m_dcBkgr.SelectObject(hBmp);
		m_dcBkgr.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcParentBkgr, rcWindow.left, rcWindow.top, SRCCOPY);
		DeleteObject(hBmp);
	}

	pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_dcBkgr, 0, 0, SRCCOPY);
	return TRUE;// CButton::OnEraseBkgnd(pDC);
}


void CSWButton::SetIcoAlign(int nAlign)
{
	m_nIcoAlign = nAlign;
	InvalidateRect(NULL);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值