#ifndef __UIBASE_H__ #define __UIBASE_H__ #pragma once namespace DuiLib { ///////////////////////////////////////////////////////////////////////////////////// // #define UI_WNDSTYLE_CONTAINER (0) #define UI_WNDSTYLE_FRAME (WS_VISIBLE | WS_OVERLAPPEDWINDOW) #define UI_WNDSTYLE_CHILD (WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN) #define UI_WNDSTYLE_DIALOG (WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION | WS_DLGFRAME | WS_CLIPSIBLINGS | WS_CLIPCHILDREN) #define UI_WNDSTYLE_EX_FRAME (WS_EX_WINDOWEDGE) #define UI_WNDSTYLE_EX_DIALOG (WS_EX_TOOLWINDOW | WS_EX_DLGMODALFRAME) #define UI_CLASSSTYLE_CONTAINER (0) #define UI_CLASSSTYLE_FRAME (CS_VREDRAW | CS_HREDRAW) #define UI_CLASSSTYLE_CHILD (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS) #define UI_CLASSSTYLE_DIALOG (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS) ///////////////////////////////////////////////////////////////////////////////////// // #ifndef ASSERT #define ASSERT(expr) _ASSERTE(expr) #endif #ifdef _DEBUG #ifndef DUITRACE #define DUITRACE DUI__Trace #endif #define DUITRACEMSG DUI__TraceMsg #else #ifndef DUITRACE #define DUITRACE #endif #define DUITRACEMSG _T("") #endif void UILIB_API DUI__Trace(LPCTSTR pstrFormat, ...); LPCTSTR UILIB_API DUI__TraceMsg(UINT uMsg); ///////////////////////////////////////////////////////////////////////////////////// // class UILIB_API CNotifyPump { public: bool AddVirtualWnd(CDuiString strName,CNotifyPump* pObject); bool RemoveVirtualWnd(CDuiString strName); void NotifyPump(TNotifyUI& msg); bool LoopDispatch(TNotifyUI& msg); DUI_DECLARE_MESSAGE_MAP() private: CStdStringPtrMap m_VirtualWndMap; }; class UILIB_API CWindowWnd { public: CWindowWnd(); HWND GetHWND() const; operator HWND() const; void EnableUnicode(); bool RegisterWindowClass(); bool RegisterSuperclass(); HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, const RECT rc, HMENU hMenu = NULL); HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT, HMENU hMenu = NULL); HWND CreateDuiWindow(HWND hwndParent, LPCTSTR pstrWindowName,DWORD dwStyle =0, DWORD dwExStyle =0); HWND Subclass(HWND hWnd); void Unsubclass(); void ShowWindow(bool bShow = true, bool bTakeFocus = true); UINT ShowModal(); void ShowModalFake(); void Close(UINT nRet = IDOK); void CenterWindow(); // 居中,支持扩展屏幕 void SetIcon(UINT nRes); LRESULT SendMessage(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0L); LRESULT PostMessage(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0L); void ResizeClient(int cx = -1, int cy = -1); protected: virtual LPCTSTR GetWindowClassName() const = 0; virtual LPCTSTR GetSuperClassName() const; virtual UINT GetClassStyle() const; virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); virtual void OnFinalMessage(HWND hWnd); static LRESULT CALLBACK __WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK __ControlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // 真模态(DialogBox)用的对话框过程。见 UIBase.cpp 里 ShowModal 的大段说明。 // 参考 nim_duilib NativeWindow_Windows::__DialogProc。 static INT_PTR CALLBACK __DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // 对话框窗口的窗口过程:接管 GWLP_WNDPROC,把消息喂给 CWindowWnd::HandleMessage, // 从而既复用系统对话框的消息循环(模态/触摸投递语义),又保留 DuiLib 的自绘与路由。 static LRESULT CALLBACK __DialogWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); protected: HWND m_hWnd; WNDPROC m_OldWndProc; bool m_bSubclassed; bool m_bUnicode; bool m_bFakeModal; // ---- 真模态(DialogBox)状态 ---- bool m_bDoModal; // 当前正处在 DialogBoxIndirectParam 阻塞循环中 UINT m_nModalRet; // 模态返回值(EndDialog 时写入) // 对话框窗口的原始窗口过程(WM_INITDIALOG 时保存、WM_NCDESTROY 时还原) WNDPROC m_pfnOldDlgWndProc; // 目标几何:left/top = 目标窗口左上角(屏幕坐标),right/bottom = left/top + 目标**客户区**尺寸。 // 由 ShowModal 填写,__DialogProc 在 WM_INITDIALOG 里据此校正对话框的实际大小, // 保证迁移后客户区尺寸与原窗口逐像素一致(否则弹框会因边框换算而变大)。 RECT m_rcModalTarget; }; // --------------------------------------------------------------------------- // 真模态(DialogBox)辅助:按 paint window 句柄找到对应的 CPaintManagerUI。 // // 定义在 UIBase.cpp。用途:ShowModal 要把 manager 从旧 HWND 迁到对话框新 HWND 时先找到它; // 也是 CPaintManagerUI::IsModalBackdropWindow 判定"本句柄是否就是弹框自己的 manager 窗口" // 的依据(透传闸门的一条关键判据)。 // // 为什么必须在头文件里声明:它是 UIManager.cpp 要用的自由函数,此前只在 UIBase.cpp // 里定义、没有任何头文件声明 —— UIManager.cpp 引用它会报 C3861(找不到标识符)。 // --------------------------------------------------------------------------- DuiLib::CPaintManagerUI* FindManagerByPaintWindow(HWND hWnd); } // namespace DuiLib #endif // __UIBASE_H__