#ifndef UI_CORE_IMAGEDECODE_H_ #define UI_CORE_IMAGEDECODE_H_ #pragma once #include namespace ui { class UILIB_API ImageInfo { public: ImageInfo(); ~ImageInfo(); void SetAlpha(bool bAlphaChannel) { m_bAlphaChannel = bAlphaChannel; } bool IsAlpha() { return m_bAlphaChannel; } bool IsCached() { return m_bCached; } void SetCached(bool bCached) { m_bCached = bCached; } void SetPropertyItem(Gdiplus::PropertyItem* pPropertyItem); void PushBackHBitmap(HBITMAP hBitmap); HBITMAP GetHBitmap(int nIndex); int GetFrameCount(); bool IsGif(); int GetInterval(int nIndex); //毫秒为单位 static std::unique_ptr LoadImage(const std::wstring& strImageFullPath); static std::unique_ptr LoadImage(HGLOBAL hGlobal, const std::wstring& imageFullPath); private: static std::unique_ptr LoadImageByBitmap(std::unique_ptr& pGdiplusBitmap, const std::wstring& imageFullPath); public: int nX; int nY; std::wstring sImageFullPath; private: bool m_bAlphaChannel; bool m_bCached; std::unique_ptr m_propertyItem; std::vector m_vecBitmap; }; struct UILIB_API ImageAttribute { public: ImageAttribute(); void Init(); void SetImageString(const std::wstring& strImageString); static void ModifyAttribute(ImageAttribute& imageAttribute, const std::wstring& strImageString); std::wstring simageString; std::wstring sImageName; UiRect rcDest; UiRect rcSource; UiRect rcCorner; BYTE bFade; bool bTiledX; bool bTiledY; int nPlayCount;//如果是GIF可以指定播放次数 -1 :一直播放,缺省值。 }; class UILIB_API Image { public: Image(); bool IsValid() { return (bool)imageCache; } bool IsPlaying() { return m_bPlaying; } void SetPlaying(bool bPlaying) { m_bPlaying = bPlaying; } void SetImageString(const std::wstring& strImageString); void ClearCache(); bool IncrementCurrentFrame(); void SetCurrentFrame(int nCurrentFrame); HBITMAP GetCurrentHBitmap(); int GetCurrentInterval(); int GetCurrentFrameIndex(); int GetCycledCount(); void ClearCycledCount(); bool ContinuePlay(); ImageAttribute imageAttribute; std::shared_ptr imageCache; private: int m_nCurrentFrame; bool m_bPlaying; int m_nCycledCount;//播放次数 }; class UILIB_API StateImage { public: StateImage(); void SetControl(Control* control) { m_pControl = control; } Image& operator[](ControlStateType stateType) { return m_stateImageMap[stateType]; } bool HasHotImage(); bool PaintStatusImage(IRenderContext* pRender, ControlStateType stateType, const std::wstring& sImageModify = L""); Image* GetEstimateImage(); void ClearCache(); private: Control* m_pControl; std::map m_stateImageMap; }; class UILIB_API StateImageMap { public: StateImageMap() { } void SetControl(Control* control); void SetImage(StateImageType stateImageType, ControlStateType stateType, const std::wstring& strImagePath); std::wstring GetImagePath(StateImageType stateImageType, ControlStateType stateType); bool HasHotImage(); bool PaintStatusImage(IRenderContext* pRender, StateImageType stateImageType, ControlStateType stateType, const std::wstring& sImageModify = L""); Image* GetEstimateImage(StateImageType stateImageType); void ClearCache(); private: std::map m_stateImageMap; }; class UILIB_API StateColorMap { public: StateColorMap(); void SetControl(Control* control); std::wstring& operator[](ControlStateType stateType) { return m_stateColorMap[stateType]; } bool HasHotColor(); void PaintStatusColor(IRenderContext* pRender, UiRect rcPaint, ControlStateType stateType); private: Control* m_pControl; std::map m_stateColorMap; }; } // namespace ui #endif // UI_CORE_IMAGEDECODE_H_