| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #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);
- // 诊断日志出口已**统一到 `DuiLibDiag`**(Utils/UIDiag.h)。
- // 此处原先声明的 `namespace TouchTrace { void Log(LPCTSTR, ...); }` 已删除
- // —— UIManager.cpp 里的那份本地实现没了,声明留着只会让漏改的调用点
- // 变成"能编译但链接失败",反而不如让它直接在编译期报错。
- /////////////////////////////////////////////////////////////////////////////////////
- //
- 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);
- // ---------------------------------------------------------------------------
- // [透传根治 · 全局代数] 跨模态边界的提升鼠标消息作废机制。
- //
- // 背景:一次触摸会被系统提升出一对原生鼠标消息(DOWN+UP,extra 带
- // MOUSEEVENTF_FROMTOUCH)。其中一条可能在 ShowModal() 的嵌套循环里被
- // 阻塞,等循环退出、模态归零之后才被投递 ⇒ 它带着"上一次手势"的身份
- // 干了"这一次交互"的活 = 透传。
- //
- // 为什么是**全局函数**而不是 CPaintManagerUI 的成员:
- // 弹框(如 CDiandanNatureWnd)与主窗口是**两个不同的 manager**,
- // 而泄漏是线程消息队列现象 —— 在弹框 manager 上记录,主窗口看不见。
- // 详见 UIManager.cpp 里 s_nPromotedMouseGeneration 处的长注释。
- // ---------------------------------------------------------------------------
- // ShowModal() 在进入 DialogBoxIndirectParam 之前调用,把代数 +1。
- // 此后"水位落后于当前代数"的提升鼠标消息一律作废。
- void BumpPromotedMouseGenerationGlobal();
- // 当前代数(仅日志/诊断用)。
- UINT PeekPromotedMouseGeneration();
- } // namespace DuiLib
- #endif // __UIBASE_H__
|