自定义按钮控件-图标按钮

1."IconBtn.h"

 
class CIconBtn : public CButton
{
 
public:
	CIconBtn();
	CImageList* m_pImageList;	//图像列表指针
	int			m_ImageIndex;	//图标索引
	BOOL		IsPressed;		//按钮是否被按下
 
 	public:
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//虚方法,绘制图标按钮
	 
public:
	void SetImageIndex(UINT Index);//设置索引值
	void SetImageList(CImageList* pImage);//设置图像列表
	virtual ~CIconBtn();

 
protected:
	 
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
 

	DECLARE_MESSAGE_MAP()
};

 


2.IconBtn.cpp

// IconBtn.cpp : implementation file
//

#include "stdafx.h"
#include "IconButton.h"
#include "IconBtn.h"
 
 
CIconBtn::CIconBtn()
{
	IsPressed = FALSE;
}

CIconBtn::~CIconBtn()
{
}


BEGIN_MESSAGE_MAP(CIconBtn, CButton)
	 
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	 
END_MESSAGE_MAP()

 

void CIconBtn::SetImageList(CImageList *pImage)
{
	m_pImageList = pImage;
}

void CIconBtn::SetImageIndex(UINT Index)
{
	m_ImageIndex = Index;
}

void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC dc;//设备上下文
	dc.Attach(lpDrawItemStruct->hDC);//获取按钮设备上下文 	
	if(m_pImageList)//判断列表视图中是否为空
	{
		UINT state  = lpDrawItemStruct->itemState; //获取状态
		//获取图像列中图像大小
		IMAGEINFO imageinfo;//声明IMAGEINFO变量
		m_pImageList->GetImageInfo(m_ImageIndex,&imageinfo);//获取图像列表中图像的大小
		CSize imagesize;//CSize类型变量
		imagesize.cx = imageinfo.rcImage.right - imageinfo.rcImage.left;//获取图标宽度
		imagesize.cy = imageinfo.rcImage.bottom - imageinfo.rcImage.top;//获取图标高度
		//在按钮垂直方向居中显示位图
		CRect rect;//声明区域变量
		GetClientRect(rect);//获得按钮的客户区域
		CPoint point;//声明Cpoint变量
		point.x = 5;//设置图标显示的水平位置
		point.y = (rect.Height() - imagesize.cy)/2;//设置图标显示的垂直位置
		m_pImageList->Draw(&dc,m_ImageIndex,point,ILD_NORMAL|ILD_TRANSPARENT);//绘制图标
		CRect focusRect(rect);//声明焦点区域
		focusRect.DeflateRect(2,2,2,2);//设置焦点区域	
		//按钮被选中或者获得焦点时
		if((state&ODS_SELECTED)||(state&ODS_FOCUS))
		{
			CPen pen(PS_DASHDOTDOT,1,RGB(0,0,0));//创建画笔
			CBrush brush;//声明画刷
			brush.CreateStockObject(NULL_BRUSH);//创建画刷
			dc.SelectObject(&brush);//将画刷选入设备上下文
			dc.SelectObject(&pen);//将画笔选入设备上下文
			//绘制焦点矩形
			dc.DrawFocusRect(focusRect);
			//绘制立体效果
			dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);			
			//获得焦点时绘制黑色边框
			dc.Draw3dRect(rect,RGB(0,0,0),RGB(0,0,0));//获得焦点时绘制黑色边框
		}
		else  //默认情况下
		{		
			CPen pen(PS_DOT,1,RGB(192,192,192));//创建画笔
			CBrush brush;
			brush.CreateStockObject(NULL_BRUSH);
			dc.SelectObject(&brush);
			dc.SelectObject(&pen);
			dc.Rectangle(focusRect);//绘制焦点区域矩形			
			dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);//绘制立体效果	
		}
		if(IsPressed) //在按钮被按下时绘制按下效果
		{
			dc.DrawFocusRect(focusRect);//绘制焦点矩形			
			dc.DrawEdge(rect,BDR_SUNKENINNER |BDR_SUNKENOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);//绘制立体效果
			dc.Draw3dRect(rect,RGB(0,0,0),RGB(0,0,0));//绘制边框	
		}
		//绘制按钮文本
		CString text;//声明字符串变量
		GetWindowText(text);//获得显示文本
		rect.DeflateRect(point.x+imagesize.cx,0,0,0);//设置文本显示区域
		dc.SetBkMode(TRANSPARENT);//设置背景透明
		dc.DrawText(text,rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);//绘制按钮文本
	}
}

void CIconBtn::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	IsPressed = TRUE;
	CButton::OnLButtonDown(nFlags, point);
}

void CIconBtn::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	IsPressed = FALSE;
	CButton::OnLButtonUp(nFlags, point);
}


3.处理WM_BUTTONDOWN消息

4.处理WM_BUTTONUP消息

5.按钮属性Owner draw=true.(使用DrawItem虚函数绘制按钮的外观时)

6.对话框头文件声明图像列表对象,并引用IconBtn.h

 
	CImageList m_ImageList;

7.对话框OnInitDialog函数创建图像列表

// TODO: Add extra initialization here
	m_ImageList.Create(16,16,ILC_COLOR24|ILC_MASK,1,0);
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));

	m_Save.SetImageList(&m_ImageList);
	m_Exit.SetImageList(&m_ImageList);
	m_Save.SetImageIndex(0);
	m_Exit.SetImageIndex(1);






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值