www.gusucode.com > 基于VC编程界面编程高级应用技术源码程序 > VC界面编程高级应用技术/code/研究/IEButtonDemo/IEButton.cpp

    // IEButton.cpp : implementation file
//
#include "stdafx.h"
#include "IEButtonDemo.h"
#include "IEButton.h"

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

/////////////////////////////////////////////////////////////////////////////
// CIEButton

CIEButton::CIEButton()
{
	//初始化按钮状态:鼠标未移入按钮
	IsMouseOn=FALSE;
}

CIEButton::~CIEButton()
{
}


BEGIN_MESSAGE_MAP(CIEButton, CButton)
//{{AFX_MSG_MAP(CIEButton)
ON_WM_MOUSEMOVE()
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIEButton message handlers

void CIEButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	// TODO: Add your code to draw the specified item
	CDC ButtonDC;
	CBitmap bitmapTrans;
	BITMAP bmp;
	CDC mem;
	CRect rc,rc2;
	//得到用于绘制按钮的DC
	ButtonDC.Attach( lpDrawItemStruct->hDC );
	//准备用于向按钮区域传输位图
	mem.CreateCompatibleDC(&ButtonDC);
	//获取按钮所占的矩形大小
	rc=lpDrawItemStruct->rcItem;
	rc2=rc;
	
	//在任何状态下,图片是首先要绘绘制的
	bitmapTrans.LoadBitmap(IDB_IE);
	bitmapTrans.GetBitmap(&bmp);
	CBitmap *old=mem.SelectObject(&bitmapTrans);
	int x,y;
	x=rc.Width()/2-bmp.bmWidth/2;
	y=rc.Height()/2-bmp.bmHeight/2;
	//向按钮中心点传输位图
	ButtonDC.BitBlt(x,y,rc.right,rc.bottom,&mem, 0, 0, SRCCOPY);
	mem.SelectObject(old);
	
	//获取按钮目前所处的状态,根据不同的状态绘制不同的按钮
	//如果鼠标移入按钮,绘制浮起状态
	if (IsMouseOn )
    {
		//为按钮绘制立体效果
		rc.top=rc.top+1;rc.bottom=rc.bottom-1;
		rc.left=rc.left+1;rc.right=rc.right-1;
		//绘制立体边框
		ButtonDC.Draw3dRect(&rc,RGB(255,255,255),RGB(0,0,0));
	}
	
	//如果按钮被按下,绘制下沉立体效果
	if(lpDrawItemStruct->itemAction &ODA_SELECT)
	{	
		rc2.top=rc2.top+1;rc2.bottom=rc2.bottom-1;
		rc2.left=rc2.left+1;rc2.right=rc2.right-1;
		//绘制立体边框
		ButtonDC.Draw3dRect(&rc2,RGB(0,0,0),RGB(255,255,255));
	}
	
}

void CIEButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	//如果鼠标移入按钮
	if(!IsMouseOn)
	{
		this->IsMouseOn=TRUE;
		//重绘整个控件
		this->Invalidate();
	}
	CButton::OnMouseMove(nFlags, point);
}

void CIEButton::OnClicked() 
{
	AfxMessageBox("测试信息");	
}