https://git.reactos.org/?p=reactos.git;a=commitdiff;h=469e7c6d4ee9123e03eee38e01aab054948fa016
commit 469e7c6d4ee9123e03eee38e01aab054948fa016 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Sun Jan 7 16:49:31 2024 +0900 Commit: GitHub <nore...@github.com> CommitDate: Sun Jan 7 16:49:31 2024 +0900 [SDK] cicuif.h: Add CUIFWindow (#6313) Supporting TIPs... JIRA issue: CORE-19360 - Strengthen CUIFObject. - Add CUIFWindow. --- sdk/include/reactos/cicero/cicuif.h | 1133 +++++++++++++++++++++++++++++++++-- 1 file changed, 1089 insertions(+), 44 deletions(-) diff --git a/sdk/include/reactos/cicero/cicuif.h b/sdk/include/reactos/cicero/cicuif.h index 6bc52280640..9a6e1fe6b6a 100644 --- a/sdk/include/reactos/cicero/cicuif.h +++ b/sdk/include/reactos/cicero/cicuif.h @@ -13,6 +13,8 @@ class CUIFSystemInfo; struct CUIFTheme; class CUIFObject; class CUIFWindow; + class CUIFToolTip; + class CUIFShadow; class CUIFObjectArray; class CUIFColorTable; class CUIFColorTableSys; @@ -176,6 +178,17 @@ public: ///////////////////////////////////////////////////////////////////////////// +// Flags for CUIFObject::m_style +enum +{ + UIF_STYLE_CHILD = 0x1, + UIF_STYLE_TOPMOST = 0x2, + UIF_STYLE_TOOLWINDOW = 0x4, + UIF_STYLE_TOOLTIP = 0x20, + UIF_STYLE_SHADOW = 0x40, + UIF_STYLE_RTL = 0x200, +}; + class CUIFObject : public CUIFTheme { protected: @@ -192,28 +205,37 @@ protected: BOOL m_bHasCustomFont; LPWSTR m_pszToolTip; DWORD m_dwUnknown4[2]; //FIXME: name and type + friend class CUIFWindow; public: CUIFObject(CUIFObject *pParent, DWORD dwUnknown3, LPRECT prc, DWORD style); virtual ~CUIFObject(); + void StartCapture(); + void EndCapture(); + BOOL IsCapture(); + BOOL IsRTL(); + LRESULT NotifyCommand(WPARAM wParam, LPARAM lParam); + CUIFObject* ObjectFromPoint(POINT pt); + void SetScheme(CUIFScheme *scheme); + STDMETHOD_(void, Initialize)(); - STDMETHOD_(void, OnPaint)(HWND hWnd); - STDMETHOD_(void, OnHideToolTip)() { } // FIXME: name - STDMETHOD_(void, OnLButtonDown)(POINT pt) { } - STDMETHOD_(void, OnMButtonDown)(POINT pt) { } - STDMETHOD_(void, OnRButtonDown)(POINT pt) { } - STDMETHOD_(void, OnLButtonUp)(POINT pt) { } - STDMETHOD_(void, OnMButtonUp)(POINT pt) { } - STDMETHOD_(void, OnRButtonUp)(POINT pt) { } - STDMETHOD_(void, OnMouseMove)(POINT pt) { } - STDMETHOD_(void, OnRButtonDblClk)(POINT pt) { } //FIXME: name - STDMETHOD_(void, OnRButtonUp2)(POINT pt) { } //FIXME: name - STDMETHOD_(void, OnUnknown)(DWORD x1, DWORD x2, DWORD x3); //FIXME: name and type + STDMETHOD_(void, OnPaint)(HDC hDC); + STDMETHOD_(void, OnUnknnown9)() { } // FIXME: name + STDMETHOD_(void, OnLButtonDown)(LONG x, LONG y) { } + STDMETHOD_(void, OnMButtonDown)(LONG x, LONG y) { } + STDMETHOD_(void, OnRButtonDown)(LONG x, LONG y) { } + STDMETHOD_(void, OnLButtonUp)(LONG x, LONG y) { } + STDMETHOD_(void, OnMButtonUp)(LONG x, LONG y) { } + STDMETHOD_(void, OnRButtonUp)(LONG x, LONG y) { } + STDMETHOD_(void, OnMouseMove)(LONG x, LONG y) { } + STDMETHOD_(void, OnPoint)(LONG x, LONG y) { } + STDMETHOD_(void, OnUnPoint)(LONG x, LONG y) { } + STDMETHOD_(BOOL, OnSetCursor)(UINT uMsg, LONG x, LONG y); STDMETHOD_(void, GetRect)(LPRECT prc); STDMETHOD_(void, SetRect)(LPCRECT prc); STDMETHOD_(BOOL, PtInObject)(POINT pt); - STDMETHOD_(void, PaintObject)(HWND hWnd, LPCRECT prc); + STDMETHOD_(void, PaintObject)(HDC hDC, LPCRECT prc); STDMETHOD_(void, CallOnPaint)(); STDMETHOD_(void, Enable)(BOOL bEnable); STDMETHOD_(void, Show)(BOOL bVisible); @@ -226,11 +248,11 @@ public: STDMETHOD_(void, SetToolTip)(LPCWSTR pszToolTip); STDMETHOD_(LPCWSTR, GetToolTip)(); STDMETHOD_(LRESULT, OnShowToolTip)(); - STDMETHOD_(void, OnHideToolTip2)() { } // FIXME: name + STDMETHOD_(void, OnHideToolTip)() { } STDMETHOD_(void, DetachWndObj)(); STDMETHOD_(void, ClearWndObj)(); - STDMETHOD_(LRESULT, OnPaintTheme)(HWND hWnd); - STDMETHOD_(void, OnSetFocus)(HWND hWnd); + STDMETHOD_(LRESULT, OnPaintTheme)(HDC hDC); + STDMETHOD_(void, DoPaint)(HDC hDC); STDMETHOD_(void, ClearTheme)(); }; @@ -344,6 +366,8 @@ class CUIFScheme public: static CUIFColorTableSys *s_pColorTableSys; static CUIFColorTableOff10 *s_pColorTableOff10; + + CUIFScheme(DWORD type); }; DECLSPEC_SELECTANY CUIFColorTableSys *CUIFScheme::s_pColorTableSys = NULL; @@ -352,10 +376,101 @@ DECLSPEC_SELECTANY CUIFColorTableOff10 *CUIFScheme::s_pColorTableOff10 = NULL; void cicInitUIFScheme(void); void cicUpdateUIFScheme(void); void cicDoneUIFScheme(void); +CUIFScheme *cicCreateUIFScheme(DWORD type); ///////////////////////////////////////////////////////////////////////////// class CUIFWindow : public CUIFObject +{ +protected: + INT m_nLeft; + INT m_nTop; + INT m_nHeight; + INT m_nWidth; + HINSTANCE m_hInst; + HWND m_hWnd; + CUIFWindow *m_pUnknown7; + CUIFObject *m_pCaptured; + CUIFObject *m_pPointed; + DWORD m_dwUnknown8; + DWORD m_dwUnknown9; + CUIFToolTip *m_pToolTip; + CUIFShadow *m_pShadow; + BOOL m_bShowShadow; + DWORD m_dwUnknown10; + friend class CUIFObject; + +public: + CUIFWindow(HINSTANCE hInst, DWORD style); + ~CUIFWindow() override; + + static CUIFWindow* GetThis(HWND hWnd); + static void SetThis(HWND hWnd, LONG_PTR dwNewLong); + + STDMETHOD_(void, Initialize)() override; + STDMETHOD_(void, Show)(BOOL bVisible) override; + STDMETHOD_(void, SetRect)(LPCRECT prc) override; + STDMETHOD_(void, PaintObject)(HDC hDC, LPCRECT prc) override; + STDMETHOD_(void, RemoveUIObj)(CUIFObject *pRemove) override; + + void SetCaptureObject(CUIFObject *pCaptured); + void SetObjectPointed(CUIFObject *pPointed, POINT pt); + void CreateScheme(); + BOOL GetWorkArea(LPCRECT prcWnd, LPRECT prcWorkArea); + void AdjustWindowPosition(); + + static LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + STDMETHOD_(LPCTSTR, GetClassName)(); + STDMETHOD_(LPCTSTR, GetWndText)(); + STDMETHOD_(DWORD, GetWndStyle)(); + STDMETHOD_(DWORD, GetWndStyleEx)(); + STDMETHOD_(HWND, CreateWnd)(HWND hwndParent); + STDMETHOD_(void, Move)(INT x, INT y, INT nWidth, INT nHeight); + STDMETHOD_(BOOL, AnimateWnd)(DWORD dwTime, DWORD dwFlags); + STDMETHOD_(void, OnObjectMoved)(CUIFObject *pObject); + STDMETHOD_(void, OnLButtonDown2)(LONG x, LONG y); + STDMETHOD_(void, OnCreate)(HWND hWnd); + STDMETHOD_(void, OnDestroy)(HWND hWnd); + STDMETHOD_(void, OnNCDestroy)(HWND hWnd); + STDMETHOD_(void, OnSetFocus)(HWND hWnd); + STDMETHOD_(void, OnKillFocus)(HWND hWnd); + STDMETHOD_(void, OnNotify)(HWND hWnd, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, OnTimer)(WPARAM wParam); + STDMETHOD_(void, OnSysColorChange)(); + STDMETHOD_(void, OnEndSession)(HWND hWnd, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, OnKeyDown)(HWND hWnd, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, OnKeyUp)(HWND, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, OnUser)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnActivate)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnWindowPosChanged)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnWindowPosChanging)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnNotifyFormat)(HWND hWnd, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnShowWindow)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnSettingChange)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnDisplayChange)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, OnGetObject)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(LRESULT, WindowProc)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(BOOL, OnEraseBkGnd)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, OnThemeChanged)(HWND hWnd, WPARAM wParam, LPARAM lParam); + STDMETHOD_(void, UpdateUI)(LPCRECT prc); + STDMETHOD_(void, SetCapture)(int); + STDMETHOD_(void, OnSetCapture)(HWND hWnd, UINT, LONG); + STDMETHOD_(void, OnAnimationStart)(); + STDMETHOD_(void, OnAnimationEnd)(); + STDMETHOD_(void, HandleMouseMsg)(UINT uMsg, LONG x, LONG y); + STDMETHOD_(void, ClientRectToWindowRect)(LPRECT pRect); + STDMETHOD_(void, GetWindowFrameSize)(LPSIZE pSize); +}; + +///////////////////////////////////////////////////////////////////////////// + +class CUIFToolTip : public CUIFWindow +{ + //FIXME +}; + +class CUIFShadow : public CUIFWindow { //FIXME }; @@ -579,6 +694,7 @@ CUIFTheme::GetThemeSysSize(int iSizeId) return s_fnGetThemeSysSize(m_hTheme, iSizeId); } +/// @unimplemented inline STDMETHODIMP_(void) CUIFTheme::SetActiveTheme(LPCWSTR pszClassList, INT iPartId, DWORD dwUnknown2) { @@ -622,8 +738,8 @@ CUIFObject::CUIFObject(CUIFObject *pParent, DWORD dwUnknown3, LPRECT prc, DWORD m_pszToolTip = NULL; - m_dwUnknown4[0] = -1; //FIXME - m_dwUnknown4[1] = -1; //FIXME + m_dwUnknown4[0] = -1; //FIXME: name + m_dwUnknown4[1] = -1; //FIXME: name } /// @unimplemented @@ -661,14 +777,15 @@ inline STDMETHODIMP_(void) CUIFObject::Initialize() { } -inline STDMETHODIMP_(void) CUIFObject::OnPaint(HWND hWnd) +inline STDMETHODIMP_(void) CUIFObject::OnPaint(HDC hDC) { - if (!(m_pWindow->m_style & 0x80000000) || !OnPaintTheme(hWnd)) - OnSetFocus(hWnd); + if (!(m_pWindow->m_style & 0x80000000) || !OnPaintTheme(hDC)) + DoPaint(hDC); } -inline STDMETHODIMP_(void) CUIFObject::OnUnknown(DWORD x1, DWORD x2, DWORD x3) +inline STDMETHODIMP_(BOOL) CUIFObject::OnSetCursor(UINT uMsg, LONG x, LONG y) { + return FALSE; } inline STDMETHODIMP_(void) CUIFObject::GetRect(LPRECT prc) @@ -676,20 +793,12 @@ inline STDMETHODIMP_(void) CUIFObject::GetRect(LPRECT prc) *prc = m_rc; } -/// @unimplemented -inline STDMETHODIMP_(void) CUIFObject::SetRect(LPCRECT prc) -{ - m_rc = *prc; - // FIXME - CallOnPaint(); -} - inline STDMETHODIMP_(BOOL) CUIFObject::PtInObject(POINT pt) { return m_bVisible && ::PtInRect(&m_rc, pt); } -inline STDMETHODIMP_(void) CUIFObject::PaintObject(HWND hWnd, LPCRECT prc) +inline STDMETHODIMP_(void) CUIFObject::PaintObject(HDC hDC, LPCRECT prc) { if (!m_bVisible) return; @@ -697,21 +806,21 @@ inline STDMETHODIMP_(void) CUIFObject::PaintObject(HWND hWnd, LPCRECT prc) if (!prc) prc = &m_rc; - OnPaint(hWnd); + OnPaint(hDC); for (size_t iItem = 0; iItem < m_ObjectArray.size(); ++iItem) { CUIFObject *pObject = m_ObjectArray[iItem]; RECT rc; if (::IntersectRect(&rc, prc, &pObject->m_rc)) - pObject->PaintObject(hWnd, &rc); + pObject->PaintObject(hDC, &rc); } } -/// @unimplemented inline STDMETHODIMP_(void) CUIFObject::CallOnPaint() { - //FIXME + if (m_pWindow) + m_pWindow->UpdateUI(&m_rc); } inline STDMETHODIMP_(void) CUIFObject::Enable(BOOL bEnable) @@ -808,13 +917,6 @@ inline STDMETHODIMP_(LRESULT) CUIFObject::OnShowToolTip() return 0; } -/// @unimplemented -inline STDMETHODIMP_(void) CUIFObject::DetachWndObj() -{ - //FIXME - m_pWindow = NULL; -} - inline STDMETHODIMP_(void) CUIFObject::ClearWndObj() { m_pWindow = NULL; @@ -822,12 +924,12 @@ inline STDMETHODIMP_(void) CUIFObject::ClearWndObj() m_ObjectArray[iItem]->ClearWndObj(); } -inline STDMETHODIMP_(LRESULT) CUIFObject::OnPaintTheme(HWND hWnd) +inline STDMETHODIMP_(LRESULT) CUIFObject::OnPaintTheme(HDC hDC) { return 0; } -inline STDMETHODIMP_(void) CUIFObject::OnSetFocus(HWND hWnd) +inline STDMETHODIMP_(void) CUIFObject::DoPaint(HDC hDC) { } @@ -838,6 +940,84 @@ inline STDMETHODIMP_(void) CUIFObject::ClearTheme() m_ObjectArray[iItem]->ClearTheme(); } +inline void CUIFObject::StartCapture() +{ + if (m_pWindow) + m_pWindow->SetCaptureObject(this); +} + +inline void CUIFObject::EndCapture() +{ + if (m_pWindow) + m_pWindow->SetCaptureObject(NULL); +} + +inline BOOL CUIFObject::IsCapture() +{ + return m_pWindow && (m_pWindow->m_pCaptured == this); +} + +inline void CUIFObject::SetRect(LPCRECT prc) +{ + m_rc = *prc; + if (m_pWindow) + m_pWindow->OnObjectMoved(this); + CallOnPaint(); +} + +inline LRESULT CUIFObject::NotifyCommand(WPARAM wParam, LPARAM lParam) +{ + if (m_pParent) + return m_pParent->OnObjectNotify(this, wParam, lParam); + return 0; +} + +/// @unimplemented +inline void CUIFObject::DetachWndObj() +{ + if (m_pWindow) + { + CUIFToolTip *pToolTip = m_pWindow->m_pToolTip; + if (pToolTip) + { + //FIXME + } + m_pWindow->RemoveUIObj(this); + m_pWindow = NULL; + } +} + +inline BOOL CUIFObject::IsRTL() +{ + if (!m_pWindow) + return FALSE; + return !!(m_pWindow->m_style & UIF_STYLE_RTL); +} + +inline CUIFObject* CUIFObject::ObjectFromPoint(POINT pt) +{ + if (!PtInObject(pt)) + return NULL; + + CUIFObject *pFound = this; + for (size_t i = 0; i < m_ObjectArray.size(); ++i) + { + CUIFObject *pObject = m_ObjectArray[i]->ObjectFromPoint(pt); + if (pObject) + pFound = pObject; + } + return pFound; +} + +inline void CUIFObject::SetScheme(CUIFScheme *scheme) +{ + m_pScheme = scheme; + for (size_t i = 0; i < m_ObjectArray.size(); ++i) + { + m_ObjectArray[i]->SetScheme(scheme); + } +} + ///////////////////////////////////////////////////////////////////////////// inline STDMETHODIMP_(void) CUIFColorTableSys::InitColor() @@ -988,6 +1168,17 @@ inline void cicDoneUIFScheme(void) } } +/// @unimplemented +inline CUIFScheme *cicCreateUIFScheme(DWORD type) +{ + return new(cicNoThrow) CUIFScheme(type); +} + +/// @unimplemented +inline CUIFScheme::CUIFScheme(DWORD type) +{ +} + ///////////////////////////////////////////////////////////////////////////// inline CUIFBitmapDC::CUIFBitmapDC(BOOL bMemory) @@ -1223,3 +1414,857 @@ cicCreateShadowMaskBmp(LPRECT prc, HBITMAP hbm1, HBITMAP hbm2, HBRUSH hbr1, HBRU CUIFBitmapDC::s_phdcDst->Uninit(TRUE); return CUIFBitmapDC::s_phdcDst->DetachBitmap(); } + +///////////////////////////////////////////////////////////////////////////// + +inline CUIFWindow::CUIFWindow(HINSTANCE hInst, DWORD style) + : CUIFObject(NULL, 0, NULL, style) +{ + m_hInst = hInst; + m_nLeft = 200; + m_nTop = 200; + m_nWidth = 200; + m_nHeight = 200; + m_hWnd = 0; + m_pWindow = this; + m_pCaptured = NULL; + m_pUnknown7 = NULL; + m_pPointed = NULL; + m_dwUnknown8 = 0; + m_pToolTip = NULL; + m_pShadow = NULL; + m_bShowShadow = TRUE; + m_dwUnknown9 = 0; + CUIFWindow::CreateScheme(); +} + +inline CUIFWindow::~CUIFWindow() +{ + if (m_pToolTip) + { + delete m_pToolTip; + m_pToolTip = NULL; + } + if (m_pShadow) + { + delete m_pShadow; + m_pShadow = NULL; + } + for (size_t i = m_ObjectArray.size(); i > 0; ) + { + --i; + CUIFObject *pObject = m_ObjectArray[i]; + m_ObjectArray[i] = NULL; + m_ObjectArray.Remove(pObject); + delete pObject; + } + if (m_pScheme) + { + delete m_pScheme; + m_pScheme = NULL; + } +} + +/// @unimplemented +inline STDMETHODIMP_(void) +CUIFWindow::Initialize() +{ + LPCTSTR pszClass = GetClassName(); + + WNDCLASSEX wcx; + ZeroMemory(&wcx, sizeof(wcx)); + wcx.cbSize = sizeof(WNDCLASSEXW); + if (!::GetClassInfoEx(m_hInst, pszClass, &wcx)) + { + ZeroMemory(&wcx, sizeof(wcx)); + wcx.cbSize = sizeof(wcx); + wcx.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wcx.lpfnWndProc = CUIFWindow::WindowProcedure; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = sizeof(LONG_PTR) * 2; + wcx.hInstance = m_hInst; + wcx.hIcon = NULL; + wcx.hCursor = ::LoadCursor(NULL, IDC_ARROW); + wcx.lpszClassName = pszClass; + wcx.hbrBackground = NULL; + wcx.lpszMenuName = NULL; + wcx.hIconSm = NULL; + ::RegisterClassEx(&wcx); + } + + cicUpdateUIFSys(); + cicUpdateUIFScheme(); + + if (m_style & UIF_STYLE_TOOLTIP) + { + //FIXME: Create m_pToolTip + } + if (m_style & UIF_STYLE_SHADOW) + { + //FIXME: Create m_pShadow + } + + return CUIFObject::Initialize(); +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnUser(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnSettingChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +inline void CUIFWindow::UpdateUI(LPCRECT prc) +{ + if (::IsWindow(m_hWnd)) + ::InvalidateRect(m_hWnd, prc, FALSE); +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnCreate(HWND hWnd) +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnDestroy(HWND hWnd) +{ + +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnNCDestroy(HWND hWnd) +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnKeyUp(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ +} + +inline CUIFWindow* +CUIFWindow::GetThis(HWND hWnd) +{ + return (CUIFWindow *)GetWindowLongPtr(hWnd, GWLP_USERDATA); +} + +inline void +CUIFWindow::SetThis(HWND hWnd, LONG_PTR dwNewLong) +{ + ::SetWindowLongPtr(hWnd, GWLP_USERDATA, dwNewLong); +} + +inline void CUIFWindow::CreateScheme() +{ + if (m_pScheme) + { + delete m_pScheme; + m_pScheme = NULL; + } + + INT iScheme = 0; + if (m_style & 0x10000000) + iScheme = 1; + else if (m_style & 0x20000000) + iScheme = 2; + else if (m_style & 0x40000000) + iScheme = 3; + else + iScheme = 0; + + m_pScheme = cicCreateUIFScheme(iScheme); + SetScheme(m_pScheme); +} + +inline LPCTSTR CUIFWindow::GetClassName() +{ + return TEXT("CiceroUIWndFrame"); +} + +inline LPCTSTR CUIFWindow::GetWndText() +{ + return TEXT("CiceroUIWndFrame"); +} + +inline STDMETHODIMP_(DWORD) +CUIFWindow::GetWndStyle() +{ + DWORD ret; + + if (m_style & UIF_STYLE_CHILD) + ret = WS_CHILD | WS_CLIPSIBLINGS; + else + ret = WS_POPUP | WS_DISABLED; + + if (m_style & 0x10000000) + ret |= WS_BORDER; + else if (m_style & 8) + ret |= WS_DLGFRAME; + else if ((m_style & 0x20000000) || (m_style & 0x10)) + ret |= WS_BORDER; + + return ret; +} + +inline STDMETHODIMP_(DWORD) +CUIFWindow::GetWndStyleEx() +{ + DWORD ret = 0; + if (m_style & UIF_STYLE_TOPMOST) + ret = WS_EX_TOPMOST; + if (m_style & UIF_STYLE_TOOLWINDOW) + ret |= WS_EX_TOOLWINDOW; + if (m_style & UIF_STYLE_RTL) + ret |= WS_EX_LAYOUTRTL; + return ret; +} + +inline STDMETHODIMP_(HWND) +CUIFWindow::CreateWnd(HWND hwndParent) +{ + DWORD style = GetWndStyle(); + LPCTSTR text = GetWndText(); + LPCTSTR clsName = GetClassName(); + DWORD exstyle = GetWndStyleEx(); + HWND hWnd = CreateWindowEx(exstyle, + clsName, + text, + style, + m_nLeft, + m_nTop, + m_nWidth, + m_nHeight, + hwndParent, + NULL, + m_hInst, + this); + if (m_pToolTip) + m_pToolTip->CreateWnd(hWnd); + if (m_pShadow) + m_pShadow->CreateWnd(hWnd); + return hWnd; +} + +inline void CUIFWindow::Show(BOOL bVisible) +{ + if (!IsWindow(m_hWnd)) + return; + + if (bVisible && (m_style & 2)) + ::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); + + m_bVisible = bVisible; + ::ShowWindow(m_hWnd, (bVisible ? SW_SHOWNOACTIVATE : 0)); +} + +inline STDMETHODIMP_(BOOL) +CUIFWindow::AnimateWnd(DWORD dwTime, DWORD dwFlags) +{ + if (!::IsWindow(m_hWnd)) + return FALSE; + + BOOL bVisible = !(dwFlags & 0x10000); + OnAnimationStart(); + BOOL ret = ::AnimateWindow(m_hWnd, dwTime, dwFlags); + if (!ret) + m_bVisible = bVisible; + OnAnimationEnd(); + return ret; +} + +inline void CUIFWindow::SetCaptureObject(CUIFObject *pCaptured) +{ + if (pCaptured) + { + m_pCaptured = pCaptured; + SetCapture(TRUE); + } + else + { + m_pCaptured = NULL; + SetCapture(FALSE); + } +} + +inline STDMETHODIMP_(void) +CUIFWindow::SetCapture(BOOL bSet) +{ + if (bSet) + ::SetCapture(m_hWnd); + else + ::ReleaseCapture(); +} + +inline void CUIFWindow::SetObjectPointed(CUIFObject *pPointed, POINT pt) +{ + if (pPointed == m_pPointed) + return; + + if (m_pCaptured) + { + if (m_pCaptured == m_pPointed) + { + if (m_pPointed->m_bEnable) + m_pPointed->OnUnPoint(pt.x, pt.y); + } + } + else if (m_pPointed) + { + if (m_pPointed->m_bEnable) + m_pPointed->OnUnPoint(pt.x, pt.y); + } + + m_pPointed = pPointed; + + if (m_pCaptured) + { + if (m_pCaptured == m_pPointed) + { + if (m_pPointed->m_bEnable) + m_pPointed->OnPoint(pt.x, pt.y); + } + } + else if (!m_pPointed) + { + if (m_pPointed->m_bEnable) + m_pPointed->OnPoint(pt.x, pt.y); + } +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnObjectMoved(CUIFObject *pObject) +{ + if (!::IsWindow(m_hWnd)) + return; + + POINT pt; + ::GetCursorPos(&pt); + ::ScreenToClient(m_hWnd, &pt); + POINT pt2 = pt; + CUIFObject *pFound = ObjectFromPoint(pt); + SetObjectPointed(pFound, pt2); +} + +inline STDMETHODIMP_(void) +CUIFWindow::SetRect(LPCRECT prc) +{ + RECT Rect; + ::SetRectEmpty(&Rect); + + if (::IsWindow(m_hWnd)) + ::GetClientRect(m_hWnd, &Rect); + + CUIFObject::SetRect(&Rect); +} + +inline STDMETHODIMP_(void) +CUIFWindow::ClientRectToWindowRect(LPRECT lpRect) +{ + DWORD style, exstyle; + if (::IsWindow(m_hWnd)) + { + style = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); + exstyle = ::GetWindowLongPtr(m_hWnd, GWL_EXSTYLE); + } + else + { + style = GetWndStyle(); + exstyle = GetWndStyleEx(); + } + ::AdjustWindowRectEx(lpRect, style, FALSE, exstyle); +} + +inline STDMETHODIMP_(void) +CUIFWindow::GetWindowFrameSize(LPSIZE pSize) +{ + RECT rc; + ::SetRectEmpty(&rc); + + ClientRectToWindowRect(&rc); + pSize->cx = (rc.right - rc.left) / 2; + pSize->cy = (rc.bottom - rc.top) / 2; +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnAnimationEnd() +{ + if (m_pShadow && m_bShowShadow) + m_pShadow->Show(m_bVisible); +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnThemeChanged(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + ClearTheme(); +} + +/// @unimplemented +inline LRESULT +CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_GETOBJECT: + return OnGetObject(hWnd, WM_GETOBJECT, wParam, lParam); + + case WM_SYSCOLORCHANGE: + cicUpdateUIFScheme(); + OnSysColorChange(); + return 0; + + case WM_ENDSESSION: + OnEndSession(hWnd, wParam, lParam); + return 0; + + case WM_SHOWWINDOW: + if (m_pShadow && m_bShowShadow) + m_pShadow->Show(wParam); + return OnShowWindow(hWnd, WM_SHOWWINDOW, wParam, lParam); + + case WM_SETTINGCHANGE: + cicUpdateUIFSys(); + cicUpdateUIFScheme(); + return OnSettingChange(hWnd, WM_SETTINGCHANGE, wParam, lParam); + case WM_SETCURSOR: + { + POINT Point; + ::GetCursorPos(&Point); + ::ScreenToClient(m_hWnd, &Point); + //FIXME + return 1; + } + case WM_MOUSEACTIVATE: + return MA_NOACTIVATE; + case WM_ERASEBKGND: + return OnEraseBkGnd(hWnd, WM_ERASEBKGND, wParam, lParam); + case WM_CREATE: + SetRect(NULL); + OnCreate(hWnd); + return 0; + case WM_DESTROY: + if (m_pToolTip && ::IsWindow(m_pToolTip->m_hWnd)) + ::DestroyWindow(m_pToolTip->m_hWnd); + if (m_pShadow && ::IsWindow(m_pShadow->m_hWnd)) + { + ::DestroyWindow(m_pShadow->m_hWnd); + } + OnDestroy(hWnd); + return 0; + case WM_SIZE: + SetRect(NULL); + return 0; + case WM_ACTIVATE: + return OnActivate(hWnd, WM_ACTIVATE, wParam, lParam); + case WM_SETFOCUS: + OnSetFocus(hWnd); + return 0; + case WM_KILLFOCUS: + OnKillFocus(hWnd); + return 0; + case WM_PAINT: + { + PAINTSTRUCT Paint; + HDC hDC = ::BeginPaint(hWnd, &Paint); + PaintObject(hDC, &Paint.rcPaint); + ::EndPaint(hWnd, &Paint); + return 0; + } + case WM_PRINTCLIENT: + { + PaintObject((HDC)wParam, NULL); + return 0; + } + case WM_THEMECHANGED: + { + OnThemeChanged(hWnd, wParam, lParam); + return 0; + } + case WM_COMMAND: + return 0; + case WM_TIMER: + //FIXME + return 0; + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_LBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + case WM_MBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONDBLCLK: + case WM_RBUTTONUP: + { + //FIXME + HandleMouseMsg(uMsg, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam)); + return 0; + } + case WM_KEYUP: + OnKeyUp(hWnd, wParam, lParam); + return 0; + case WM_WINDOWPOSCHANGING: + { + WINDOWPOS *pwp = (WINDOWPOS *)lParam; + if (m_pShadow && (pwp->flags & SWP_HIDEWINDOW)) + m_pShadow->Show(FALSE); + if (!(pwp->flags & SWP_NOZORDER) && pwp->hwndInsertAfter == m_pShadow->m_hWnd) + pwp->flags |= SWP_NOZORDER; + //m_pShadow->OnOwnerWndMoved(!(pwp->flags & SWP_NOSIZE)); //FIXME + return OnWindowPosChanging(hWnd, WM_WINDOWPOSCHANGING, wParam, lParam); + } + case WM_WINDOWPOSCHANGED: + { + //WINDOWPOS *pwp = (WINDOWPOS *)lParam; + //if (m_pShadow) //FIXME + // m_pShadow->OnOwnerWndMoved(!(pwp->flags & SWP_NOSIZE)); + return OnWindowPosChanged(hWnd, WM_WINDOWPOSCHANGED, wParam, lParam); + } + case WM_NOTIFY: + OnNotify(hWnd, wParam, lParam); + return 0; + case WM_NOTIFYFORMAT: + return OnNotifyFormat(hWnd, wParam, lParam); + case WM_DISPLAYCHANGE: + cicUpdateUIFSys(); + cicUpdateUIFScheme(); + return OnDisplayChange(hWnd, WM_DISPLAYCHANGE, wParam, lParam); + case WM_NCDESTROY: + OnNCDestroy(hWnd); + return 0; + case WM_KEYDOWN: + OnKeyDown(hWnd, wParam, lParam); + return 0; + default: + { + if (uMsg >= WM_USER) + { + CUIFWindow *pThis = CUIFWindow::GetThis(hWnd); + pThis->OnUser(hWnd, uMsg, wParam, lParam); + return 0; + } + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); + } + } + + return 0; +} + +inline LRESULT CALLBACK +CUIFWindow::WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CUIFWindow *This; + + if (uMsg == WM_NCCREATE) + { + This = (CUIFWindow*)((CREATESTRUCT*)lParam)->lpCreateParams; + CUIFWindow::SetThis(hWnd, (LONG_PTR)This); + This->m_hWnd = hWnd; + } + else + { + This = CUIFWindow::GetThis(hWnd); + } + + if (uMsg == WM_GETMINMAXINFO) + { + if (This) + return This->WindowProc(hWnd, uMsg, wParam, lParam); + else + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); + } + + if (!This) + return 0; + + if (uMsg == WM_NCDESTROY) + { + This->m_hWnd = NULL; + ::SetWindowLongPtr(hWnd, GWLP_USERDATA, 0); + } + + return This->WindowProc(hWnd, uMsg, wParam, lParam); +} + +inline BOOL +CUIFWindow::GetWorkArea(LPCRECT prcWnd, LPRECT prcWorkArea) +{ + if (!(m_style & 0x180)) + return 0; + + HMONITOR hMon = ::MonitorFromRect(prcWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi; + mi.cbSize = sizeof(MONITORINFO); + if (!hMon || !::GetMonitorInfo(hMon, &mi)) + { + if (m_style & 0x80) + return ::SystemParametersInfo(SPI_GETWORKAREA, 0, prcWorkArea, 0); + + if (m_style & 0x100) + { + prcWorkArea->top = 0; + prcWorkArea->left = 0; + prcWorkArea->right = ::GetSystemMetrics(SM_CXSCREEN); + prcWorkArea->bottom = ::GetSystemMetrics(SM_CYSCREEN); + return TRUE; + } + + return FALSE; + } + + if (m_style & 0x80) + { + *prcWorkArea = mi.rcWork; + return TRUE; + } + + if (m_style & 0x100) + { + *prcWorkArea = mi.rcMonitor; + return TRUE; + } + + return FALSE; +} + +/// @unimplemented +inline void +CUIFWindow::AdjustWindowPosition() +{ + //FIXME +} + +/// @unimplemented +inline STDMETHODIMP_(void) +CUIFWindow::PaintObject(HDC hDC, LPCRECT prc) +{ + BOOL bGotDC = FALSE; + if (!hDC) + { + hDC = ::GetDC(m_hWnd); + bGotDC = TRUE; + } + + LPCRECT pRect = prc; + if (!pRect) + pRect = &m_rc; + + HDC hMemDC = ::CreateCompatibleDC(hDC); + if (!hMemDC) + return; + + HBITMAP hbmMem = ::CreateCompatibleBitmap(hDC, + pRect->right - pRect->left, + pRect->bottom - pRect->top); + if (hbmMem) + { + HGDIOBJ hbmOld = ::SelectObject(hMemDC, hbmMem); + ::SetViewportOrgEx(hMemDC, -pRect->left, -pRect->top, NULL); + + if ((FAILED(CUIFTheme::EnsureThemeData(m_hWnd)) || + !(m_style & 1) || + FAILED(DrawThemeParentBackground(m_hWnd, hMemDC, &m_rc))) && + FAILED(DrawThemeBackground(hMemDC, m_dwUnknown2, &m_rc, 0))) + { + //if (m_pScheme) + // m_pScheme->FillRect(hMemDC, pRect, 22); //FIXME + } + CUIFObject::PaintObject(hMemDC, pRect); + ::BitBlt(hDC, + pRect->left, pRect->top, + pRect->right - pRect->left, pRect->bottom - pRect->top, + hMemDC, + pRect->left, pRect->top, + SRCCOPY); + ::SelectObject(hMemDC, hbmOld); + ::DeleteObject(hbmMem); + } + ::DeleteDC(hMemDC); + + if (bGotDC) + ::ReleaseDC(m_hWnd, hDC); +} + +inline STDMETHODIMP_(void) +CUIFWindow::Move(INT x, INT y, INT nWidth, INT nHeight) +{ + m_nLeft = x; + m_nTop = y; + if (nWidth >= 0) + m_nWidth = nWidth; + if (nHeight >= 0) + m_nHeight = nHeight; + if (::IsWindow(m_hWnd)) + { + AdjustWindowPosition(); + ::MoveWindow(m_hWnd, m_nLeft, m_nTop, m_nWidth, m_nHeight, TRUE); + } +} + +inline STDMETHODIMP_(void) +CUIFWindow::RemoveUIObj(CUIFObject *pRemove) +{ + if (pRemove == m_pCaptured) + SetCaptureObject(NULL); + if (pRemove == m_pUnknown7) + { + m_pUnknown7 = NULL; + ::KillTimer(m_hWnd, 0x5461); + } + if (pRemove == m_pPointed) + m_pPointed = NULL; + CUIFObject::RemoveUIObj(pRemove); +} + +inline STDMETHODIMP_(void) +CUIFWindow::HandleMouseMsg(UINT uMsg, LONG x, LONG y) +{ + POINT pt = { x, y }; + + CUIFObject *pFound = (CUIFWindow *)ObjectFromPoint(pt); + + SetObjectPointed(pFound, pt); + + if (m_pCaptured) + pFound = m_pCaptured; + + if (!pFound || OnSetCursor(uMsg, pt.x, pt.y)) + { + HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW); + ::SetCursor(hCursor); + } + + if (pFound && pFound->m_bEnable) + { + switch (uMsg) + { + case WM_MOUSEMOVE: + pFound->OnMouseMove(pt.x, pt.y); + break; + case WM_LBUTTONDOWN: + pFound->OnLButtonDown(pt.x, pt.y); + break; + case WM_LBUTTONUP: + pFound->OnLButtonUp(pt.x, pt.y); + break; + case WM_RBUTTONDOWN: + pFound->OnRButtonDown(pt.x, pt.y); + break; + case WM_RBUTTONUP: + pFound->OnRButtonUp(pt.x, pt.y); + break; + case WM_MBUTTONDOWN: + pFound->OnMButtonDown(pt.x, pt.y); + break; + case WM_MBUTTONUP: + pFound->OnMButtonUp(pt.x, pt.y); + break; + } + } +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnSetFocus(HWND hWnd) +{ +} + +/// @unimplemented +inline STDMETHODIMP_(void) +CUIFWindow::OnLButtonDown2(LONG x, LONG y) +{ + //FIXME +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnKillFocus(HWND hWnd) +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnNotify(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ +} + +/// @unimplemented +inline STDMETHODIMP_(void) +CUIFWindow::OnTimer(WPARAM wParam) +{ + //FIXME +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnSysColorChange() +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnEndSession(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnActivate(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnWindowPosChanged(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnWindowPosChanging(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnNotifyFormat(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnShowWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnDisplayChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(LRESULT) +CUIFWindow::OnGetObject(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +inline STDMETHODIMP_(BOOL) +CUIFWindow::OnEraseBkGnd(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return FALSE; +} + +/// @unimplemented +inline STDMETHODIMP_(void) +CUIFWindow::OnSetCapture(HWND hWnd, UINT, LONG) +{ +} + +inline STDMETHODIMP_(void) +CUIFWindow::OnAnimationStart() +{ +}