zoukankan      html  css  js  c++  java
  • 使用Duilib开发Windows软件(7)——control 类

    control 类是所有控件的基类,各种事件的绑定也都是在这里创建的(比如鼠标按下)

    #ifndef UI_CORE_CONTROL_H_
    #define UI_CORE_CONTROL_H_
    
    #pragma once
    
    namespace ui 
    {
    
    typedef Control* (CALLBACK* FINDCONTROLPROC)(Control*, LPVOID);
    
    class UILIB_API UserDataBase
    {
    public:
    	virtual ~UserDataBase()
    	{
    
    	}
    };
    
    class UILIB_API Control : public PlaceHolder
    {
    	typedef std::map<int, CEventSource> GifEventMap;
    public:
    	Control();
    	Control(const Control& r);
    	Control& operator=(const Control& r) = delete;
        virtual ~Control();
    
        /// 图形相关
    	/**
    	 * @brief 获取背景颜色
    	 * @return 返回背景颜色的字符串,该值在 global.xml 中定义
    	 */
    	std::wstring GetBkColor() const;
    
    	/**
    	 * @brief 设置背景颜色
    	 * @param[in] strColor 要设置的背景颜色值,该值必须在 global.xml 中存在
    	 * @return 无
    	 */
    	void SetBkColor(const std::wstring& strColor);
    
    	/**
    	 * @brief 获取某个状态下的字体颜色
    	 * @param[in] stateType 要获取何种状态下的颜色值,参考 ControlStateType 枚举
    	 * @return 指定状态下设定的颜色字符串,对应 global.xml 中指定色值
    	 */
    	std::wstring GetStateColor(ControlStateType stateType);
    
    	/**
    	 * @brief 设置某个状态下的字体颜色
    	 * @param[in] stateType 要设置何种状态下的颜色值,参考 ControlStateType 枚举
    	 * @param[in] strColor 要设置的颜色值,该值必须在 global.xml 中存在
    	 * @return 无
    	 */
    	void SetStateColor(ControlStateType stateType, const std::wstring& strColor);
    
    	/**
    	 * @brief 获取背景图片位置
    	 * @return 背景图片位置  
    	 */
        std::wstring GetBkImage() const;
    
    	/**
    	 * @brief 获取 UTF8 格式的背景图片位置
    	 * @return 背景图片位置
    	 */
    	std::string GetUTF8BkImage() const;
    
    	/**
    	 * @brief 设置背景图片
    	 * @param[in] strImage 要设置的图片路径
    	 * @return 无
    	 */
        void SetBkImage(const std::wstring& strImage);
    
    	/**
    	 * @brief 设置背景图片(UTF8 格式字符串)
    	 * @param[in] strImage 要设置的图片路径
    	 * @return 无
    	 */
    	void SetUTF8BkImage(const std::string& strImage);
    
    	/**
    	 * @brief 获取指定状态下的图片位置
    	 * @param[in] 要获取何种状态下的图片,参考 ControlStateType 枚举
    	 * @return 指定状态下的图片位置
    	 */
    	std::wstring GetStateImage(ControlStateType stateType);
    
    	/**
    	 * @brief 设置某个状态下的图片
    	 * @param[in] stateType 要设置何种状态下的图片,参考 ControlStateType 枚举
    	 * @param[in] strImage 要设置的图片路径
    	 * @return 无
    	 */
    	void SetStateImage(ControlStateType stateType, const std::wstring& strImage);
    
    	/**
    	 * @brief 获取指定状态下的前景图片
    	 * @param[in] 要获取何种状态下的图片,参考 `ControlStateType` 枚举
    	 * @return 指定状态下前景图片位置
    	 */
    	std::wstring GetForeStateImage(ControlStateType stateType);
    
    	/**
    	 * @brief 设置某个状态下前景图片
    	 * @param[in] stateType 要设置何种状态下的图片,参考 `ControlStateType` 枚举
    	 * @param[in] strImage 要设置的前景图片路径
    	 * @return 无
    	 */
    	void SetForeStateImage(ControlStateType stateType, const std::wstring& strImage);
    
    	/**
    	 * @brief 获取控件状态
    	 * @return 控件的状态,请参考 `ControlStateType` 枚举
    	 */
    	ControlStateType GetState() const;
    
    	/**
    	 * @brief 设置控件状态
    	 * @param[in] pStrState 要设置的控件状态,请参考 `ControlStateType` 枚举
    	 * @return 无
    	 */
    	void SetState(ControlStateType pStrState);
    
    	/**
    	 * @brief 获取控件图片指针
    	 * @return 返回图片对象指针
    	 */
    	virtual Image* GetEstimateImage();
    
    	/// 边框相关
    	/**
    	 * @brief 获取边框大小
    	 * @return 返回边框的大小
    	 */
    	int GetBorderSize() const;
    
    	/**
    	 * @brief 设置边框大小
    	 * @param[in] nSize 要设置的边框大小
    	 * @return 无
    	 */
    	void SetBorderSize(int nSize);
    
    	/**
    	 * @brief 获取边框颜色
    	 * @return 边框的颜色字符串,对应 global.xml 中的具体颜色值
    	 */
    	std::wstring GetBorderColor() const;
    
    	/**
    	 * @brief 设置边框颜色
    	 * @param[in] strBorderColor 设置边框的颜色字符串值,该值必须在 global.xml 中存在
    	 * @return 无
    	 */
    	void SetBorderColor(const std::wstring& strBorderColor);
    
    	/**
    	 * @brief 设置边框的大小
    	 * @param[in] rc 一个 `UiRect` 结构的边框大小集合
    	 * @return 无
    	 */
    	void SetBorderSize(UiRect rc);
    
    	/**
    	 * @brief 获取左侧边框大小
    	 * @return 左侧边框的大小  
    	 */
    	int GetLeftBorderSize() const;
    
    	/**
    	 * @brief 设置左侧边框大小
    	 * @param[in] nSize 要设置的左侧边框大小
    	 * @return 无
    	 */
    	void SetLeftBorderSize(int nSize);
    
    	/**
    	 * @brief 获取顶部边框大小
    	 * @return 顶部边框大小
    	 */
    	int GetTopBorderSize() const;
    
    	/**
    	 * @brief 设置顶部边框大小
    	 * @param[in] nSize 要设置的上方边框大小
    	 * @return 无
    	 */
    	void SetTopBorderSize(int nSize);
    
    	/**
    	 * @brief 获取右侧边框大小
    	 * @return 右侧的边框大小
    	 */
    	int GetRightBorderSize() const;
    
    	/**
    	 * @brief 设置右侧边框大小
    	 * @param[in] nSize 要设置的右侧边框大小
    	 * @return 无
    	 */
    	void SetRightBorderSize(int nSize);
    
    	/**
    	 * @brief 获取下方边框大小
    	 * @return 下方边框大小
    	 */
    	int GetBottomBorderSize() const;
    
    	/**
    	 * @brief 设置下方边框大小
    	 * @param[in] nSize 要设置的下方边框大小
    	 * @return 无
    	 */
    	void SetBottomBorderSize(int nSize);
    
    	/**
    	 * @brief 获取边框大小
    	 * @return 四个方向的边框大小
    	 */
    	CSize GetBorderRound() const;
    
    	/**
    	 * @brief 设置边框大小
    	 * @param[in] cxyRound 一个 CSize 结构表示了四个方向边框的大小
    	 * @return 无
    	 */
    	void SetBorderRound(CSize cxyRound);
    
        /// 鼠标相关
    	/**
    	 * @brief 获取鼠标指针类型
    	 * @return 当前鼠标类型
    	 */
    	virtual CursorType GetCursorType() const;
    
    	/**
    	 * @brief 设置当前鼠标指针类型
    	 * @param[in] flag 要设置的鼠标类型,参考 CursorType 枚举
    	 * @return 无
    	 */
    	void SetCursorType(CursorType flag);
    
    	/**
    	 * @brief 获取控件在鼠标悬浮状态下的提示文本
    	 * @return 返回当前鼠标悬浮状态提示的文本
    	 */
        virtual std::wstring GetToolTipText() const;
    
    	/**
    	 * @brief 获取控件在鼠标悬浮状态下的提示文本(UTF8 格式)
    	 * @return 返回当前鼠标悬浮状态提示的文本
    	 */
    	virtual std::string GetUTF8ToolTipText() const;
    
    	/**
    	 * @brief 设置鼠标悬浮到控件显示的提示文本
    	 * @param[in] strText 要设置的文本
    	 * @return 无
    	 */
    	virtual void SetToolTipText(const std::wstring& strText);
    
    	/**
    	 * @brief 设置鼠标悬浮到控件显示的提示文本(UTF8 格式)
    	 * @param[in] strText 要设置的文本
    	 * @return 无
    	 */
    	virtual void SetUTF8ToolTipText(const std::string& strText);
    
    	/**
    	 * @brief 设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字
    	 * @param[in] strTextId 在语言文件中对应的提示文字 ID
    	 * @return 无
    	 */
    	virtual void SetToolTipTextId(const std::wstring& strTextId);
    
    	/**
    	 * @brief 设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字(UTF8 格式)
    	 * @param[in] strTextId 在语言文件中对应的提示文字 ID
    	 * @return 无
    	 */
    	virtual void SetUTF8ToolTipTextId(const std::string& strTextId);
    
    	/**
    	 * @brief 设置鼠标悬浮到控件上提示的文本单行最大宽度
    	 * @param[in] nWidth 要设置的宽度值
    	 * @return 无
    	 */
    	virtual void SetToolTipWidth(int nWidth);
    
    	/**
    	 * @brief 获取鼠标悬浮到控件上提示的文本单行最大宽度
    	 * @return 当前提示文本最大宽度
    	 */
    	virtual int GetToolTipWidth(void) const;
    
        /// 菜单
    	/**
    	 * @brief 控件是否响应右键菜单消息
    	 * @return 返回结果表示了是否响应右键菜单消息,true 响应右键菜单消息,false 不响应右键菜单消息
    	 */
        virtual bool IsContextMenuUsed() const;
    
    	/**
    	 * @brief 设置控件响应右键菜单消息
    	 * @param[in] bMenuUsed 是否响应右键菜单消息,true 为是,false 为否
    	 * @return 无
    	 */
        virtual void SetContextMenuUsed(bool bMenuUsed);
    
        /// 用户数据,辅助函数,供用户使用
    	/**
    	 * @brief 获取用户绑定到控件的数据字符串
    	 * @return 返回具体数据字符串
    	 */
        virtual std::wstring GetDataID() const;
    
    	/**
    	 * @brief 获取用户绑定到控件的数据字符串(UTF8 格式)
    	 * @return 返回具体数据字符串
    	 */
    	virtual std::string GetUTF8DataID() const;				
    
    	/**
    	 * @brief 绑定一个字符串数据到控件
    	 * @param[in] strText 要绑定的字符串数据
    	 * @return 无
    	 */
        virtual void SetDataID(const std::wstring& strText);
    
    	/**
    	 * @brief 绑定一个字符串数据到控件(UTF8 格式)
    	 * @param[in] strText 要绑定的字符串数据
    	 * @return 无
    	 */
    	virtual void SetUTF8DataID(const std::string& strText);	
    
    	/**
    	 * @brief 获取用户绑定的自定义数据结构
    	 * @return 用户绑定的自定义结构数据指针
    	 */
    	virtual UserDataBase* GetUserDataBase() const;
    
    	/**
    	 * @brief 绑定自定义数据到控件,用户可继承 UserDataBase 来补充需要绑定的数据
    	 * @param[in] pUserDataBase 数据指针
    	 * @return 无
    	 */
    	virtual void SetUserDataBase(UserDataBase* pUserDataBase);
    
        /// 一些重要的属性
    	/**
    	 * @brief 设置控件是否可见
    	 * @param[in] bVisible 为 true 时控件可见,为 false 时控件被隐藏
    	 * @return 无
    	 */
        virtual void SetVisible(bool bVisible = true);
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
        virtual void SetInternVisible(bool bVisible = true); // 仅供内部调用,有些ui拥有窗口句柄,需要重写此函数
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
    	virtual void SetVisible_(bool bVisible);
    
    	/**
    	 * @brief 检查控件是否可用
    	 * @return 控件可用状态,返回 true 控件可用,否则为 false
    	 */
        virtual bool IsEnabled() const;
    
    	/**
    	 * @brief 设置控件可用状态
    	 * @param[in] bEnable 为 true 时控件可用,为 false 时控件为禁用状态则不可用
    	 * @return 无
    	 */
        virtual void SetEnabled(bool bEnable = true);
    
    	/**
    	 * @brief 检查控件是否响应鼠标事件
    	 * @return 返回控件是否响应鼠标事件,返回 true 响应鼠标事件,false 为不响应
    	 */
        virtual bool IsMouseEnabled() const;
    
    	/**
    	 * @brief 设置控件是否响应鼠标事件
    	 * @param[in] bEnable 为 true 响应鼠标事件,为 false 时不响应鼠标事件
    	 * @return 无
    	 */
        virtual void SetMouseEnabled(bool bEnable = true);
    
    	/**
    	 * @brief 检查控件是否响应键盘事件
    	 * @return 返回控件是否响应键盘事件,返回 true 响应键盘事件,false 不响应键盘事件
    	 */
        virtual bool IsKeyboardEnabled() const;
    
    	/**
    	 * @brief 设置控件是否响应键盘事件
    	 * @param[in] bEnable 为 true 响应键盘事件,为 false 时不响应键盘事件
    	 * @return 无
    	 */
        virtual void SetKeyboardEnabled(bool bEnable = true);
    
    	/**
    	 * @brief 检查控件是否具有焦点
    	 * @return 返回控件是否具有检点,为 true 时是当前具有焦点,为 false 时控件没有焦点
    	 */
        virtual bool IsFocused() const;
    
    	/**
    	 * @brief 让控件获取焦点
    	 * @return 无
    	 */
        virtual void SetFocus();
    
    	/**
    	 * @brief 返回控件的标识,用于判断是否可以响应 TAB 切换事件
    	 * @return 返回控件的标识类型
    	 */
    	virtual UINT GetControlFlags() const;
    
    	/**
    	 * @brief 让控件设置永远获取不到焦点
    	 * @return 无
    	 */
    	void SetNoFocus(); // 控件永远不要焦点,与KillFocus不一样
    
    	/**
    	 * @brief 判断当前鼠标焦点是否在控件上
    	 * @return 返回鼠标焦点是否在控件上,true 鼠标焦点在控件上,false 鼠标焦点不在控件上
    	 */
    	virtual bool IsMouseFocused() const { return m_bMouseFocused;}
    
    	/**
    	 * @brief 设置是否将鼠标焦点到控件上
    	 * @param[in] bMouseFocused 为 true 时设置鼠标焦点到控件上,为 false 时让控件失去鼠标焦点
    	 * @return 无
    	 */
    	virtual void SetMouseFocused(bool bMouseFocused) { m_bMouseFocused = bMouseFocused; }
    
    	/**
    	 * @brief 判断控件当前是否是激活状态
    	 * @return 返回控件状态,true 控件当前是激活状态,可见并可用,false 控件当前非激活状态,可能不可见或被禁用
    	 */
    	virtual bool IsActivatable() const;
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
    	virtual void Activate();
    
    	/// 控件搜索
    	/**
    	 * @brief 根据坐标查找指定控件
    	 * @param[in] Proc
    	 * @param[in] pData
    	 * @param[in] uFlags
    	 * @param[in] scrollPos
    	 * @return 返回控件的指针
    	 */
        virtual Control* FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags, CPoint scrollPos = CPoint());
    
    	/// 位置相关
    	/**
    	 * @brief 获取控件位置
    	 * @param[in] bContainShadow 是否包含阴影,默认为 true 则包含阴影范围,否则 false 为不包含
    	 * @return 返回控件的位置信息
    	 */
    	virtual	UiRect GetPos(bool bContainShadow = true) const override;
    
    	/**
    	 * @brief 设置控件位置
    	 * @param[in] rc 控件位置的描述信息
    	 * @return 无
    	 */
    	virtual void SetPos(UiRect rc) override;
    
    	/**
    	 * @brief 获取控件的外边距
    	 * @return 返回控件的外边距
    	 */
    	virtual UiRect GetMargin() const;
    
    	/**
    	 * @brief 设置控件的外边距
    	 * @param[in] rcMargin 控件的外边距信息
    	 * @param[in] bNeedDpiScale 是否让外边距根据 DPI 适配,默认为 true,false 不适配 DPI
    	 * @return 无
    	 */
    	virtual void SetMargin(UiRect rcMargin, bool bNeedDpiScale = true);
    
    	/**
    	 * @brief 计算控件大小
    	 * @param[in] szAvailable 暂无意义
    	 * @return szAvailable 控件实际大小(如果设置了图片并设置 width 或 height 任意一项为 auto,将根据图片来计算最终大小)
    	 */
    	virtual CSize EstimateSize(CSize szAvailable);
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
    	virtual CSize EstimateText(CSize szAvailable, bool& bReEstimateSize);
    
    	/**
    	 * @brief 检查指定坐标是否在滚动条当前滚动位置的范围内
    	 * @param[in] point 具体坐标
    	 * @return 返回是否在范围内,true 在滚动条当前滚动位置范围内,false 不在滚动条当前滚动位置范围内
    	 */
    	virtual bool IsPointInWithScrollOffset(const CPoint& point) const;
    
    	// 消息处理
    	/**
    	 * @brief 控件统一的消息处理入口,将传统 Windows 消息转换为自定义格式的消息
    	 * @param[in] eventType	消息内容
    	 * @param[in] wParam	消息附加内容
    	 * @param[in] lParam	消息附加内容
    	 * @param[in] tChar		按键信息
    	 * @param[in] mousePos	鼠标信息
    	 * @return 无
    	 */
    	void HandleMessageTemplate(EventType eventType, WPARAM wParam = 0, LPARAM lParam = 0, TCHAR tChar = 0, CPoint mousePos = CPoint(), FLOAT pressure = 0.0f);
    
    	/**
    	 * @brief 将转换后的消息派发到消息处理函数
    	 * @param[in] msg 消息内容
    	 * @return 无
    	 */
        virtual void HandleMessageTemplate(EventArgs& msg);
    
    	/**
    	 * @brief 判断控件是否有 HOT 状态
    	 * @return 返回 true 有 HOT 状态, 否则为 false
    	 */
    	virtual bool HasHotState();
    
    	/**
    	 * @brief 设置控件是否响应触控消息
    	 * @param[in] bRecv 设置为 true 表示响应触控消息,false 为不响应
    	 * @return 无
    	 */
    	void SetReceivePointerMsg(bool bRecv) { m_bReceivePointerMsg = bRecv; };
    	
    	/**
    	 * @brief 判断控件是否响应触控消息
    	 * @return 返回 true 为响应,否则为 false
    	 */
    	bool IsReceivePointerMsg() const { return m_bReceivePointerMsg; };
    
    	/**
    	 * @brief 设置控件失去焦点时是否发送鼠标弹起消息
    	 * @param[in] bNeed 设置为 true 表示响应触控消息,false 为不响应
    	 * @return 无
    	 */
    	void SetNeedButtonUpWhenKillFocus(bool bNeed) { m_bNeedButtonUpWhenKillFocus = bNeed; };
    
    	/**
    	 * @brief 判断控件失去焦点时是否发送鼠标弹起消息
    	 * @return 返回 true 为需要,false 为不需要
    	 */
    	bool IsNeedButtonUpWhenKillFocus() const { return m_bNeedButtonUpWhenKillFocus; };
    
    	// 属性设置
    	/**
    	 * @brief 设置控件指定属性
    	 * @param[in] strName 要设置的属性名称(如 width)
    	 * @param[in] strValue 要设置的属性值(如 100)
    	 * @return 无
    	 */
        virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue);
    
    	/**
    	 * @brief 设置控件的 class 全局属性
    	 * @param[in] strClass 要设置的 class 名称,该名称必须在 global.xml 中存在
    	 * @return 无
    	 */
    	void SetClass(const std::wstring& strClass);
    
    	/**
    	 * @brief 应用一套属性列表
    	 * @param[in] strList 属性列表的字符串表示,如 `width="100" height="30"`
    	 * @return 无
    	 */
        void ApplyAttributeList(const std::wstring& strList);
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
    	bool OnApplyAttributeList(const std::wstring& strReceiver, const std::wstring& strList, EventArgs* eventArgs);
    
    	/// 绘制操作
    	/**
    	 * @brief 根据图片路径缓存图片信息
    	 * @param[in,out] duiImage 传入时标注图片的路径信息,如果成功则会缓存图片并记录到该参数的成员中
    	 * @return 无
    	 */
    	void GetImage(Image& duiImage) const;
    
    	/**
    	 * @brief 绘制图片
    	 * @param[in] pRender 绘制上下文
    	 * @param[in] duiImage 图片对象
    	 * @param[in] strModify 图片的附加属性
    	 * @param[in] nFade 控件的透明度,如果启用动画效果该值在绘制时是不断变化的
    	 * @return 成功返回 true,失败返回 false
    	 */
    	bool DrawImage(IRenderContext* pRender, Image& duiImage, const std::wstring& strModify = L"", int nFade = DUI_NOSET_VALUE);
    
    	/**
    	* @brief 获取绘制上下文对象
    	* @return 返回绘制上下文对象
    	*/
    	IRenderContext* GetRenderContext();
    
    	/**
    	* @brief 清理绘制上下文对象
    	* @return 无
    	*/
    	void ClearRenderContext();
    
    	/**
    	 * @brief 待补充
    	 * @param[in] 待补充
    	 * @return 待补充
    	 */
    	virtual void AlphaPaint(IRenderContext* pRender, const UiRect& rcPaint);
    	
    	/**
    	* @brief 绘制控件的入口函数
    	* @param[in] pRender 指定绘制区域
    	* @param[in] rcPaint 指定绘制坐标
    	* @return 无
    	*/
    	virtual void Paint(IRenderContext* pRender, const UiRect& rcPaint);
    
    	/**
    	* @brief 绘制控件子项入口函数
    	* @param[in] pRender 指定绘制区域
    	* @param[in] rcPaint 指定绘制坐标
    	* @return 无
    	*/
    	virtual void PaintChild(IRenderContext* pRender, const UiRect& rcPaint) {};
    
    	/**
    	* @brief 设置是否对绘制范围做剪裁限制
    	* @param[in] clip 设置 true 为需要,否则为不需要,见绘制函数
    	* @return 无
    	*/
    	void SetClip(bool clip) { m_bClip = clip; };
    
    	/**
    	* @brief 判断是否对绘制范围做剪裁限制
    	* @return 返回 true 为需要,false 为不需要
    	*/
    	bool IsClip() const { return m_bClip; }
    
    	/**
    	 * @brief 设置控件透明度
    	 * @param[in] alpha 0 ~ 255 的透明度值,255 为不透明
    	 * @return 无
    	 */
    	void SetAlpha(int alpha);
    
    	/**
    	 * @brief 获取控件透明度
    	 * @return 返回控件的透明度
    	 */
    	int GetAlpha() const { return m_nAlpha;	}
    
    	/**
    	 * @brief 检查控件是否有透明属性
    	 * @return 返回控件是否透明,true 控件当前有透明属性,false 控件没有透明属性
    	 */
    	bool IsAlpha() const { return m_nAlpha != 255; }
    
    	/**
    	 * @brief 设置焦点状态透明度
    	 * @param[in] alpha 0 ~ 255 的透明度值,255 为不透明
    	 * @return 无
    	 */
    	void SetHotAlpha(int nHotAlpha);
    
    	/**
    	 * @brief 获取焦点状态透明度
    	 * @return 返回控件焦点状态的透明度
    	 */
    	int GetHotAlpha() const { return m_nHotAlpha; }
    
    	/**
    	 * @brief 获取控件绘制偏移量
    	 * @return 返回当前控件的绘制偏移量
    	 */
    	CPoint GetRenderOffset() const { return m_renderOffset;	}
    
    	/**
    	 * @brief 设置控件绘制偏移量
    	 * @param[in] renderOffset 控件偏移数据
    	 * @return 无
    	 */
    	void SetRenderOffset(CPoint renderOffset);
    
    	/**
    	 * @brief 设置控件偏移的 X 坐标
    	 * @param[in] renderOffsetX X 坐标值
    	 * @return 无
    	 */
    	void SetRenderOffsetX(int renderOffsetX);
    
    	/**
    	 * @brief 设置控件偏移的 Y 坐标
    	 * @param[in] renderOffsetY Y 坐标值
    	 * @return 无
    	 */
    	void SetRenderOffsetY(int renderOffsetY);
    
    	/// Gif图片
    	/**
    	 * @brief 播放 GIF
    	 * @param[in] 播放完成停止在哪一帧,可设置第一帧、当前帧和最后一帧。请参考 GifStopType 枚举
    	 * @return 无
    	 */
    	void StartGifPlayForUI(GifStopType frame = kGifStopFirst,int playcount = -1);
    
    	/**
    	 * @brief 停止播放 GIF
    	 * @param[in] transfer 是否将停止事件通知给订阅者,参考 AttachGifPlayStop 方法
    	 * @param[frame] frame 播放结束停止在哪一帧,可设置第一帧、当前帧和最后一帧。请参考 GifStopType 枚举
    	 * @return 无
    	 */
    	void StopGifPlayForUI(bool transfer = false, GifStopType frame = kGifStopCurrent);
    
    	/**
    	 * @brief 监听 GIF 播放完成通知
    	 * @param[in] callback 要监听 GIF 停止播放的回调函数
    	 * @return 无
    	 */
    	void AttachGifPlayStop(const EventCallback& callback){ OnGifEvent[m_nVirtualEventGifStop] += callback; };
    
    	/// 动画管理
    	/**
    	 * @brief 获取动画管理器指针
    	 * @return 返回动画管理器指针
    	 */
    	AnimationManager& GetAnimationManager()	{ return m_animationManager; }
    
    	/// 图片缓存
    	/**
    	 * @brief 缓存图片
    	 * @return 无
    	 */
    	virtual void InvokeLoadImageCache();
    
    	/**
    	 * @brief 取消加载图片缓存
    	 * @return 无
    	 */
    	virtual void UnLoadImageCache();
    
    	/**
    	 * @brief 清理图片缓存
    	 * @return 无
    	 */
    	virtual void ClearImageCache();
    
    	/**
    	 * @brief 监听控件所有事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachAllEvents(const EventCallback& callback)	{ OnEvent[kEventAll] += callback; }
    
    	/**
    	 * @brief 监听鼠标进入事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachMouseEnter(const EventCallback& callback) { OnEvent[kEventMouseEnter] += callback; }
    
    	/**
    	 * @brief 监听鼠标离开事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachMouseLeave(const EventCallback& callback) { OnEvent[kEventMouseLeave] += callback; }
    
    	/**
    	 * @brief 监听鼠标悬浮事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachMouseHover(const EventCallback& callback) { OnEvent[kEventMouseHover] += callback; }
    
    	/**
    	 * @brief 监听鼠标按下事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachButtonDown(const EventCallback& callback) { OnEvent[kEventMouseButtonDown] += callback; }
    
    	/**
    	 * @brief 监听鼠标弹起事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachButtonUp(const EventCallback& callback) { OnEvent[kEventMouseButtonUp] += callback; }
    
    	/**
    	 * @brief 监听获得焦点事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachSetFocus(const EventCallback& callback) { OnEvent[kEventSetFocus] += callback; }
    
    	/**
    	 * @brief 监听失去焦点事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachKillFocus(const EventCallback& callback) { OnEvent[kEventKillFocus] += callback; }
    
    	/**
    	 * @brief 监听右键菜单事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachMenu(const EventCallback& callback) { OnEvent[kEventMouseMenu] += callback; }
    
    	/**
    	 * @brief 监听控件大小改变事件
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void AttachResize(const EventCallback& callback) { OnEvent[kEventResize] += callback; }
    
    	/**
    	 * @brief 取消监听指定事件,见 EventType 枚举
    	 * @param[in] callback 事件处理的回调函数,请参考 EventCallback 声明
    	 * @return 无
    	 */
    	void DetachEvent(EventType type);
    
    protected:
    	friend WindowBuilder;
    	void AttachXmlEvent(EventType eventType, const EventCallback& callback) { OnXmlEvent[eventType] += callback; }
    	/// Gif图片
    	void GifPlay();
    	void StopGifPlay(GifStopType frame = kGifStopCurrent);
    
    	
    	/// 消息处理的保护成员函数,不允许外部直接调用
    	virtual void HandleMessage(EventArgs& msg);
    	virtual bool MouseEnter(EventArgs& msg);
    	virtual bool MouseLeave(EventArgs& msg);
    	virtual bool ButtonDown(EventArgs& msg);
    	virtual bool ButtonUp(EventArgs& msg);
    
    	/// 绘制相关保护成员函数,不允许外部直接调用
    	virtual void PaintBkColor(IRenderContext* pRender);
    	virtual void PaintBkImage(IRenderContext* pRender);
    	virtual void PaintStatusColor(IRenderContext* pRender);
    	virtual void PaintStatusImage(IRenderContext* pRender);
    	virtual void PaintText(IRenderContext* pRender);
    	virtual void PaintBorder(IRenderContext* pRender);
    
    private:
    	void BroadcastGifEvent(int nVirtualEvent);
    	int GetGifFrameIndex(GifStopType frame);
    
    protected:
    	EventMap OnXmlEvent;
    	EventMap OnEvent;
    	GifEventMap OnGifEvent;
    	std::unique_ptr<UserDataBase> m_pUserDataBase;
    	bool m_bMenuUsed;
    	bool m_bEnabled;
    	bool m_bMouseEnabled;
    	bool m_bKeyboardEnabled;
    	bool m_bFocused;
    	bool m_bMouseFocused;
    	bool m_bSetPos;		// 防止SetPos循环调用
    	bool m_bNoFocus;	//控件不需要焦点
    	bool m_bClip;
    	bool m_bGifPlay;
    	bool m_bReceivePointerMsg;
    	bool m_bNeedButtonUpWhenKillFocus;
    	int m_nBorderSize;
    	int m_nTooltipWidth;
    	int m_nAlpha;
    	int m_nHotAlpha;
    	CSize m_szEstimateSize;
    	CPoint m_renderOffset;
    	CSize m_cxyBorderRound;
    	UiRect m_rcMargin;
    	UiRect m_rcPaint;
    	UiRect m_rcBorderSize;
    	CursorType m_cursorType;	//影响控件的鼠标形状
    	ControlStateType m_uButtonState;
    	std::wstring m_sToolTipText;
    	std::wstring m_sToolTipTextId;
    	std::wstring m_sUserData;
    	std::wstring m_strBkColor;
    	StateColorMap m_colorMap;
    	Image m_bkImage;
    	StateImageMap m_imageMap;
    	std::wstring m_strBorderColor;
    	nbase::WeakCallbackFlag m_gifWeakFlag;
    	AnimationManager m_animationManager;
    	nbase::WeakCallbackFlag m_loadBkImageWeakFlag;
    	static const int m_nVirtualEventGifStop;
    };
    
    } // namespace ui
    
    #endif // UI_CORE_CONTROL_H_
    
  • 相关阅读:
    redis redis-cli 操作指令
    Apache 配置默认编码
    Apache 查找httpd.conf文件
    Apache 错误日志
    dataTable 自定义排序
    bootstrap select2 参数详解
    获取元素滚动条高度
    TP5 操作DB is null is not null 条件
    TP5 自带分页类的传参
    jquery 获取 file 表单 上传的文件名
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/13280402.html
Copyright © 2011-2022 走看看