MFC 之 CButton 控件重绘GDI+篇


VS2010工程编译的,使用GDI+绘图实现了不规则,透明效果按钮的重绘。
资源截图
代码片段和文件信息
// PngButton.cpp : implementation file
//

#include “stdafx.h“
#include “PngButton.h“
#include “resource.h“


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

/////////////////////////////////////////////////////////////////////////////
// CPngButton

CPngButton::CPngButton()
{
m_bTracked=false;
  m_bMenuOn = FALSE;

m_nImgPart = 0;
m_pImage = NULL;

m_nState = CTRL_NOFOCUS;
m_nBtnType = BTN_TYPE_NORMAL;

}

CPngButton::~CPngButton()
{
if(m_pImage == NULL)
{
delete m_pImage;
m_pImage = NULL;
}
}

void CPngButton::Init(UINT nImg int nPartNum UINT nBtnType)
{
m_pImage = ImageFromResource(AfxGetResourceHandle() nImg L“PNG“);
m_nBtnType = nBtnType;
m_nImgPart = nPartNum;

if (m_pImage == NULL)
return;

CRect rcButton;

if (m_nImgPart == BTN_IMG_1)
rcButton = CRect(0 0 m_pImage->GetWidth() m_pImage->GetHeight());
else if(m_nImgPart == BTN_IMG_3)
rcButton = CRect(0 0 m_pImage->GetWidth()/3 m_pImage->GetHeight());
else if (m_nImgPart == BTN_IMG_4)
rcButton = CRect(0 0 m_pImage->GetWidth()/4 m_pImage->GetHeight());
else
return;

SetWindowPos(NULL 0 0 rcButton.Width() rcButton.Height() SWP_NOACTIVATE|SWP_NOMOVE);
}

BEGIN_MESSAGE_MAP(CPngButton CButton)
//{{AFX_MSG_MAP(CPngButton)
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_MESSAGE(WM_MOUSEHOVEROnMouseHOver)
ON_MESSAGE(WM_MOUSELEAVEonmouseleave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPngButton message handlers

void CPngButton::OnPaint()
{
CButton::OnPaint();
}

void CPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
  if (!IsWindowEnabled())
  m_nState = CTRL_DISABLE;
 
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);

  ShowImage(&dc m_pImage m_nState);
}

bool CPngButton::ShowImage(CDC* pDC Image* pImage UINT nState)
{
bool bSuc = false;

if(pImage!=NULL)
{
CRect rcButton;

if (m_nImgPart == BTN_IMG_1)
rcButton = CRect(0 0 m_pImage->GetWidth() m_pImage->GetHeight());
else if(m_nImgPart == BTN_IMG_3)
{
if (nState == CTRL_NOFOCUS)
rcButton = CRect(0 0 m_pImage->GetWidth()/3 m_pImage->GetHeight());
else if(nState == CTRL_FOCUS)
rcButton = CRect(m_pImage->GetWidth()/3 0 m_pImage->GetWidth()/3 * 2 m_pImage->GetHeight());
else if (nState == CTRL_SELECTED)
rcButton = CRect(m_pImage->GetWidth()/3 * 2 0 m_pImage->GetWidth() m_pImage->GetHeight());
else
return false;
}
else if (m_nImgPart == BTN_IMG_4)
{
if (nState == CTRL_NOFOCUS)
rcButton = CRect(0 0 m_pImage->GetWidth()/4 m_pImage->GetHeight());
else if(nState == CTRL_FOCUS)
rcButton = CRect(m_pImage->GetWidth()/4 0 m_pImage->GetWidth()/4 * 2 m_pImage->GetHeight());
else if (nState == CTRL_SELECTED)
rcButton = CRe

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-04-17 10:58  TestingBed
     目录           0  2014-04-17 10:56  TestingBedDebug
     目录           0  2014-04-17 09:22  TestingBedipch
     目录           0  2014-04-17 09:22  TestingBedipch estingbed-86053d70
     目录           0  2014-04-17 10:04  TestingBedTestingBed
     文件    63852544  2014-04-17 10:58  TestingBedTestingBed.sdf
     文件         897  2014-04-14 15:36  TestingBedTestingBed.sln
     文件       20992  2014-04-17 10:58  TestingBedTestingBed.suo
     目录           0  2014-04-17 10:56  TestingBedTestingBedDebug
     文件        1976  2014-04-17 10:56  TestingBedTestingBedDebugTestingBed.Build.CppClean.log
     文件         431  2014-04-17 10:56  TestingBedTestingBedDebugTestingBed.log
     目录           0  2014-04-15 10:52  TestingBedTestingBedIncludes
     文件        3434  2000-12-15 16:58  TestingBedTestingBedIncludesGdiPlus.h
     文件         857  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusbase.h
     文件       22329  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusBitmap.h
     文件       30802  2001-01-17 16:41  TestingBedTestingBedIncludesGdiPlusBrush.h
     文件        1773  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusCachedBitmap.h
     文件        4328  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusColor.h
     文件        1750  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusColorMatrix.h
     文件       55921  2001-01-12 15:16  TestingBedTestingBedIncludesGdiPlusEnums.h
     文件       87463  2001-01-12 15:16  TestingBedTestingBedIncludesGdiPlusFlat.h
     文件        5981  2000-12-15 16:58  TestingBedTestingBedIncludesGdiPlusFont.h
     文件        3401  2000-12-04 15:00  TestingBedTestingBedIncludesGdiPlusFontCollection.h
     文件        6071  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusFontFamily.h
     文件        2725  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusGpStubs.h
     文件       93877  2001-01-17 16:41  TestingBedTestingBedIncludesGdiPlusGraphics.h
     文件       22175  2001-01-17 16:41  TestingBedTestingBedIncludesGdiPlusHeaders.h
     文件       13780  2001-01-17 16:41  TestingBedTestingBedIncludesGdiPlusimageAttributes.h
     文件        1593  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusImageCodec.h
     文件       24268  2000-12-04 15:00  TestingBedTestingBedIncludesGdiPlusImaging.h
     文件        3171  2000-11-12 23:18  TestingBedTestingBedIncludesGdiPlusInit.h
............此处省略37个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)