/**
* Copyright (C) 2014-2050 SOUI团队
* All rights reserved.
*
* @file SCmnCtrl.h
* @brief 通用控件
* @version v1.0
* @author soui
* @date 2014-05-28
*
* Describe 此文件中定义了很多通用控件:静态文本,超链接,按钮,单选按钮等
*/
#pragma once
#include "core/SWnd.h"
#include "core/SAccelerator.h"
#include "core/SFocusManager.h"
namespace SOUI
{
/**
* @class SStatic
* @brief 静态文本控件类
*
* Describe 静态文本控件可支持多行,有多行属性时,\n可以强制换行
* Usage inner text example
*/
class SOUI_EXP SStatic : public SWindow
{
SOUI_CLASS_NAME(SStatic, L"text")
public:
/**
* SStatic::SStatic
* @brief 构造函数
*
* Describe 构造函数
*/
SStatic();
/**
* SStatic::SDrawText
* @brief 绘制文本
* @param IRenderTarget *pRT -- 绘制设备句柄
* @param LPCTSTR pszBuf -- 文本内容字符串
* @param int cchText -- 字符串长度
* @param LPRECT pRect -- 指向矩形结构RECT的指针
* @param UINT uFormat -- 正文的绘制选项
*
* Describe 对DrawText封装
*/
virtual void DrawText(IRenderTarget *pRT,LPCTSTR pszBuf,int cchText,LPRECT pRect,UINT uFormat);
protected:
virtual void OnDrawLine(IRenderTarget *pRT, LPCTSTR pszBuf, int iBegin, int cchText, LPRECT pRect, UINT uFormat);
virtual SIZE OnMeasureText(IRenderTarget *pRT,LPCTSTR pszText,int cchLen);
void DrawMultiLine(IRenderTarget *pRT,LPCTSTR pszBuf,int cchText,LPRECT pRect,UINT uFormat);
int m_nLineInter; /**< 行间距 */
bool m_bWordbreak;
SOUI_ATTRS_BEGIN()
ATTR_INT(L"interHeight", m_nLineInter, TRUE)
ATTR_BOOL(L"wordBreak",m_bWordbreak,TRUE)
SOUI_ATTRS_END()
};
/**
* @class SLink
* @brief 超链接控件类
*
* Describe Only For Header Drag Test
* Usage inner text example
*/
class SOUI_EXP SLink : public SWindow
{
SOUI_CLASS_NAME(SLink, L"link")
public:
/**
* SLink::SLink
* @brief 构造函数
*
* Describe 构造函数
*/
SLink();
protected:
/**
* SLink::OnAttributeFinish
* @brief 解析xml设置属性
*
* Describe 根据xml文件设置相关属性
*/
virtual void OnInitFinished(pugi::xml_node xmlNode);
/**
* SLink::SDrawText
* @brief 绘制文本
* @param IRenderTarget *pRT -- 绘制设备句柄
* @param LPCTSTR pszBuf -- 文本内容字符串
* @param int cchText -- 字符串长度
* @param LPRECT pRect -- 指向矩形结构RECT的指针
* @param UINT uFormat -- 正文的绘制选项
*
* Describe 对DrawText封装
*/
virtual void DrawText(IRenderTarget *pRT,LPCTSTR pszBuf,int cchText,LPRECT pRect,UINT uFormat);
/**
* SLink::OnSetCursor
* @brief 设置光标样式和位置
* @param CPoint &pt -- 设置光标位置
* @return 返回值BOOL 成功--TRUE 失败--FALSE
*
* Describe 函数内部会加载光标样式
*/
virtual BOOL OnSetCursor(const CPoint &pt);
void OnLButtonDown(UINT nFlags,CPoint pt);
void OnLButtonUp(UINT nFlags,CPoint pt);
void OnMouseMove(UINT nFlags,CPoint pt);
void OnMouseHover(WPARAM wParam, CPoint ptPos);
SOUI_ATTRS_BEGIN()
ATTR_STRINGT(L"href", m_strLinkUrl, FALSE)
SOUI_ATTRS_END()
SOUI_MSG_MAP_BEGIN()
MSG_WM_LBUTTONDOWN(OnLButtonDown)
MSG_WM_LBUTTONUP(OnLButtonUp)
MSG_WM_MOUSEMOVE(OnMouseMove)
MSG_WM_MOUSEHOVER(OnMouseHover)
SOUI_MSG_MAP_END()
protected:
CRect m_rcText; /**< 文本显示所在位置 */
SStringT m_strLinkUrl; /**< 窗口URL */
};
/**
* @class SButton
* @brief 按钮控件类
*
* Describe 通过属性ID绑定click事件 Use id attribute to process click event
* Usage
*/
class SOUI_EXP SButton : public SWindow
, public IAcceleratorTarget
, public ITimelineHandler
{
SOUI_CLASS_NAME(SButton, L"button")
public:
/**
* SButton::SButton
* @brief 构造函数
*
* Describe 构造函数
*/
SButton();
protected:
/**
* SButton::NeedRedrawWhenStateChange
* @brief 状态变化需要重画
* @return 返回值BOOL 成功--TRUE 失败--FALSE
*
* Describe 当按钮状态发生变化时候需要重新绘制 默认返回TRUE
*/
virtual BOOL NeedRedrawWhenStateChange()
{
return TRUE;
}
/**
* SButton::OnGetDlgCode
* @brief 获得编码
*
* Describe 返回宏定义SC_WANTCHARS代表需要WM_CHAR消息
*/
virtual UINT OnGetDlgCode()
{
return SC_WANTCHARS;
}
/**
* SButton::OnAcceleratorPressed
* @brief 加速键按下
* @param CAccelerator& accelerator -- 加速键相关结构体
* @return 返回值BOOL 成功--TRUE 失败--FALSE
*
* Describe 处理加速键响应消息
*/
virtual bool OnAcceleratorPressed(const SAccelerator& accelerator);
virtual BOOL InitFromXml(pugi::xml_node xmlNode);
protected:
/**
* SButton::OnStateChanged
* @brief 状态改变处理函数
* @param DWORD dwOldState -- 旧状态
* @param DWORD dwNewState -- 新状态
*
* Describe 状态改变处理函数
*/
virtual void OnStateChanged(DWORD dwOldState,DWORD dwNewState);
virtual void OnContainerChanged(ISwndContainer *pOldContainer,ISwndContainer *pNewContainer);
void OnPaint(IRenderTarget *pRT);
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnDestroy();
void OnSize(UINT nType, CSize size);
BOOL OnEraseBkgnd(IRenderTarget * pRT){return TRUE;}
HRESULT OnAttrAccel(SStringW strAccel,BOOL bLoading);
protected:
virtual void OnNextFrame();
/**
* SLink::StopCurAnimate
* @brief 停止动画
*
* Describe 停止动画
*/
void StopCurAnimate();
DWORD m_accel;
BOOL m_bAnimate; /**< 动画标志 */
WORD m_byAlphaAni; /**< 动画状态 */
BYTE m_nAniStep; /**< alpha for an animate step */
BOOL m_bDisableAccelIfInvisible; /**< disable accel if invisible */
public:
SOUI_ATTRS_BEGIN()
ATTR_CUSTOM(L"accel",OnAttrAccel)
ATTR_BOOL(L"animate", m_bAnimate, FALSE)
ATTR_INT(L"animateStep",m_nAniStep,FALSE)
ATTR_BOOL(L"disableAccelIfInvisible",m_bDisableAccelIfInvisible,FALSE)
SOUI_ATTRS_END()
SOUI_MSG_MAP_BEGIN()
MSG_WM_PAINT_EX(OnPaint)
MSG_WM_ERASEBKGND_EX(OnEraseBkgnd)
MSG_WM_LBUTTONDBLCLK(OnLButtonDown) //将双击消息处理为单击
MSG_WM_KEYDOWN(OnKeyDown)
MSG_WM_KEYUP(OnKeyUp)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_SIZE(OnSize)
SOUI_MSG_MAP_END()
};
/**
* @class SImageButton
* @brief 图片按钮类
*
* Describe 图片按钮类,继承SButton
*/
class SOUI_EXP SImageButton : public SButton
{
SOUI_CLASS_NAME(SImageButton, L"imgbtn")
public:
SImageButton();
protected:
/**
* SButton::GetDesiredSize
* @brief 获得期望的大小值
* @param int wid -- 容器宽度
* @param int hei -- 容器高度
*
* Describe 根据内容窗体矩形大小,计算出适合的大小
*/
virtual CSize GetDesiredSize(int wid,int hei);
};
/**
* @class SImageWnd
* @brief 图片控件类
*
* Describe Image Control 图片控件类
* Usage Usage:
*/
class SOUI_EXP SImageWnd : public SWindow
{
SOUI_CLASS_NAME(SImageWnd, L"img")
public:
/**
* SImageWnd::SImageWnd
* @brief 构造函数
*
* Describe 构造函数
*/
SImageWnd();
/**
* SImageWnd::~SImageWnd
* @brief 析构函数
*
* Describe 析构函数
*/
virtual ~SImageWnd();
void OnPaint(IRenderTarget *pRT);
/**
* SImageWnd::SetSkin
* @param ISkinObj *pSkin -- 资源
* @param int iFrame -- 皮肤中的帧号
* @param BOOL bAutoFree -- 资源ID
* @brief 设置皮肤
* @return 返回值BOOL 成功--TRUE 失败--FALSE
*
* Describe 设置皮肤
*/
BOOL SetSkin(ISkinObj *pSkin,int iFrame=0,BOOL bAutoFree=TRUE);
/**
* SImageWnd::SetImage
* @param IBitmap * pBitmap -- 图片对象
* @param FilterLevel fl -- FilterLevel
* @return void
*
* Describe 设置绘制图片
*/
void SetImage(IBitmap * pBitmap,FilterLevel fl=kNone_FilterLevel);
IBitmap* GetImage();
/**
* SImageWnd::SetIcon
* @param int nSubID -- 资源ID
* @brief 设置图标
* @return 返回值BOOL 成功--TRUE 失败--FALSE
*
* Describe 设置图标
*/
BOOL SetIcon(int nSubID);
/**
* SImageWnd::GetSkin
* @brief 获取资源
* @return 返回值ISkinObj指针
*
* Describe 获取资源
*/
ISkinObj * GetSkin(){return m_pSkin;}
protected:
virtual void OnColorize(COLORREF cr);
virtual void OnScaleChanged(int scale);
/**
* SImageWnd::GetDesiredSize
* @brief 获取预期大小
* @param LPRECT pRcContainer -- 内容矩形框
* @return 返回值 CSize对象
*
* Describe 根据矩形的大小,获取预期大小(解释有点不对)
*/
virtual CSize GetDesiredSize(int wid, int hei) ;
int m_iTile; /**<绘制是否平铺,0--位伸(默认),1--不变常规绘制, 2--平铺 */
BOOL m_bManaged; /**< 是否要自动释放当前的m_pSkin对象 */
int m_iIcon; /**< 绘制状态索引 */
SAutoRefPtr m_pSkin; /**< ISkinObj对象 */
SAutoRefPtr m_pImg;/**<使用代码设定的图片*/
FilterLevel m_fl;/**<绘制图片的放大精度*/
bool m_bKeepAspect; /**< keep aspect ratio */
SOUI_ATTRS_BEGIN()
ATTR_SKIN(L"skin", m_pSkin, TRUE)
ATTR_INT(L"iconIndex", m_iIcon, FALSE)
ATTR_INT(L"tile", m_iTile, TRUE)
ATTR_BOOL(L"keepAspect",m_bKeepAspect,TRUE)
SOUI_ATTRS_END()
SOUI_MSG_MAP_BEGIN()
MSG_WM_PAINT_EX(OnPaint)
SOUI_MSG_MAP_END()
};
/**
* @class SAnimateImgWnd
* @brief 动画图片窗口
*
* Describe 此窗口支持动画效果
*/
class SOUI_EXP SAnimateImgWnd : public SWindow, public ITimelineHandler
{
SOUI_CLASS_NAME(SAnimateImgWnd, L"animateimg")
public:
/**
* SAnimateImgWnd::SAnimateImgWnd
* @brief 构造函数
*
* Describe 构造函数
*/
SAnimateImgWnd();
/**
* SAnimateImgWnd::~SAnimateImgWnd
* @brief 析构函数
*
* Describe 析构函数
*/
virtual ~SAnimateImgWnd() {}
/**
* SAnimateImgWnd::Start
* @brief 启动动画
*
* Describe 启动动画
*/
void Start();
/**
* SAnimateImgWnd::Stop
* @brief 停止动画
*
* Describe 停止动画
*/
void Stop();
/**
* SAnimateImgWnd::IsPlaying
* @brief 判断动画运行状态
* @return 返回值是动画状态 TRUE -- 运行中
*
* Describe 判断动画运行状态
*/
BOOL IsPlaying(){return m_bPlaying;}
protected:
/**
* SAnimateImgWnd::GetDesiredSize
* @brief 获取预期大小
* @param LPRECT pRcContainer -- 内容矩形框
* @return 返回值 CSize对象
*
* Describe 根据矩形的大小,获取预期大小(解释有点不对)
*/
virtual CSize GetDesiredSize(int wid, int hei);
virtual void OnNextFrame();
virtual void OnColorize(COLORREF cr);
virtual void OnContainerChanged(ISwndContainer *pOldContainer,ISwndContainer *pNewContainer);
void OnPaint(IRenderTarget *pRT);
void OnShowWindow(BOOL bShow, UINT nStatus);
void OnDestroy();
SOUI_MSG_MAP_BEGIN()
MSG_WM_PAINT_EX(OnPaint)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_SHOWWINDOW(OnShowWindow)
SOUI_MSG_MAP_END()
SOUI_ATTRS_BEGIN()
ATTR_SKIN(L"skin", m_pSkin, TRUE)
ATTR_UINT(L"speed", m_nSpeed, FALSE)
ATTR_BOOL(L"autoStart", m_bAutoStart, FALSE)
ATTR_INT(L"repeat",m_nRepeat,FALSE)
SOUI_ATTRS_END()
protected:
SAutoRefPtr m_pSkin; /**< 动画图片 */
int m_nSpeed; /**< 速度 */
int m_iCurFrame; /**< 当前帧 */
BOOL m_bAutoStart; /**< 是否自动启动 */
BOOL m_bPlaying; /**< 是否运行中 */
int m_iTimeFrame; /**< OnNextFrame的执行次数 */
int m_nRepeat; /**< 播放循环次数,-1代表无限循环 */
int m_iRepeat; /**< 当前播放循环轮次 */
};
/**
* @class SProgress
* @brief 进度条类
*
* Describe 进度条类
* Usage: