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)