duilib-自定义圆形按钮-环形进度条控件

duilib-自定义圆形按钮-环形进度条控件

如何自定义一个圆形按钮控件内嵌到环形进度条底部,点击按钮刷新进度条值,类似下图:

在这里插入图片描述

1、在UIDefine.h中增加宏定义

#define  DUI_CTR_BTN_PROGRESS					 (_T("btnProgress"))

2、编码控件头文件 UIBtnProgress.h

#ifndef UI_BTN_PROGRESS_H
#define UI_BTN_PROGRESS_H
#pragma once

#include <GdiPlus.h>
#pragma comment( lib, "GdiPlus.lib" )
using namespace Gdiplus;
class UILIB_API Gdiplus::RectF;
struct UILIB_API Gdiplus::GdiplusStartupInput;

#define PI  3.1415926

namespace DuiLib
{
	class UILIB_API CBtnProgressUI : public CControlUI
	{
	public:
		CBtnProgressUI();
		~CBtnProgressUI();

		LPCTSTR GetClass() const;
		LPVOID GetInterface(LPCTSTR pstrName);
		void		SetEnabledEffect(bool _EnabledEffect);
		bool		GetEnabledEffect();
		void DoEvent(TEventUI& event);
		void DoPaint(HDC hDC, const RECT& rcPaint);
		void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);

		//设置进度条颜色
		void SetProgressColor(DWORD dwColor);
		//设置按钮外部圆环的颜色
		void SetOutBtnBkColor(DWORD dwColor);
		//设置按钮正常颜色
		void SetBtnBkColor(DWORD dwColor);
		//设置按钮鼠标悬浮颜色
		void SetBtnHotColor(DWORD dwColor);
		//设置按钮按下状态颜色
		void SetBtnPushColor(DWORD dwColor);
		//设置进度条宽度
		void SetProgressWidth(DWORD dwWidth);
		//设置进度条半径
		void SetProgressRadius(DWORD dwRadius);
		//设置按钮半径
		void SetBtnRadius(DWORD dwRadius);
		//设置按钮与进度条间距
		void SetBtnSpace(DWORD dwSpace);
		//设置进度条值
		void SetScoreValue(DWORD dwValue);
		//设置按钮文本
		void SetBtnTextValue(LPCTSTR pstrText);
		//设置按钮文本颜色
		void SetBtnTextColor(DWORD dwValue);
		//获取按钮文本
		CDuiString GetBtnText() const;
		//设置进度条文本显示边距
		void SetValueTextPadding(RECT rc);
		//设置按钮文本显示边距
		void SetBtnTextPadding(RECT rc);
		//设置进度条字体
		void SetValueFont(int index);
		//设置按钮文本字体
		void SetBtnTextFont(int index);
		//获取进度条字体
		int GetValueFont() const;
		//获取按钮文本字体
		int GetBtnTextFont() const;
		//按钮与进度条空白处条件距离参数
		void SetBtnSpacePadding(DWORD dwValue);
		//设置圆形按钮禁用时字体颜色
		void EnableBtnStatus(bool bEnable);
		//判断鼠标点击按钮位置是否在圆形按钮中
		bool IsPointInBtn(POINT pMouse);
		void		SetEnabledValueStroke(bool _EnabledStroke);
		bool		GetEnabledValueStroke();
		void		SetEnabledValueShadow(bool _EnabledShadowe);
		bool		GetEnabledValueShadow();

		void		SetEnabledBtnTextStroke(bool _EnabledStroke);
		bool		GetEnabledBtnTextStroke();
		void		SetEnabledBtnTextShadow(bool _EnabledShadowe);
		bool		GetEnabledBtnTextShadow();

		void		SetStrokeValueColor(DWORD _StrokeColor);
		DWORD		GetStrokeValueColor();

		void		SetStrokeBtnTextColor(DWORD _StrokeColor);
		DWORD		GetStrokeBtnTextColor();

		//绘制进度条按钮控件
		void DoDrawProgress(HDC hdc, RECT CtrlRect);

		//绘制进度条数值
		void DoDrawScoreValue(HDC hdc);
		//绘制圆形控件文本
		void DoDrawBtnText(HDC hdc);

	private:
		ULONG_PTR				m_gdiplusToken;
		GdiplusStartupInput		m_gdiplusStartupInput;


		//内圆进度条圆心坐标
		PointF					m_pfCircularCenter;
		PointF					m_pfBtnCenter;

		//进度条颜色
		DWORD					m_dwProgressBkColor;
		//按钮外环颜色
		DWORD					m_dwOutBtnBkColor;
		//按钮背景颜色
		DWORD					m_dwBtnBkColor;
		//按钮hot状态颜色
		DWORD					m_dwBtnHotColor;
		//按钮Push状态颜色
		DWORD					m_dwBtnPushColor;
		//进度条宽度
		DWORD					m_dwProgressWidth;
		//进度条圆半径
		DWORD					m_dwProgressRadius;
		//按钮半径
		DWORD					m_dwBtnRadius;
		//按钮与进度条间隔
		DWORD					m_dwBtnSpace;
		//按钮控件的矩形区域,用于判断鼠标点击事件
		RECT					m_rcButton;

		bool					m_bFocused;	
		//进度条显示数值
		DWORD					m_dwProgressValue;
		//文本显示样式
		UINT					m_uValueStyle;
		//文本显示位置
		RECT					m_rcValueTextPadding;
		//进度条数值颜色
		DWORD					m_dwVauleColor;
		//进度条数值禁用颜色
		DWORD					m_dwDisabledVauleColor;
		//按钮显示文本
		CDuiString				m_csBtnText;
		//文本显示样式
		UINT					m_uTextStyle;
		//文本显示位置
		RECT					m_rcBtnTextPadding;
		//按钮文本颜色
		DWORD					m_dwBtnTextColor;
		//按钮禁用文本颜色
		DWORD					m_dwDisabledBtnTextColor;
		//按钮与进度条空白处条件距离参数
		DWORD					m_dwBtnSpacePadding;

		int						m_hAlign;
		int						m_vAlign;

		int						m_iScoreFont;  //分数字体
		int						m_iBtnTextFont; //按钮文本字体
		bool					m_EnableEffect;

		RectF					m_ShadowValueOffset;
		RectF					m_ShadowBtnTextOffset;

		bool					m_EnabledValueStroke;
		bool					m_EnabledValueShadow;

		bool					m_EnabledBtnTextStroke;
		bool					m_EnabledBtnTextShadow;

		DWORD					m_dwStrokeValueColor;
		DWORD					m_dwStrokeBtnTextColor;
	};
}
#endif

3、编写控件源文件UIBtnProgress.cpp

#include "StdAfx.h"
#include "UIBtnProgress.h"

#include <atlconv.h>
namespace DuiLib
{
	CBtnProgressUI::CBtnProgressUI() :m_gdiplusToken(0),
		m_dwProgressValue(100),
		m_csBtnText(_T("")),
		m_hAlign(DT_CENTER),
		m_vAlign(DT_CENTER),
		m_EnableEffect(true),
		m_dwDisabledVauleColor(0),
		m_dwDisabledBtnTextColor(0),
		m_iScoreFont(-1),
		m_iBtnTextFont(-1),
		m_EnabledValueStroke(false),
		m_EnabledValueShadow(false),
		m_EnabledBtnTextStroke(false),
		m_EnabledBtnTextShadow(false),
		m_dwStrokeValueColor(0),
		m_dwStrokeBtnTextColor(0),
		m_dwBtnSpacePadding(0)
	{
		m_uValueStyle = DT_SINGLELINE | DT_VCENTER | DT_CENTER;
		m_uTextStyle = DT_SINGLELINE | DT_VCENTER | DT_CENTER;
		GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);

		m_ShadowValueOffset.X = 0.0f;
		m_ShadowValueOffset.Y = 0.0f;
		m_ShadowValueOffset.Width = 0.0f;
		m_ShadowValueOffset.Height = 0.0f;

		m_ShadowBtnTextOffset.X = 0.0f;
		m_ShadowBtnTextOffset.Y = 0.0f;
		m_ShadowBtnTextOffset.Width = 0.0f;
		m_ShadowBtnTextOffset.Height = 0.0f;

		::ZeroMemory(&m_rcValueTextPadding, sizeof(m_rcValueTextPadding));
		::ZeroMemory(&m_rcBtnTextPadding, sizeof(m_rcBtnTextPadding));
	}
	CBtnProgressUI::~CBtnProgressUI()
	{
		try
		{
			GdiplusShutdown(m_gdiplusToken);
		}
		catch (...)
		{
			throw "CBtnProgressUI::~CBtnProgressUI";
		}
	}
	LPCTSTR CBtnProgressUI::GetClass() const
	{
		return DUI_CTR_BTN_PROGRESS;
	}

	LPVOID CBtnProgressUI::GetInterface(LPCTSTR pstrName)
	{
		if (_tcscmp(pstrName, DUI_CTR_BTN_PROGRESS) == 0) return static_cast<CBtnProgressUI*>(this);
		return CControlUI::GetInterface(pstrName);
	}

	void CBtnProgressUI::DoEvent(TEventUI& event)
	{

		if (event.Type == UIEVENT_SETFOCUS)
		{
			m_bFocused = true;
			Invalidate();
			return;
		}
		if (event.Type == UIEVENT_KILLFOCUS)
		{
			m_bFocused = false;
			::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
			Invalidate();
			return;
		}
		if (event.Type == UIEVENT_MOUSEENTER)
		{
			//判断是否在圆形按钮内点击
			if (IsPointInBtn(event.ptMouse))
				::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
			//return;
		}
		
		if (event.Type == UIEVENT_MOUSEMOVE)
		{
			//判断是否在圆形按钮内点击
			if (IsPointInBtn(event.ptMouse))
				::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
			//return;
		}
		if (event.Type == UIEVENT_MOUSELEAVE)
		{
			::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
			//return;
		}
		if (event.Type == UIEVENT_DBLCLICK || event.Type == UIEVENT_BUTTONDOWN)
		{
			if (::PtInRect(&m_rcButton, event.ptMouse))
			{
				//判断是否在圆形按钮内点击
				if(IsPointInBtn(event.ptMouse)&& GetEnabledEffect()) //判断按钮是否处于启用状态
					m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK, event.wParam, event.lParam);

			}
			return;
		}
		if (event.Type == UIEVENT_SETCURSOR)
		{
			::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
			return;
		}
		CControlUI::DoEvent(event);
	}

	void CBtnProgressUI::DoPaint(HDC hDC, const RECT& rcPaint)
	{
		
		//画图
		RECT rcCtrl,rcDrawCtrl;
		rcCtrl = this->GetPos();
		rcDrawCtrl.left = rcCtrl.left;
		rcDrawCtrl.top = rcCtrl.top;
		rcDrawCtrl.right = rcCtrl.right;
		rcDrawCtrl.bottom = rcCtrl.top + rcCtrl.right - rcCtrl.left;

		//绘制进度条与按钮
		DoDrawProgress(hDC, rcDrawCtrl);
		//绘制进度条数值
		DoDrawScoreValue(hDC);
		//绘制按钮文本
		DoDrawBtnText(hDC);
		CControlUI::DoPaint(hDC, rcPaint);
	}
	void CBtnProgressUI::SetEnabledEffect(bool _EnabledEffect)
	{
		try
		{
			m_EnableEffect = _EnabledEffect;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetEnabledEffect";
		}
	}


	bool CBtnProgressUI::GetEnabledEffect()
	{
		try
		{
			return m_EnableEffect;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledEffect";
		}
	}

	void CBtnProgressUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
	{
		LPTSTR pstr = NULL;
		if (_tcscmp(pstrName, _T("progressColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
			SetProgressColor(clrColor);
		}
		else if (_tcscmp(pstrName, _T("outBtnBkColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
			SetOutBtnBkColor(clrColor);
		}
		else if (_tcscmp(pstrName, _T("btnBkColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
			SetBtnBkColor(clrColor);
		}
		else if (_tcscmp(pstrName, _T("btnHotColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
			SetBtnHotColor(clrColor);
		}
		else if (_tcscmp(pstrName, _T("btnPushColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
			SetBtnPushColor(clrColor);
		}
		else if (_tcscmp(pstrName, _T("progressWidth")) == 0) {
			DWORD dwWidth = _tcstoul(pstrValue, &pstr, 10);
			SetProgressWidth(dwWidth);
		}
		else if (_tcscmp(pstrName, _T("progressRadius")) == 0) {
			DWORD dwRadius = _tcstoul(pstrValue, &pstr, 10);
			SetProgressRadius(dwRadius);
		}
		else if (_tcscmp(pstrName, _T("buttonRadius")) == 0) {
			DWORD dwRadius = _tcstoul(pstrValue, &pstr, 10);
			SetBtnRadius(dwRadius);
		}
		else if (_tcscmp(pstrName, _T("buttonSpace")) == 0) {
			DWORD dwSpace = _tcstoul(pstrValue, &pstr, 10);
			SetBtnSpace(dwSpace);
		}
		else if (_tcscmp(pstrName, _T("scoreValue")) == 0) {
			DWORD dwValue = _tcstoul(pstrValue, &pstr, 10);
			SetScoreValue(dwValue);
		}
		else if (_tcscmp(pstrName, _T("btnText")) == 0) {
		
			SetBtnTextValue(pstrValue);
		}
		else if (_tcscmp(pstrName, _T("btnTextColor")) == 0) {
			if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
			DWORD btnTextColor = _tcstoul(pstrValue, &pstr, 16);
			SetBtnTextColor(btnTextColor);
		}
		else if (_tcscmp(pstrName, _T("valueTextpadding")) == 0) {
			RECT rcTextPadding = { 0 };
			LPTSTR pstr = NULL;
			rcTextPadding.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);
			rcTextPadding.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
			rcTextPadding.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
			rcTextPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
			SetValueTextPadding(rcTextPadding);
		}
		else if (_tcscmp(pstrName, _T("btnTextpadding")) == 0) {
			RECT rcTextPadding = { 0 };
			LPTSTR pstr = NULL;
			rcTextPadding.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);
			rcTextPadding.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
			rcTextPadding.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
			rcTextPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
			SetBtnTextPadding(rcTextPadding);
		}
		else if (_tcscmp(pstrName, _T("valueFont")) == 0) SetValueFont(_ttoi(pstrValue));
		else if (_tcscmp(pstrName, _T("btnTextFont")) == 0) SetBtnTextFont(_ttoi(pstrValue));
		
		else if (_tcscmp(pstrName, _T("btnSpacePadding")) == 0) {
			DWORD dwSpacePadding = _tcstoul(pstrValue, &pstr, 10);
			SetBtnSpacePadding(dwSpacePadding);
		}
		else if (_tcscmp(pstrName, _T("valueAlign")) == 0) {
			if (_tcsstr(pstrValue, _T("left")) != NULL) {
				m_uValueStyle &= ~(DT_CENTER | DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
				m_uValueStyle |= DT_LEFT;
			}
			if (_tcsstr(pstrValue, _T("center")) != NULL) {
				m_uValueStyle &= ~(DT_LEFT | DT_RIGHT);
				m_uValueStyle |= DT_CENTER;
			}
			if (_tcsstr(pstrValue, _T("right")) != NULL) {
				m_uValueStyle &= ~(DT_LEFT | DT_CENTER | DT_VCENTER | DT_SINGLELINE);
				m_uValueStyle |= DT_RIGHT;
			}
			if (_tcsstr(pstrValue, _T("top")) != NULL) {
				m_uValueStyle &= ~(DT_BOTTOM | DT_VCENTER | DT_VCENTER);
				m_uValueStyle |= (DT_TOP | DT_SINGLELINE);
			}
			if (_tcsstr(pstrValue, _T("vcenter")) != NULL) {
				m_uValueStyle &= ~(DT_TOP | DT_BOTTOM);
				m_uValueStyle |= (DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			}
			if (_tcsstr(pstrValue, _T("bottom")) != NULL) {
				m_uValueStyle &= ~(DT_TOP | DT_VCENTER | DT_VCENTER);
				m_uValueStyle |= (DT_BOTTOM | DT_SINGLELINE);
			}
		}
		else if (_tcscmp(pstrName, _T("btnTextAlign")) == 0) {
			if (_tcsstr(pstrValue, _T("left")) != NULL) {
				m_uTextStyle &= ~(DT_CENTER | DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
				m_uTextStyle |= DT_LEFT;
			}
			if (_tcsstr(pstrValue, _T("center")) != NULL) {
				m_uTextStyle &= ~(DT_LEFT | DT_RIGHT);
				m_uTextStyle |= DT_CENTER;
			}
			if (_tcsstr(pstrValue, _T("right")) != NULL) {
				m_uTextStyle &= ~(DT_LEFT | DT_CENTER | DT_VCENTER | DT_SINGLELINE);
				m_uTextStyle |= DT_RIGHT;
			}
			if (_tcsstr(pstrValue, _T("top")) != NULL) {
				m_uTextStyle &= ~(DT_BOTTOM | DT_VCENTER | DT_VCENTER);
				m_uTextStyle |= (DT_TOP | DT_SINGLELINE);
			}
			if (_tcsstr(pstrValue, _T("vcenter")) != NULL) {
				m_uTextStyle &= ~(DT_TOP | DT_BOTTOM);
				m_uTextStyle |= (DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			}
			if (_tcsstr(pstrValue, _T("bottom")) != NULL) {
				m_uTextStyle &= ~(DT_TOP | DT_VCENTER | DT_VCENTER);
				m_uTextStyle |= (DT_BOTTOM | DT_SINGLELINE);
			}
		}
		else
			CControlUI::SetAttribute(pstrName, pstrValue);
	}
	void CBtnProgressUI::SetProgressColor(DWORD dwColor)
	{
		m_dwProgressBkColor = dwColor;
		m_dwVauleColor = dwColor;
	}
	void CBtnProgressUI::SetOutBtnBkColor(DWORD dwColor)
	{
		m_dwOutBtnBkColor = dwColor;
	}
	void CBtnProgressUI::SetBtnBkColor(DWORD dwColor)
	{
		m_dwBtnBkColor = dwColor;
	}
	void CBtnProgressUI::SetBtnHotColor(DWORD dwColor)
	{
		m_dwBtnHotColor = dwColor;
	}
	void CBtnProgressUI::SetBtnPushColor(DWORD dwColor)
	{
		m_dwBtnPushColor = dwColor;
	}
	void CBtnProgressUI::SetProgressWidth(DWORD dwWidth)
	{
		m_dwProgressWidth = dwWidth;
	}
	void CBtnProgressUI::SetProgressRadius(DWORD dwRadius)
	{
		m_dwProgressRadius = dwRadius;
	}
	void CBtnProgressUI::SetBtnRadius(DWORD dwRadius)
	{
		m_dwBtnRadius = dwRadius;
	}

	void CBtnProgressUI::SetBtnSpace(DWORD dwSpace)
	{
		m_dwBtnSpace = dwSpace;
	}

	void CBtnProgressUI::SetScoreValue(DWORD dwValue)
	{
		if (m_dwProgressValue == dwValue) return;
		m_dwProgressValue = dwValue;
		Invalidate();
	}
	void CBtnProgressUI::SetBtnTextValue(LPCTSTR pstrText)
	{
		if (m_csBtnText == pstrText) return;

		m_csBtnText = pstrText;
		Invalidate();
	}
	void CBtnProgressUI::SetBtnTextColor(DWORD dwValue)
	{
		m_dwBtnTextColor = dwValue;
		Invalidate();
	}
	CDuiString CBtnProgressUI::GetBtnText() const
	{
		return m_csBtnText;
	}

	void CBtnProgressUI::SetValueTextPadding(RECT rc)
	{
		m_rcValueTextPadding = rc;
		Invalidate();
	}
	void CBtnProgressUI::SetBtnTextPadding(RECT rc)
	{
		m_rcBtnTextPadding = rc;
		Invalidate();
	}

	void CBtnProgressUI::SetValueFont(int index)
	{
		m_iScoreFont = index;
		Invalidate();
	}
	void CBtnProgressUI::SetBtnTextFont(int index)
	{
		m_iBtnTextFont = index;
		Invalidate();
	}

	int CBtnProgressUI::GetValueFont() const
	{
		return m_iScoreFont;
	}
	int CBtnProgressUI::GetBtnTextFont() const
	{
		return m_iBtnTextFont;
	}

	void CBtnProgressUI::SetBtnSpacePadding(DWORD dwValue)
	{
		m_dwBtnSpacePadding = dwValue;
	}
	void CBtnProgressUI::EnableBtnStatus(bool bEnable)
	{
		//设置圆形按钮是否被禁用
		SetEnabledEffect(bEnable);

		if (bEnable)
		{
			SetBtnTextColor(m_dwBtnTextColor);
		}
		else
		{
			SetBtnTextColor(m_dwDisabledBtnTextColor);
		}
	}
	bool CBtnProgressUI::GetEnabledValueStroke()
	{
		try
		{
			return m_EnabledValueStroke;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledValueStroke";
		}
	}
	bool CBtnProgressUI::GetEnabledValueShadow()
	{
		try
		{
			return m_EnabledValueShadow;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledValueShadow";
		}
	}
	bool CBtnProgressUI::GetEnabledBtnTextStroke()
	{
		try
		{
			return m_EnabledBtnTextStroke;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledBtnTextStroke";
		}
	}
	bool CBtnProgressUI::GetEnabledBtnTextShadow()
	{
		try
		{
			return m_EnabledBtnTextShadow;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledBtnTextShadow";
		}
	}
	DWORD CBtnProgressUI::GetStrokeValueColor()
	{
		try
		{
			return m_dwStrokeValueColor;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetStrokeValueColor";
		}
	}
	DWORD CBtnProgressUI::GetStrokeBtnTextColor()
	{
		try
		{
			return m_dwStrokeBtnTextColor;
		}
		catch (...)
		{
			throw "CBtnProgressUI::GetEnabledBtnTextStroke";
		}
	}

	void CBtnProgressUI::SetEnabledValueStroke(bool _EnabledStroke)
	{
		try
		{
			m_EnabledValueStroke = _EnabledStroke;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetEnabledValueStroke";
		}
	}
	void CBtnProgressUI::SetEnabledValueShadow(bool _EnabledShadowe)
	{
		try
		{
			m_EnabledValueShadow = _EnabledShadowe;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetEnabledValueShadow";
		}
	}
	void CBtnProgressUI::SetEnabledBtnTextStroke(bool _EnabledStroke)
	{
		try
		{
			m_EnabledBtnTextStroke = _EnabledStroke;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetEnabledBtnTextStroke";
		}
	}
	void CBtnProgressUI::SetEnabledBtnTextShadow(bool _EnabledShadowe)
	{
		try
		{
			m_EnabledBtnTextShadow = _EnabledShadowe;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetEnabledStroke";
		}
	}
	void CBtnProgressUI::SetStrokeValueColor(DWORD _StrokeColor)
	{
		try
		{
			m_dwStrokeBtnTextColor = _StrokeColor;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetStrokeValueColor";
		}
	}
	void CBtnProgressUI::SetStrokeBtnTextColor(DWORD _StrokeColor)
	{
		try
		{
			m_dwStrokeBtnTextColor = _StrokeColor;
		}
		catch (...)
		{
			throw "CBtnProgressUI::SetStrokeBtnTextColor";
		}
	}

	bool CBtnProgressUI::IsPointInBtn(POINT pMouse)
	{
		float fDistance;
		fDistance = ((REAL)pMouse.x - m_pfBtnCenter.X)*((REAL)pMouse.x - m_pfBtnCenter.X) + ((REAL)pMouse.y - m_pfBtnCenter.Y) * ((REAL)pMouse.y - m_pfBtnCenter.Y);
		if (fDistance <= m_dwBtnRadius * m_dwBtnRadius)
			return true;
		return false;
	}

	void CBtnProgressUI::DoDrawProgress(HDC hdc, RECT CtrlRect)
	{
		Graphics graphicCircular(hdc);
		//设置平滑模式
		graphicCircular.SetSmoothingMode(SmoothingMode::SmoothingModeAntiAlias);
		//白色画笔
		Pen      outBtnPen(m_dwOutBtnBkColor);
		//按钮轮廓曲线画笔
		Pen      btnBkPen(m_dwBtnBkColor);
		//白色画刷
		SolidBrush  outBtnBrush(m_dwOutBtnBkColor);
		SolidBrush  btnBkBrush(m_dwBtnBkColor);

		//圆形按钮半径参数
		int nInnerBtnRadius, nOutBtnRadius;
		nInnerBtnRadius = m_dwBtnRadius;
		nOutBtnRadius = m_dwBtnRadius + m_dwBtnSpace;

		//进度条圆心坐标
		m_pfCircularCenter.X = CtrlRect.left + ((CtrlRect.right - CtrlRect.left) / 2.0);
		m_pfCircularCenter.Y = CtrlRect.top + ((CtrlRect.bottom - CtrlRect.top) / 2.0);

		//进度条内外半径
		int nInnerRadius;
		int nOutRadius;
		nInnerRadius = (CtrlRect.right - CtrlRect.left) / 2.0 - m_dwProgressWidth;
		nOutRadius = (CtrlRect.right - CtrlRect.left) / 2.0 - m_dwProgressWidth / 2;
		//按钮圆心坐标
		m_pfBtnCenter.X = m_pfCircularCenter.X;
		m_pfBtnCenter.Y = m_pfCircularCenter.Y + nInnerRadius + m_dwProgressWidth / 2.0;

		//记录按钮矩形值
		m_rcButton.left = m_pfBtnCenter.X - m_dwBtnRadius;
		m_rcButton.top = m_pfBtnCenter.Y - m_dwBtnRadius;
		m_rcButton.right = m_pfBtnCenter.X + m_dwBtnRadius;
		m_rcButton.bottom = m_pfBtnCenter.Y + m_dwBtnRadius;

		//绘制进度条
		//画弧线
		Pen      ArcPen(m_dwProgressBkColor, (REAL)m_dwProgressWidth);
		if (m_dwProgressValue > 100)
			m_dwProgressValue = 0;
		//0度对应的初始角度计算
		int nAngleBase = 0;
		//nAngleBase = asin(nOutBtnRadius / (m_pfCircularCenter.Y + nInnerRadius + m_dwProgressWidth / 2.0)) * 180 / PI;
		nAngleBase = asin((nOutBtnRadius - m_dwBtnSpacePadding) / (m_pfBtnCenter.Y - m_pfCircularCenter.Y)) * 180 / PI;
		int nSweepAngle = m_dwProgressValue * (360- 2 * nAngleBase) / 100.0;
		graphicCircular.DrawArc(&ArcPen, m_pfCircularCenter.X - nOutRadius, m_pfCircularCenter.Y - nOutRadius, (REAL)2 * nOutRadius, (REAL)2 * nOutRadius, -1*(270 - nAngleBase), nSweepAngle);

		//绘制按钮
		//画外圆形,白色边线
		graphicCircular.DrawEllipse(&outBtnPen, m_pfBtnCenter.X - nOutBtnRadius, m_pfBtnCenter.Y - nOutBtnRadius, (REAL)2 * nOutBtnRadius, (REAL)2 * nOutBtnRadius);
		graphicCircular.FillEllipse(&outBtnBrush, m_pfBtnCenter.X - nOutBtnRadius, m_pfBtnCenter.Y - nOutBtnRadius, (REAL)2 * nOutBtnRadius, (REAL)2 * nOutBtnRadius);
		//画内圆
		graphicCircular.DrawEllipse(&btnBkPen, m_pfBtnCenter.X - nInnerBtnRadius, m_pfBtnCenter.Y - nInnerBtnRadius, (REAL)2 * nInnerBtnRadius, (REAL)2 * nInnerBtnRadius);
		graphicCircular.FillEllipse(&btnBkBrush, m_pfBtnCenter.X - nInnerBtnRadius, m_pfBtnCenter.Y - nInnerBtnRadius, (REAL)2 * nInnerBtnRadius, (REAL)2 * nInnerBtnRadius);
	}

	void CBtnProgressUI::DoDrawScoreValue(HDC hdc)
	{
		if (m_dwVauleColor == 0) m_dwVauleColor = m_pManager->GetDefaultFontColor();
		if (m_dwDisabledVauleColor == 0) m_dwDisabledVauleColor = m_pManager->GetDefaultDisabledColor();

		RECT rc;
		rc.left = m_pfCircularCenter.X - m_dwProgressRadius;
		rc.top = m_pfCircularCenter.Y - m_dwProgressRadius;
		rc.right = m_pfCircularCenter.X + m_dwProgressRadius;
		rc.bottom = m_pfCircularCenter.Y + m_dwProgressRadius;

		rc.left += m_rcValueTextPadding.left;
		rc.right -= m_rcValueTextPadding.right;
		rc.top += m_rcValueTextPadding.top;
		rc.bottom -= m_rcValueTextPadding.bottom;


		//if (!GetEnabledEffect())
		//{
		//	if (IsEnabled()) {
		//		CRenderEngine::DrawText(hdc, m_pManager, rc, m_sText, m_dwVauleColor, \
		//			m_iScoreFont, DT_SINGLELINE | m_uTextStyle);
		//	}
		//	else
		//	{
		//		CRenderEngine::DrawText(hdc, m_pManager, rc, m_sText, m_dwDisabledVauleColor, \
		//			m_iScoreFont, DT_SINGLELINE | m_uTextStyle);
		//	}
		//}
		//else
		{
			Font	nFont(hdc, m_pManager->GetFont(GetValueFont()));
			Graphics nGraphics(hdc);
			//nGraphics.SetTextRenderingHint(m_TextRenderingHintAntiAlias);
			//Pen pen(m_dwVauleColor);
			//nGraphics.DrawRectangle(&pen, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
			StringFormat format;
			format.SetAlignment((StringAlignment)m_hAlign);
			format.SetLineAlignment((StringAlignment)m_vAlign);

			RectF nRc((float)rc.left, (float)rc.top, (float)rc.right - rc.left, (float)rc.bottom - rc.top);
			RectF nShadowRc = nRc;
			nShadowRc.X += m_ShadowValueOffset.X;
			nShadowRc.Y += m_ShadowValueOffset.Y;

			int nGradientLength = 0;

			if (nGradientLength == 0)
				nGradientLength = (rc.bottom - rc.top);

			//LinearGradientBrush nLineGrBrushA(Point(GetGradientAngle(), 0), Point(0, nGradientLength), _MakeRGB(GetTransShadow(), GetTextShadowColorA()), _MakeRGB(GetTransShadow1(), GetTextShadowColorB() == -1 ? GetTextShadowColorA() : GetTextShadowColorB()));
			//LinearGradientBrush nLineGrBrushB(Point(GetGradientAngle(), 0), Point(0, nGradientLength), _MakeRGB(GetTransText(), GetTextColor()), _MakeRGB(GetTransText1(), GetTextColor1() == -1 ? GetTextColor() : GetTextColor1()));
			SolidBrush valueBrush(m_dwVauleColor);
			CDuiString csText;
			csText.Format(_T("%d"), m_dwProgressValue);

			if (GetEnabledValueStroke() && GetStrokeValueColor() > 0)
			{
#ifdef _UNICODE
				nRc.Offset(-1, 0);
				nGraphics.DrawString(csText, csText.GetLength(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(2, 0);
				nGraphics.DrawString(csText, csText.GetLength(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(-1, -1);
				nGraphics.DrawString(csText, csText.GetLength(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(0, 2);
				nGraphics.DrawString(csText, csText.GetLength(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(0, -1);
#else
				USES_CONVERSION;
				wstring mTextValue = A2W(csText.GetData());

				nRc.Offset(-1, 0);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(2, 0);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(-1, -1);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(0, 2);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &valueBrush);
				nRc.Offset(0, -1);
#endif
			}
#ifdef _UNICODE
			

			nGraphics.DrawString(csText, csText.GetLength(), &nFont, nRc, &format, &valueBrush);
#else
			USES_CONVERSION;
			wstring mTextValue = A2W(csText.GetData());

			nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &valueBrush);
#endif
		
		}
	}
	void CBtnProgressUI::DoDrawBtnText(HDC hdc)
	{
		if (m_dwBtnTextColor == 0) m_dwBtnTextColor = m_pManager->GetDefaultFontColor();
		if (m_dwDisabledBtnTextColor == 0) m_dwDisabledBtnTextColor = m_pManager->GetDefaultDisabledColor();

		RECT rc;
		rc.left = m_pfBtnCenter.X - m_dwBtnRadius;
		rc.top = m_pfBtnCenter.Y - m_dwBtnRadius;
		rc.right = m_pfBtnCenter.X + m_dwBtnRadius;
		rc.bottom = m_pfBtnCenter.Y + m_dwBtnRadius;

		rc.left += m_rcBtnTextPadding.left;
		rc.right -= m_rcBtnTextPadding.right;
		rc.top += m_rcBtnTextPadding.top;
		rc.bottom -= m_rcBtnTextPadding.bottom;

		{
			Font	nFont(hdc, m_pManager->GetFont(GetBtnTextFont()));
			Graphics nGraphics(hdc);
			//nGraphics.SetTextRenderingHint(m_TextRenderingHintAntiAlias);
			//Pen pen(m_dwBtnTextColor);
			//nGraphics.DrawRectangle(&pen, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
			StringFormat format;
			format.SetAlignment((StringAlignment)m_hAlign);
			format.SetLineAlignment((StringAlignment)m_vAlign);

			RectF nRc((float)rc.left, (float)rc.top, (float)rc.right - rc.left, (float)rc.bottom - rc.top);
			RectF nShadowRc = nRc;
			nShadowRc.X += m_ShadowBtnTextOffset.X;
			nShadowRc.Y += m_ShadowBtnTextOffset.Y;

			int nGradientLength = 0;

			if (nGradientLength == 0)
				nGradientLength = (rc.bottom - rc.top);

			//LinearGradientBrush nLineGrBrushA(Point(GetGradientAngle(), 0), Point(0, nGradientLength), _MakeRGB(GetTransShadow(), GetTextShadowColorA()), _MakeRGB(GetTransShadow1(), GetTextShadowColorB() == -1 ? GetTextShadowColorA() : GetTextShadowColorB()));
			//LinearGradientBrush nLineGrBrushB(Point(GetGradientAngle(), 0), Point(0, nGradientLength), _MakeRGB(GetTransText(), GetTextColor()), _MakeRGB(GetTransText1(), GetTextColor1() == -1 ? GetTextColor() : GetTextColor1()));
			SolidBrush btnTextBrush(m_dwBtnTextColor);

			if (GetEnabledValueStroke() && GetStrokeValueColor() > 0)
			{
#ifdef _UNICODE
				nRc.Offset(-1, 0);
				nGraphics.DrawString(m_csBtnText, m_csBtnText.GetLength(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(2, 0);
				nGraphics.DrawString(m_csBtnText, m_csBtnText.GetLength(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(-1, -1);
				nGraphics.DrawString(m_csBtnText, m_csBtnText.GetLength(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(0, 2);
				nGraphics.DrawString(m_csBtnText, m_csBtnText.GetLength(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(0, -1);
#else
				USES_CONVERSION;
				wstring mTextValue = A2W(m_csBtnText.GetData());

				nRc.Offset(-1, 0);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(2, 0);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(-1, -1);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(0, 2);
				nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &btnTextBrush);
				nRc.Offset(0, -1);
#endif
			}
#ifdef _UNICODE


			nGraphics.DrawString(m_csBtnText, m_csBtnText.GetLength(), &nFont, nRc, &format, &btnTextBrush);
#else
			USES_CONVERSION;
			wstring mTextValue = A2W(m_csBtnText.GetData());

			nGraphics.DrawString(mTextValue.c_str(), mTextValue.length(), &nFont, nRc, &format, &btnTextBrush);
#endif

		}
	}
}


5、增加控件解析和创建代码

CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent, CPaintManagerUI* pManager)
{
//省略
    			case 11:
				if (_tcscmp(pstrClass, DUI_CTR_CHILDLAYOUT) == 0)			  pControl = new CChildLayoutUI;
    //新增
				else if (_tcscmp(pstrClass, DUI_CTR_BTN_PROGRESS) == 0)		  pControl = new CBtnProgressUI;
				break;
//省略
}

6、UIlib.h中新增头文件包含

#include "Control/UIBtnProgress.h"

7、xml文件编写示例

<btnProgress name="btnProgress" progressColor="#FF00FA00" btnBkColor="#FF00FA00" outBtnBkColor="#FFFFFFFF" btnHotColor="#FFe2e2e2" btnPushColor="#FFFF0000" progressWidth="40" progressRadius="120" buttonRadius="45" buttonSpace="20" scoreValue="100" valueFont="12" valueAlign="center" btnText="开始检查" btnTextColor="#FFFFFFFF" btnTextFont="3" btnSpacePadding="6" />

8、xml文件属性解释

btnProgress控件的
宽度值 应该为 2进度条半径(progressRadius)+ 2进度条宽度(progressWidth)
高度值 应该为 宽度值 + 按钮半径(buttonRadius) + 按钮与进度条间距(buttonSpace)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feng_blog6688

只需一个赞,谢谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值