环境设置:需要有GDIPlus,并设置好相应的路径
程序代码如下:
//stdafx.h
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include <GdiPlus.h>
#pragma comment(lib,"GdiPlus.lib")
using namespace Gdiplus;
//你的APP文件(.h)
class C**App : public CWinApp
增加变量 : ULONG_PTR m_gdiplusToken;
增加方法 : virtual int ExitInstance();
//你的APP文件(.cpp)
BOOL C**App::InitInstance()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
****以下默认****
}
int C**App::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
下面转入正题:
//ImageButton.h
// Origin Author : Darren Sessions //
// Origin Class : GdipButton //
// http://www.codeproject.com/KB/buttons/GdipButton.aspx //
// Modify: wxy3064one##163.com //
// (1)支持Flat和正常显示 //
// (2)删除了Alter相关的处理 //
// (3)图片居中显示 //
// //
// Date: 2010-5-20 //
#pragma once
class CMemDC : public CDC
{
public:
CMemDC(CDC* pDC, const CRect& rect) : CDC(), m_pOldBitmap(NULL), m_pDC(pDC)
{
ASSERT(m_pDC != NULL);
#ifndef WCE_NO_PRINTING
m_bValid = !pDC->IsPrinting();
#else
m_bValid = FALSE;
#endif
if (m_bValid){
if (CreateCompatibleDC(m_pDC))
{
SetMapMode(m_pDC->GetMapMode());
if ( rect == CRect(0,0,0,0) )
pDC->GetClipBox(&m_rc);
else
m_rc = rect;
m_bitmap.CreateCompatibleBitmap(m_pDC, m_rc.Width(), m_rc.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
#ifndef _WIN32_WCE
SetWindowOrg(m_rc.left, m_rc.top);
#endif
}
else
{
m_bValid = FALSE;
m_pOldBitmap = NULL;
}
} else {
#ifndef WCE_NO_PRINTING
m_bPrinting = pDC->m_bPrinting;
#endif
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}
virtual ~CMemDC()
{
if (m_bValid)
{
m_pDC->BitBlt(m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(),this, 0, 0, SRCCOPY);
}
if (m_pOldBitmap != NULL)
SelectObject(m_pOldBitmap);
DeleteDC();
}
CRect GetRect() { return m_rc; }
CBitmap& GetBitmap() { return m_bitmap; }
CMemDC* operator->(){ return this; }
operator CMemDC*() { return this; }
void Discard()
{
m_bValid = FALSE;
}