截图功能实现(五)自绘控件实现(button combobox)

截图工具条上有许多不同的按钮,比如矩形,椭圆等如图这里我采用了自绘Cbutton废话不多说直接上代码

PicButton.h

#pragma once


// PicButton
class PicButton : public CButton
{
	DECLARE_DYNAMIC(PicButton)

public:
	PicButton();
	virtual ~PicButton();
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	BOOL CreateBtn(const CPoint &pt, CWnd* pParentWnd, UINT nID, CBitmap*pBmp, int nbtnStlye = 0);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
	void SetbuttonStlye(const BOOL bStlye)
	{
		if (bStlye)
		{
			m_nBtnStatus = BTNSTATUS_DOWN;
		}
		else
		{
			m_nBtnStatus = BTNSTATUS_NOMAL;
		}
		Invalidate(FALSE);
	}

	int GetButtonStatus() const
	{
		return m_nBtnStatus;
	}
	enum//按钮三态
	{
	    BTNSTATUS_NOMAL = 0,
	    BTNSTATUS_OVER,
	    BTNSTATUS_DOWN
	};
	enum//按钮类型
	{
	    NOMAL = 0,
	    INVALID,
	    SAVEDOWN
	};
protected:
	DECLARE_MESSAGE_MAP()
private:
	int    m_nBtnStatus;
	int    m_nBtnStyle;
	CImageList m_ImageList;
public:
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

PicButton.cpp

/********************************************************
/*
/* 文件名称:PicButton.cpp
/* 摘    要:图片按钮实现
/* 当前版本:1.0
/* 作    者:
/* 创建日期:2013年5月7日星期二
*********************************************************/
// PicButton.cpp : 实现文件
//

#include "stdafx.h"
#include "PicButton.h"

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

IMPLEMENT_DYNAMIC(PicButton, CButton)

PicButton::PicButton()
{
	m_nBtnStatus = BTNSTATUS_NOMAL;
	m_nBtnStyle = NOMAL;
}

PicButton::~PicButton()
{
	m_ImageList.DeleteImageList();
}


BEGIN_MESSAGE_MAP(PicButton, CButton)
	ON_WM_DRAWITEM()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
	ON_WM_LBUTTONUP()
END_MESSAGE_MAP()


void PicButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC BitmapDC;
	BitmapDC.Attach(lpDrawItemStruct->hDC);
	CDC memDC;
	memDC.CreateCompatibleDC(&BitmapDC);
	CBitmap bmp;
	bmp.LoadBitmap(IDB_BMP_BK);
	CBitmap *pOldBitmap = memDC.SelectObject(&bmp);
	CRect rtBtn(0,0,0,0);
	GetClientRect(&rtBtn);

	m_ImageList.Draw(&memDC, 0, rtBtn.TopLeft(), ILD_TRANSPARENT);
	if (m_nBtnStyle != 1)
	{
		if (BTNSTATUS_OVER == m_nBtnStatus)
		{
			m_ImageList.Draw(&memDC, 1, rtBtn.TopLeft(), ILD_TRANSPARENT);
		}
		else if (BTNSTATUS_DOWN == m_nBtnStatus)
		{
			m_ImageList.Draw(&memDC, 2, rtBtn.TopLeft(), ILD_TRANSPARENT);
		}
	}
	BitmapDC.BitBlt(0, 0, rtBtn.Width(), rtBtn.Height(), &memDC, 0,0, SRCCOPY);
	memDC.SelectObject(pOldBitmap);
	memDC.DeleteDC();
}

BOOL PicButton::CreateBtn(const CPoint &pt, CWnd* pParentWnd, UINT nID, CBitmap*pBmp, int nbtnStlye /* = 0 */)//其中的图片格式是一张图片包含按钮的3个状态
{

	BITMAP bm;
	pBmp->GetBitmap(&bm);
	m_nBtnStyle = nbtnStlye;
	m_ImageList.Create(bm.bmWidth / 3, bm.bmHeight, ILC_COLOR24|ILC_MASK, 3, 3);
	m_ImageList.Add(pBmp, RGB(0,0,255));
	CRect rtBtn(pt, CSize(bm.bmWidth /3, bm.bmHeight));
	return Create(_T(""),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_OWNERDRAW, rtBtn, pParentWnd, nID);
}

// PicButton 消息处理程序

void PicButton::OnMouseMove(UINT nFlags, CPoint point)
{
	TRACKMOUSEEVENT csTME;
	csTME.cbSize = sizeof (csTME);
	csTME.dwFlags = TME_LEAVE|TME_HOVER;
	csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口
	csTME.dwHoverTime = 5;  // 鼠标在按钮上停留超过 5ms ,才认为状态为 HOVER
	::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持

	CButton::OnMouseMove(nFlags,point);
}

LRESULT PicButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
	if (m_nBtnStatus != BTNSTATUS_DOWN)
	{
		m_nBtnStatus = BTNSTATUS_OVER;
		Invalidate(FALSE);
	}
	return TRUE;
}

LRESULT PicButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
	if (m_nBtnStatus != BTNSTATUS_DOWN)
	{
		m_nBtnStatus = BTNSTATUS_NOMAL;
		Invalidate(FALSE);
	}
	return TRUE;
}

void PicButton::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (m_nBtnStatus != BTNSTATUS_DOWN)
	{
		m_nBtnStatus = BTNSTATUS_DOWN;
		Invalidate(FALSE);

	}
	else
	{
		if (m_nBtnStyle == NOMAL)
		{
			m_nBtnStatus = BTNSTATUS_OVER;
			Invalidate(FALSE);
		}
	}

	CButton::OnLButtonDown(nFlags,point);
}
void PicButton::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect(0,0,0,0);
	GetClientRect(&rect);
	if (!rect.PtInRect(point))
	{
		m_nBtnStatus = BTNSTATUS_NOMAL;
		Invalidate(FALSE);
	}

	CButton::OnLButtonUp(nFlags, point);
}
图片示范样式

combobox自绘实现如图的combobox字号大小选中的combobox

OwnerCombobox.h

#pragma once


// COwerCombobox

class COwnerCombobox : public CComboBox
{
	DECLARE_DYNAMIC(COwnerCombobox)

public:
	COwnerCombobox();
	virtual ~COwnerCombobox();
	enum
	{
	    NOMAL = 0,
	    OVER,
	    DOWN
	};

protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPaint();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
protected:
	void DrawShowText(CDC* pDC);
private:
	CImageList m_ImageList;
	int m_nBmpWidth;
	int m_nBmpHight;
	CRect m_rtDrop;
	CRect m_rt;
	int m_nStyle;
	BOOL m_bptInRectDrop;
};
// OwerCombobox.cpp : 实现文件
//

#include "stdafx.h"
#include "OwnerCombobox.h"


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

IMPLEMENT_DYNAMIC(COwnerCombobox, CComboBox)

COwnerCombobox::COwnerCombobox()
{
	BITMAP bm;
	CBitmap bmp;
	bmp.LoadBitmap(IDB_BMP_COMBOB);
	bmp.GetBitmap(&bm);
	m_nBmpWidth = bm.bmWidth / 3;
	m_nBmpHight = bm.bmHeight;
	m_ImageList.Create(m_nBmpWidth, m_nBmpHight, ILC_COLOR24|ILC_MASK, 3, 3);
	m_ImageList.Add(&bmp, RGB(0,0,255));
	m_rtDrop.SetRectEmpty();
	m_rt.SetRectEmpty();
	m_bptInRectDrop = FALSE;
	m_nStyle = NOMAL;
}

COwnerCombobox::~COwnerCombobox()
{
}


BEGIN_MESSAGE_MAP(COwnerCombobox, CComboBox)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()



// COwerCombobox 消息处理程序


void COwnerCombobox::DrawShowText(CDC* pDC)
{
	//获取显示文字
	TCHAR	strText[MAX_PATH+1];
	GetWindowText(strText, MAX_PATH);

	if (strText==NULL)
		return;

	CFont*	hOldFont = pDC->SelectObject(GetFont());
	CSize	szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
	int		nMode	 = pDC->SetBkMode(TRANSPARENT);
	CPoint	pt(2, 3);
	pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
	pDC->SelectObject(hOldFont);
	pDC->SetBkMode(nMode);
}

void COwnerCombobox::OnPaint()
{
	// TODO: 在此处添加消息处理程序代码
	CPaintDC dc(this);

	if (m_rt.IsRectEmpty())
	{
		GetClientRect(&m_rt);
		m_rtDrop = CRect(CPoint(m_rt.right - m_nBmpWidth,m_rt.top), CSize(m_nBmpWidth, m_nBmpHight));
	}

	CBrush brush;
	brush.CreateSolidBrush(RGB(255,255,255));
	dc.FillRect(&m_rt,&brush);

	if (m_nStyle == NOMAL)
	{
		m_ImageList.Draw(&dc, 0,m_rtDrop.TopLeft(), ILD_TRANSPARENT);
	}
	else if (m_nStyle == OVER)
	{
		m_ImageList.Draw(&dc, 1,m_rtDrop.TopLeft(), ILD_TRANSPARENT);
	}
	else if (m_nStyle == DOWN)
	{
		m_ImageList.Draw(&dc, 2,m_rtDrop.TopLeft(), ILD_TRANSPARENT);
	}
	brush.DeleteObject();
	CPoint pt(0,0);
	GetCursorPos(&pt);
	ScreenToClient(&pt);
	if (m_rt.PtInRect(pt))
	{
		CPen pen;
		pen.CreatePen(PS_SOLID, 1, STLYECOLOR);
		CPen*pOldPen = dc.SelectObject(&pen);
		dc.SelectStockObject(NULL_BRUSH);
		dc.Rectangle(&m_rt);
		dc.SelectObject(pOldPen);
	}
	DrawShowText(&dc);
	// 不为绘图消息调用 CComboBox::OnPaint()
}

void COwnerCombobox::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_nStyle = DOWN;
	Invalidate(FALSE);
	CComboBox::OnLButtonDown(nFlags, point);
}

void COwnerCombobox::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_nStyle = NOMAL;
	Invalidate(FALSE);
	CComboBox::OnLButtonUp(nFlags, point);
}

void COwnerCombobox::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	TRACKMOUSEEVENT csTME;
	csTME.cbSize = sizeof (csTME);
	csTME.dwFlags = TME_LEAVE|TME_HOVER;
	csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口
	csTME.dwHoverTime = 5;  // 鼠标在按钮上停留超过 5ms ,才认为状态为 HOVER
	::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持
	CComboBox::OnMouseMove(nFlags, point);
}

LRESULT COwnerCombobox::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
	CPoint pt(0,0);
	GetCursorPos(&pt);
	ScreenToClient(&pt);
	if (!m_bptInRectDrop && m_rt.PtInRect(pt))
	{
		m_bptInRectDrop = TRUE;
		m_nStyle = OVER;
		Invalidate(FALSE);
	}

	return 0;
}
LRESULT COwnerCombobox::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
	m_bptInRectDrop = FALSE;
	m_nStyle = NOMAL;
	Invalidate(FALSE);
	return 0;
}
图片个格式和上面的一样,我还是把图片也放上来吧

注意吧type 设置为DropList

OK2个控件的自绘就是这样很简单的说大笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值