#ifndef __UICONTROL_H__ #define __UICONTROL_H__ #pragma once namespace DuiLib { ///////////////////////////////////////////////////////////////////////////////////// // typedef CControlUI* (CALLBACK* FINDCONTROLPROC)(CControlUI*, LPVOID); class UILIB_API CControlUI { DECLARE_DUICONTROL(CControlUI) public: CControlUI(); virtual ~CControlUI(); public: virtual CDuiString GetName() const; virtual void SetName(LPCTSTR pstrName); virtual LPCTSTR GetClass() const; virtual LPVOID GetInterface(LPCTSTR pstrName); virtual UINT GetControlFlags() const; virtual bool Activate(); virtual CPaintManagerUI* GetManager() const; virtual void SetManager(CPaintManagerUI* pManager, CControlUI* pParent, bool bInit = true); virtual CControlUI* GetParent() const; void setInstance(HINSTANCE instance = NULL) {m_instance = instance;}; // 定时器 bool SetTimer(UINT nTimerID, UINT nElapse); void KillTimer(UINT nTimerID); // 文本相关 virtual CDuiString GetText() const; virtual void SetText(LPCTSTR pstrText); virtual bool IsResourceText() const; virtual void SetResourceText(bool bResource); virtual bool IsDragEnabled() const; virtual void SetDragEnable(bool bDrag); virtual bool IsDropEnabled() const; virtual void SetDropEnable(bool bDrop); virtual bool IsRichEvent() const; virtual void SetRichEvent(bool bEnable); // 图形相关 LPCTSTR GetGradient(); void SetGradient(LPCTSTR pStrImage); DWORD GetBkColor() const; void SetBkColor(DWORD dwBackColor); DWORD GetBkColor2() const; void SetBkColor2(DWORD dwBackColor); DWORD GetBkColor3() const; void SetBkColor3(DWORD dwBackColor); DWORD GetForeColor() const; void SetForeColor(DWORD dwForeColor); LPCTSTR GetBkImage(); void SetBkImage(LPCTSTR pStrImage); LPCTSTR GetForeImage() const; void SetForeImage(LPCTSTR pStrImage); DWORD GetFocusBorderColor() const; void SetFocusBorderColor(DWORD dwBorderColor); bool IsColorHSL() const; void SetColorHSL(bool bColorHSL); SIZE GetBorderRound() const; void SetBorderRound(SIZE cxyRound); bool DrawImage(HDC hDC, LPCTSTR pStrImage, LPCTSTR pStrModify = NULL); //边框相关 int GetBorderSize() const; void SetBorderSize(int nSize); DWORD GetBorderColor() const; void SetBorderColor(DWORD dwBorderColor); RECT GetBorderRectSize() const; void SetBorderSize(RECT rc); int GetLeftBorderSize() const; void SetLeftBorderSize(int nSize); int GetTopBorderSize() const; void SetTopBorderSize(int nSize); int GetRightBorderSize() const; void SetRightBorderSize(int nSize); int GetBottomBorderSize() const; void SetBottomBorderSize(int nSize); int GetBorderStyle() const; void SetBorderStyle(int nStyle); // 位置相关 virtual RECT GetRelativePos() const; // 相对(父控件)位置 virtual RECT GetClientPos() const; // 客户区域(除去scrollbar和inset) virtual const RECT& GetPos() const; virtual void SetPos(RECT rc, bool bNeedInvalidate = true); virtual void Move(SIZE szOffset, bool bNeedInvalidate = true); virtual int GetWidth() const; virtual int GetHeight() const; virtual int GetX() const; virtual int GetY() const; virtual RECT GetPadding() const; virtual void SetPadding(RECT rcPadding); // 设置外边距,由上层窗口绘制 virtual SIZE GetFixedXY() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedXY(SIZE szXY); // 仅float为true时有效 virtual SIZE GetFixedSize() const; virtual int GetFixedWidth() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedWidth(int cx); // 预设的参考值 virtual int GetFixedHeight() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedHeight(int cy); // 预设的参考值 virtual int GetMinWidth() const; virtual void SetMinWidth(int cx); virtual int GetMaxWidth() const; virtual void SetMaxWidth(int cx); virtual int GetMinHeight() const; virtual void SetMinHeight(int cy); virtual int GetMaxHeight() const; virtual void SetMaxHeight(int cy); virtual TPercentInfo GetFloatPercent() const; virtual void SetFloatPercent(TPercentInfo piFloatPercent); virtual void SetFloatAlign(UINT uAlign); virtual UINT GetFloatAlign() const; // 鼠标提示 virtual CDuiString GetToolTip() const; virtual void SetToolTip(LPCTSTR pstrText); virtual void SetToolTipWidth(int nWidth); virtual int GetToolTipWidth(void); // 多行ToolTip单行最长宽度 // 光标 virtual WORD GetCursor(); virtual void SetCursor(WORD wCursor); // 快捷键 virtual TCHAR GetShortcut() const; virtual void SetShortcut(TCHAR ch); // 菜单 virtual bool IsContextMenuUsed() const; virtual void SetContextMenuUsed(bool bMenuUsed); // 用户属性 virtual const CDuiString& GetUserData(); // 辅助函数,供用户使用 virtual void SetUserData(LPCTSTR pstrText); // 辅助函数,供用户使用 virtual UINT_PTR GetTag() const; // 辅助函数,供用户使用 virtual void SetTag(UINT_PTR pTag); // 辅助函数,供用户使用 // 一些重要的属性 virtual bool IsVisible() const; virtual void SetVisible(bool bVisible = true); virtual void SetInternVisible(bool bVisible = true); // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数 virtual bool IsEnabled() const; virtual void SetEnabled(bool bEnable = true); virtual bool IsMouseEnabled() const; virtual void SetMouseEnabled(bool bEnable = true); virtual bool IsKeyboardEnabled() const; virtual void SetKeyboardEnabled(bool bEnable = true); virtual bool IsFocused() const; virtual void SetFocus(); virtual bool IsFloat() const; virtual void SetFloat(bool bFloat = true); virtual CControlUI* FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags); void Invalidate(); bool IsUpdateNeeded() const; void NeedUpdate(); void NeedParentUpdate(); DWORD GetAdjustColor(DWORD dwColor); virtual void Init(); virtual void DoInit(); virtual void Event(TEventUI& event); virtual void DoEvent(TEventUI& event); // ◆【滑动起手误按压 · 公共清接口】 // // 语义:把本控件"因手指/鼠标按下而进入的按压视觉"复位为普通态。 // **只改视觉 —— 不发任何通知、不 Activate、不碰业务数据。** // // 为什么放在基类而不是继续用 CButtonUI::ClearPushedState: // CPaintManagerUI::ClearPushedStateAt 原先走的是 // `GetInterface(DUI_CTR_BUTTON)` ⇒ 只有 CButtonUI 及少数实现了该接口的 // 控件能被清到。业务侧那些**自绘的、继承自布局类**的控件 // (如本项目的 CDiandanFoodItemUI : CVerticalLayoutUI,按下态靠换背景图 // 实现,根本没有 m_uButtonState)会被那条早退路直接跳过 ⇒ // 触摸滑动起手时留下按压态背景(用户实测 bug)。 // // 有了基类虚函数,库侧只要按基类指针 `pControl->ClearPushedState()` // 调用即可自动虚分派,不需要库去认识业务的每一个自绘控件。 // // 默认空实现:绝大多数控件没有"按压视觉",调用它必须是安全的 no-op。 // // ⚠️⚠️ 这里只做**声明**,定义在 UIControl.cpp。 // 绝不能写成类内 `{ }` 内联体 —— 那样会与 .cpp 里的定义构成 // "同一函数两处定义" ⇒ **C2084「函数已有主体」**(真机踩过)。 // 规则:类内给函数体 = 隐式 inline 且**构成定义**; // 若 .cpp 里还要写一份,头文件就必须只留 `;`。 virtual void ClearPushedState(); // 自定义(未处理的)属性 void AddCustomAttribute(LPCTSTR pstrName, LPCTSTR pstrAttr); LPCTSTR GetCustomAttribute(LPCTSTR pstrName) const; bool RemoveCustomAttribute(LPCTSTR pstrName); void RemoveAllCustomAttribute(); virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); CControlUI* ApplyAttributeList(LPCTSTR pstrList); virtual SIZE EstimateSize(SIZE szAvailable); virtual bool Paint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl = NULL); // 返回要不要继续绘制 virtual bool DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl); virtual void PaintBkColor(HDC hDC); virtual void PaintBkImage(HDC hDC); virtual void PaintStatusImage(HDC hDC); virtual void PaintForeColor(HDC hDC); virtual void PaintForeImage(HDC hDC); virtual void PaintText(HDC hDC); virtual void PaintBorder(HDC hDC); virtual void DoPostPaint(HDC hDC, const RECT& rcPaint); //虚拟窗口参数 void SetVirtualWnd(LPCTSTR pstrValue); CDuiString GetVirtualWnd() const; public: CEventSource OnInit; CEventSource OnDestroy; CEventSource OnSize; CEventSource OnEvent; CEventSource OnNotify; protected: CPaintManagerUI* m_pManager; CControlUI* m_pParent; CDuiString m_sVirtualWnd; CDuiString m_sName; bool m_bUpdateNeeded; bool m_bMenuUsed; RECT m_rcItem; RECT m_rcPadding; SIZE m_cXY; SIZE m_cxyFixed; SIZE m_cxyMin; SIZE m_cxyMax; bool m_bVisible; bool m_bInternVisible; bool m_bEnabled; bool m_bMouseEnabled; bool m_bKeyboardEnabled; bool m_bFocused; bool m_bFloat; TPercentInfo m_piFloatPercent; UINT m_uFloatAlign; bool m_bSetPos; // 防止SetPos循环调用 bool m_bRichEvent; bool m_bDragEnabled; bool m_bDropEnabled; bool m_bResourceText; CDuiString m_sText; CDuiString m_sToolTip; TCHAR m_chShortcut; CDuiString m_sUserData; UINT_PTR m_pTag; CDuiString m_sGradient; DWORD m_dwBackColor; DWORD m_dwBackColor2; DWORD m_dwBackColor3; DWORD m_dwForeColor; CDuiString m_sBkImage; CDuiString m_sForeImage; DWORD m_dwBorderColor; DWORD m_dwFocusBorderColor; bool m_bColorHSL; int m_nBorderSize; int m_nBorderStyle; int m_nTooltipWidth; WORD m_wCursor; SIZE m_cxyBorderRound; RECT m_rcPaint; RECT m_rcBorderSize; HINSTANCE m_instance; CStdStringPtrMap m_mCustomAttrHash; }; } // namespace DuiLib #endif // __UICONTROL_H__