#ifndef WIN_IMPL_BASE_HPP
#define WIN_IMPL_BASE_HPP


namespace DuiLib
{
	enum UILIB_RESOURCETYPE
	{
		UILIB_FILE=1,				// ���Դ����ļ�
		UILIB_ZIP,						// ���Դ���zipѹ����
		UILIB_RESOURCE,			// ������Դ
		UILIB_ZIPRESOURCE,	// ������Դ��zipѹ����
	};

	class UILIB_API WindowImplBase
		: public CWindowWnd
		, public CNotifyPump
		, public INotifyUI
		, public IMessageFilterUI
		, public IDialogBuilderCallback
	{
	public:
		WindowImplBase();
		virtual ~WindowImplBase(){};
		virtual void InitWindow(){};
		virtual void OnFinalMessage( HWND hWnd );
    	virtual void Notify(TNotifyUI& msg);
		
		//------------------------add---------------------------
		UINT DoModal (HWND hParent = nullptr);

		template<class ControlTy_ = CControlUI>
		ControlTy_* const FindControl (LPCTSTR lpstrName)
		{
			auto pControl = m_PaintManager.FindControl( lpstrName );
			//assert( nullptr != pControl );
			return reinterpret_cast<ControlTy_*>(pControl);
		};


#define DUI_OBJ(obj_name) auto obj_name = WindowImplBase::FindControl(L#obj_name) 
#define DUI_OBJ_EXT(obj_name,obj_type) auto obj_name = WindowImplBase::FindControl<obj_type>(L#obj_name) 

#define DECLARE_DUI_FILE(_dir,_xml,_unused) \
    public:								   \
	DuiLib::CDuiString GetSkinFolder () {return L#_dir;}; \
	DuiLib::CDuiString GetSkinFile ()   {return L#_xml;};   

#define DECLARE_DUI_ZIP(_dir,_xml,_zip) \
    public:								   \
	DuiLib::CDuiString GetSkinFolder () {return L#_dir;}; \
	DuiLib::CDuiString GetSkinFile ()   {return L#_xml;};  \
	DuiLib::CDuiString GetZIPFileName () const{return L#_zip;};	 \
    UILIB_RESOURCETYPE GetResourceType() const{return UILIB_FILE;};


#define DECLARE_DUI_SKIN(_dir,_xml,_zip) \
    public:								   \
	DuiLib::CDuiString GetSkinFolder () {return _dir;}; \
	DuiLib::CDuiString GetSkinFile ()   {return L#_xml;};  \
	DuiLib::CDuiString GetZIPFileName () const{return L#_zip;};	 \
    UILIB_RESOURCETYPE GetResourceType() const{return UILIB_FILE;};

//#ifdef  _DEBUG
//#define DELCARE_DUI_RES	  DECLARE_DUI_FILE
//#else
//#define DECLARE_DUI_RES   DECLARE_DUI_ZIP
//#endif

	//----------------------------end---------------------------------;


		DUI_DECLARE_MESSAGE_MAP()
		virtual void OnClick(TNotifyUI& msg);

	protected:
		virtual CDuiString GetSkinFolder () = 0;
		virtual CDuiString GetSkinFile () = 0;

		//virtual LPCTSTR GetWindowClassName(void) const = 0;
		virtual LPCTSTR GetWindowClassName () const;  


		virtual LRESULT ResponseDefaultKeyEvent(WPARAM wParam);

		CPaintManagerUI m_PaintManager;
		static LPBYTE m_lpResourceZIPBuffer;

	public:
		virtual UINT GetClassStyle() const;
		virtual UILIB_RESOURCETYPE GetResourceType() const;
		virtual CDuiString GetZIPFileName() const;
		virtual LPCTSTR GetResourceID() const;
		virtual CControlUI* CreateControl(LPCTSTR pstrClass);
		virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/);
		virtual LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);

#if defined(WIN32) && !defined(UNDER_CE)
		virtual LRESULT OnNcActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnNcPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
		virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnMouseWheel(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
#endif
		virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
		virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
		virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
		virtual LONG GetStyle();
	};
}

#endif // WIN_IMPL_BASE_HPP