DuiLib::CLabelUI 的继承类
来源:互联网 发布:sql with cte as 编辑:程序博客网 时间:2024/04/26 10:42
需求 : 要弹出一个文本提示对话框,替代 ::MessageBox
思路 : 用DuiDesigner画一个对话框,带上一张背景图, 放上按钮和Label, Label上显示文本信息.
效果: 发现文本不能换行, 只能显示一行.
纠正 :
去DuiLib中看到,实际最后画文本的时候,都加了单行类型, 就是说, 最后只能以单行方式画文本.
去网上看了下,cppblog的一个人,直接在CLabelUI中改了人家代码. 虽然简单,但是这库,别人就没法用了.
我做了最小化修改, 从CLabelUI继承了一个类CLabelUIEx,重载 PaintText,
这样,我自己用时, 从CLabelUIEx继承控件.
别人用时, 还从CLabelUI继承, 和原来的库一样效果.
因为 CDialogBuilder 负责创建控件, 修改了CDialogBuilder, 使其生成新的控件类型 LabelEx.
最后能换行了, 但是只能从给定矩形的左上角开始, 就不修改了.
修改后的类,用于显示一些活动的文本。比较固定的文本,用图片直接显示.
毕竟由专业美工作出的图,比自己写的字,效果要好的多.
如果是固定的字符串比较多,需要加很多图片的话,也可以考虑用此类显示提示信息.
权衡显示效果和程序的体积.
只修改了DuiLib.
DuiDesigner没改, 在编辑xml时,将LabelEx改成Label, 修改完后, 再改回来, 打成skin.zip包.
本来不该改界面库的, 被迫的.
/////////////////END消息映射宏定义//////////////////////////////////////////////////////////////////BEGIN控件名称宏定义/////////////////////////////////////////////////////#define DUI_CTR_EDIT (_T("Edit"))#define DUI_CTR_LIST (_T("List"))#define DUI_CTR_TEXT (_T("Text"))#define DUI_CTR_COMBO (_T("Combo"))#define DUI_CTR_LABEL (_T("Label"))#define DUI_CTR_LABEL_EX (_T("LabelEx")) ///< @todo#define DUI_CTR_FLASH(_T("Flash"))
CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent, CPaintManagerUI* pManager){ IContainerUI* pContainer = NULL; CControlUI* pReturn = NULL;
...
case 6: if( _tcscmp(pstrClass, DUI_CTR_BUTTON) == 0 ) pControl = new CButtonUI; else if( _tcscmp(pstrClass, DUI_CTR_OPTION) == 0 ) pControl = new COptionUI; else if( _tcscmp(pstrClass, DUI_CTR_SLIDER) == 0 ) pControl = new CSliderUI; break; case 7: if( _tcscmp(pstrClass, DUI_CTR_CONTROL) == 0 ) pControl = new CControlUI; else if( _tcscmp(pstrClass, DUI_CTR_ACTIVEX) == 0 ) pControl = new CActiveXUI; else if (0 == _tcscmp(pstrClass, DUI_CTR_LABEL_EX)) ///< @todo { pControl = new CLabelUIEx; } break; case 8:
/// @file UILabelEx.h/// @brief 支持自动换行的LabelUI, /// 修改了 DuiLib::CLabelUI::PaintText 为虚函数, LabelUIEx继承自CLabelUI/// 重载了 virtual void PaintText(HDC hDC);#ifndef __UI_LABEL_EX_H__#define __UI_LABEL_EX_H__namespace DuiLib{ class UILIB_API CLabelUIEx : public DuiLib::CLabelUI { public: CLabelUIEx(void); virtual ~CLabelUIEx(void); virtual void PaintText(HDC hDC); virtual void SetPos(RECT rc); private: Color _MakeRGB(int a, Color cl); Color _MakeRGB(int r, int g, int b); };}#endif
#include "StdAfx.h"#include "UILabelEx.h"namespace DuiLib{ CLabelUIEx::CLabelUIEx(void) { } CLabelUIEx::~CLabelUIEx(void) { } Color CLabelUIEx::_MakeRGB(int a, Color cl) { return Color(a, cl.GetR(), cl.GetG(), cl.GetB()); } Color CLabelUIEx::_MakeRGB(int r, int g, int b) { return Color(255, r, g, b); } void CLabelUIEx::SetPos(RECT rc) { __super::SetPos(rc); } void CLabelUIEx::PaintText(HDC hDC) { UINT uStyle = GetTextStyle(); if( m_dwTextColor == 0 ) m_dwTextColor = m_pManager->GetDefaultFontColor(); if( m_dwDisabledTextColor == 0 ) m_dwDisabledTextColor = m_pManager->GetDefaultDisabledColor(); RECT rc = m_rcItem; rc.left += m_rcTextPadding.left; rc.right -= m_rcTextPadding.right; rc.top += m_rcTextPadding.top; rc.bottom -= m_rcTextPadding.bottom; if(!GetEnabledEffect()) { if( m_sText.IsEmpty() ) return; int nLinks = 0; if( IsEnabled() ) { if( m_bShowHtml ) CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_sText, m_dwTextColor, \ NULL, NULL, nLinks, DT_SINGLELINE | m_uTextStyle); else CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, m_dwTextColor, \ m_iFont, /* DT_SINGLELINE | */m_uTextStyle); ///< @todo } else { if( m_bShowHtml ) CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_sText, m_dwDisabledTextColor, \ NULL, NULL, nLinks, DT_SINGLELINE | m_uTextStyle); else CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, m_dwDisabledTextColor, \ m_iFont, /* DT_SINGLELINE | */m_uTextStyle); ///< @todo } } else { FontnFont(hDC,m_pManager->GetFont(GetFont())); Graphics nGraphics(hDC); nGraphics.SetTextRenderingHint(m_TextRenderingHintAntiAlias); 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_ShadowOffset.X; nShadowRc.Y += m_ShadowOffset.Y; int nGradientLength= GetGradientLength(); 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())); if(GetEnabledStroke() && GetStrokeColor() > 0) { LinearGradientBrush nLineGrBrushStroke(Point(GetGradientAngle(),0),Point(0,rc.bottom-rc.top+2),_MakeRGB(GetTransStroke(),GetStrokeColor()),_MakeRGB(GetTransStroke(),GetStrokeColor()));#ifdef _UNICODE nRc.Offset(-1,0); nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(2,0); nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(-1,-1); nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(0,2); nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(0,-1);#else USES_CONVERSION; wstring mTextValue = A2W(m_TextValue.GetData()); nRc.Offset(-1,0); nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(2,0); nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(-1,-1); nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(0,2); nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nRc,&format,&nLineGrBrushStroke); nRc.Offset(0,-1);#endif }#ifdef _UNICODE if(GetEnabledShadow() && (GetTextShadowColorA() > 0 || GetTextShadowColorB() > 0)) nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nShadowRc,&format,&nLineGrBrushA); nGraphics.DrawString(m_TextValue,m_TextValue.GetLength(),&nFont,nRc,&format,&nLineGrBrushB);#else USES_CONVERSION; wstring mTextValue = A2W(m_TextValue.GetData()); if(GetEnabledShadow() && (GetTextShadowColorA() > 0 || GetTextShadowColorB() > 0)) nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nShadowRc,&format,&nLineGrBrushA); nGraphics.DrawString(mTextValue.c_str(),mTextValue.length(),&nFont,nRc,&format,&nLineGrBrushB);#endif } }}
调用示例
void CTextMsgDlg::UiInit(){ UINT uStyle = 0; m_pLabelMsg = static_cast<CLabelUIEx *>(m_PaintManager.FindControl(ELEMENT_TEXT_DLG_LABEL_MSG)); if (NULL != m_pLabelMsg) { m_pLabelMsg->SetText(m_strMsg.c_str()); uStyle = m_pLabelMsg->GetTextStyle(); uStyle |= DT_WORDBREAK; uStyle &= (~DT_CENTER); m_pLabelMsg->SetTextStyle(uStyle /*DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS */); }}
2017-0121
yiluanlie9944@csdn问起有没有这个类的实现工程,我上传的Demo中应该都有吧.
找了一个已经上传的Demo, 里面有这个类的实现.
http://download.csdn.net/download/lostspeed/9042237
<<srcbk_2015_0824_1711_prj_dlg_show_list_ui_use_massive_amounts_of_data.zip>>
PS: 找资料的方法, 如果人家在这篇文章之后,写的同系列的Demo, 很有可能有这篇文章的内容.
先下载作者在这篇文章之后的Demo翻翻,看看有没有这篇文章描述的内容:)
- DuiLib::CLabelUI 的继承类
- Duilib 源码分析之 CLabelUI 篇
- DuiLib的XML元素继承关系图
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib介绍以及各个类的简介
- Duilib中各个类的简单介绍
- Duilib中各个类的简单介绍
- Duilib介绍以及各个类的简介
- Duilib中各个类的简单介绍
- duilib 自定义控件TeamList 继承与CListUI
- 关于duilib的理解
- Duilib的一些资料
- DuiLib的源码分析
- 【JavaScript基本】对象常量
- 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
- 计算几何初步模板
- poj_1469
- 关于取消“计算机信息系统集成企业资质认定”、“计算机信息系统集成项目经理人员资质评定”和“信息系统工程监理单位资质认证和监理工程师资格认定”
- DuiLib::CLabelUI 的继承类
- 快速排序及寻找最小的k个数
- 内存的5个区的详解
- 2014-02-16 有限状态机——管中窥豹
- HTML5 Input Types
- java 实例化,执行。
- 数据挖掘十大经典算法
- 学习java Swing编程的一个简单Demo
- (2)今天你求职了吗?