class UILIB_API CPaintManagerUI { public: CPaintManagerUI(); ~CPaintManagerUI(); public: void Init(HWND hWnd); // 设置m_hWndPaint和m_hDcPaint, 并将this加入m_aPreMessages void UpdateLayout(); void Invalidate(RECT rcItem); HDC GetPaintDC() const; HWND GetPaintWindow() const; POINT GetMousePos() const; SIZE GetClientSize() const; void SetMinMaxInfo(int cx, int cy); static HINSTANCE GetResourceInstance(); static HINSTANCE GetLanguageInstance(); static void SetResourceInstance(HINSTANCE hInst); // WinMain中调用, 设置模块句柄. 如果语言模块句柄为NULL, 则也将hInst赋值给它. static void SetLanguageInstance(HINSTANCE hInst); HPEN GetThemePen(UITYPE_COLOR Index) const; HFONT GetThemeFont(UITYPE_FONT Index) const; HBRUSH GetThemeBrush(UITYPE_COLOR Index) const; COLORREF GetThemeColor(UITYPE_COLOR Index) const; HICON GetThemeIcon(int Index, int cxySize) const; const TEXTMETRIC& GetThemeFontInfo(UITYPE_FONT Index) const; bool GetThemeColorPair(UITYPE_COLOR Index, COLORREF& clr1, COLORREF& clr2) const; bool AttachDialog(CControlUI* pControl); bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL); void ReapObjects(CControlUI* pControl); CControlUI* GetFocus() const; void SetFocus(CControlUI* pControl); bool SetNextTabControl(bool bForward = true); bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); bool KillTimer(CControlUI* pControl, UINT nTimerID); bool AddNotifier(INotifyUI* pControl); bool RemoveNotifier(INotifyUI* pControl); void SendNotify(TNotifyUI& Msg); // 向m_aNotifiers中注册的Notifiers传递Notify void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); // 根据参数填充好TNotifyUI, 传递给重载的SendNotify处理 bool AddMessageFilter(IMessageFilterUI* pFilter); bool RemoveMessageFilter(IMessageFilterUI* pFilter); bool AddAnimJob(const CAnimJobUI& job); bool AddPostPaintBlit(const TPostPaintUI& job); CControlUI* FindControl(POINT pt) const; CControlUI* FindControl(LPCTSTR pstrName); static void MessageLoop(); // 消息循环!先调用自己的TranslateMessage进行预处理 static bool TranslateMessage(const LPMSG pMsg); // 发送给m_aPreMessages中PreMessageHandler处理 bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes); // 每个控件包含继承自CWindowWnd, 并包含一个CPaintManagerUI成员, // 通过重写CWindowWnd的虚函数HandleMessage, 在其中调用MessageHandler, 得到先处理的机会 bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes); // 消息预处理 TSystemMetricsUI GetSystemMetrics() const; TSystemSettingsUI GetSystemSettings() const; void SetSystemSettings(const TSystemSettingsUI Config); private: static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); private: HWND m_hWndPaint; // 待绘窗口句柄 HDC m_hDcPaint; // 待绘窗口DC HDC m_hDcOffscreen; // 待绘窗口内存DC HBITMAP m_hbmpOffscreen; // 内存DC位图句柄 HWND m_hwndTooltip; TOOLINFO m_ToolTip; // CControlUI* m_pRoot; CControlUI* m_pFocus; // 处于焦点状态的控件指针 CControlUI* m_pEventHover; CControlUI* m_pEventClick; CControlUI* m_pEventKey; // POINT m_ptLastMousePos; // 鼠标位置 SIZE m_szMinWindow; // 最小窗口大小 UINT m_uMsgMouseWheel; UINT m_uTimerID; bool m_bFirstLayout; bool m_bResizeNeeded; bool m_bFocusNeeded; bool m_bOffscreenPaint; bool m_bMouseTracking; // TSystemMetricsUI m_SystemMetrics; TSystemSettingsUI m_SystemConfig; // CStdPtrArray m_aNotifiers; // 注册接收Notify消息的控件 CStdPtrArray m_aNameHash; CStdPtrArray m_aTimers; // 定时器数组 CStdValArray m_aPostPaint; CStdPtrArray m_aMessageFilters; // 注册过滤消息的控件 CStdPtrArray m_aDelayedCleanup; // static HINSTANCE m_hLangInst; static HINSTANCE m_hInstance; // 模块句柄 static CStdPtrArray m_aPreMessages; // CPaintManagerUI类型指针数组, 所有CPaintManagerUI的集合 }; class UILIB_API CControlUI : public INotifyUI { public: CControlUI(); virtual ~CControlUI(); public: virtual CStdString GetName() const; virtual void SetName(LPCTSTR pstrName); virtual LPVOID GetInterface(LPCTSTR pstrName); virtual bool Activate(); virtual CControlUI* GetParent() const; virtual CStdString GetText() const; virtual void SetText(LPCTSTR pstrText); virtual CStdString GetToolTip() const; virtual void SetToolTip(LPCTSTR pstrText); virtual TCHAR GetShortcut() const; virtual void SetShortcut(TCHAR ch); virtual UINT_PTR GetTag() const; virtual void SetTag(UINT_PTR pTag); virtual void SetFocus(); virtual bool IsVisible() const; virtual bool IsEnabled() const; virtual bool IsFocused() const; virtual void SetVisible(bool bVisible = true); virtual void SetEnabled(bool bEnable = true); virtual CControlUI* FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags); virtual CPaintManagerUI* GetManager() const; virtual void SetManager(CPaintManagerUI* pManager, CControlUI* pParent); virtual RECT GetPos() const; virtual void SetPos(RECT rc); virtual UINT GetControlFlags() const; void Invalidate(); void UpdateLayout(); virtual void Init(); virtual void Event(TEventUI& event); virtual void Notify(TNotifyUI& msg); virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); CControlUI* ApplyAttributeList(LPCTSTR pstrList); virtual LPCTSTR GetClass() const = 0; virtual SIZE EstimateSize(SIZE szAvailable) = 0; virtual void DoPaint(HDC hDC, const RECT& rcPaint) = 0; protected: CPaintManagerUI* m_pManager; // 控件由谁管理 CControlUI* m_pParent; // 控件的父亲 TCHAR m_chShortcut; CStdString m_sName; CStdString m_sText; CStdString m_sToolTip; UINT_PTR m_pTag; RECT m_rcItem; bool m_bVisible; bool m_bEnabled; bool m_bFocused; };