头文件定义(CSWButton.h):
#pragma once
#include "afxwin.h"
#include
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);
}