https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7898297c532f5a9846a3a4378b0b4df41a108230

commit 7898297c532f5a9846a3a4378b0b4df41a108230
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Mon Jan 8 12:52:37 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Mon Jan 8 12:52:37 2024 +0900

    [SDK] cicuif.h: Add CUIFShadow (#6316)
    
    Supporting TIPs...
    JIRA issue: CORE-19360
    - Half-implement CUIFShadow class.
---
 sdk/include/reactos/cicero/cicuif.h | 157 +++++++++++++++++++++++++++++++++++-
 1 file changed, 155 insertions(+), 2 deletions(-)

diff --git a/sdk/include/reactos/cicero/cicuif.h 
b/sdk/include/reactos/cicero/cicuif.h
index 9a6e1fe6b6a..6e41ff1ca8e 100644
--- a/sdk/include/reactos/cicero/cicuif.h
+++ b/sdk/include/reactos/cicero/cicuif.h
@@ -397,8 +397,9 @@ protected:
     CUIFToolTip *m_pToolTip;
     CUIFShadow *m_pShadow;
     BOOL m_bShowShadow;
-    DWORD m_dwUnknown10;
+    CUIFWindow *m_pShadowOwner;
     friend class CUIFObject;
+    friend class CUIFShadow;
 
 public:
     CUIFWindow(HINSTANCE hInst, DWORD style);
@@ -472,7 +473,28 @@ class CUIFToolTip : public CUIFWindow
 
 class CUIFShadow : public CUIFWindow
 {
-    //FIXME
+protected:
+    COLORREF m_rgbShadowColor;
+    DWORD m_dwUnknown11[2];
+    INT m_xShadowDelta;
+    INT m_yShadowDelta;
+    BOOL m_bLayerAvailable;
+
+public:
+    CUIFShadow(HINSTANCE hInst, DWORD style, CUIFWindow *pShadowOwner);
+    ~CUIFShadow() override;
+
+    void InitSettings();
+    void InitShadow();
+    void AdjustWindowPos();
+    void OnOwnerWndMoved(BOOL bDoSize);
+
+    STDMETHOD_(void, Initialize)() override;
+    STDMETHOD_(DWORD, GetWndStyleEx)() override;
+    STDMETHOD_(void, OnPaint)(HDC hDC) override;
+    STDMETHOD_(LRESULT, OnWindowPosChanging)(HWND hWnd, UINT Msg, WPARAM 
wParam, LPARAM lParam) override;
+    STDMETHOD_(LRESULT, OnSettingChange)(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam) override;
+    STDMETHOD_(void, Show)(BOOL bVisible) override;
 };
 
 /////////////////////////////////////////////////////////////////////////////
@@ -2268,3 +2290,134 @@ inline STDMETHODIMP_(void)
 CUIFWindow::OnAnimationStart()
 {
 }
+
+/////////////////////////////////////////////////////////////////////////////
+
+/// @unimplemented
+inline CUIFShadow::CUIFShadow(HINSTANCE hInst, DWORD style, CUIFWindow 
*pShadowOwner)
+    : CUIFWindow(hInst, (style | UIF_STYLE_TOOLWINDOW))
+{
+    m_pShadowOwner = pShadowOwner;
+    m_rgbShadowColor = RGB(0, 0, 0);
+    m_dwUnknown11[0] = 0;
+    m_dwUnknown11[1] = 0;
+    m_xShadowDelta = m_yShadowDelta = 0;
+    m_bLayerAvailable = FALSE;
+}
+
+inline CUIFShadow::~CUIFShadow()
+{
+    if (m_pShadowOwner)
+        m_pShadowOwner->m_pShadow = NULL;
+}
+
+/// @unimplemented
+inline void CUIFShadow::InitSettings()
+{
+    m_bLayerAvailable = FALSE;
+    m_rgbShadowColor = RGB(128, 128, 128);
+    m_xShadowDelta = m_yShadowDelta = 2;
+}
+
+/// @unimplemented
+inline void CUIFShadow::InitShadow()
+{
+    if (m_bLayerAvailable)
+    {
+        //FIXME
+    }
+}
+
+inline void CUIFShadow::AdjustWindowPos()
+{
+    HWND hwndOwner = m_pShadowOwner->m_hWnd;
+    if (!::IsWindow(m_hWnd))
+        return;
+
+    RECT rc;
+    ::GetWindowRect(hwndOwner, &rc);
+    ::SetWindowPos(m_hWnd, hwndOwner,
+                   rc.left + m_xShadowDelta,
+                   rc.top + m_yShadowDelta,
+                   rc.right - rc.left,
+                   rc.bottom - rc.top,
+                   SWP_NOOWNERZORDER | SWP_NOACTIVATE);
+}
+
+inline void CUIFShadow::OnOwnerWndMoved(BOOL bDoSize)
+{
+    if (::IsWindow(m_hWnd) && ::IsWindowVisible(m_hWnd))
+    {
+        AdjustWindowPos();
+        if (bDoSize)
+            InitShadow();
+    }
+}
+
+inline STDMETHODIMP_(void)
+CUIFShadow::Initialize()
+{
+    InitSettings();
+    CUIFWindow::Initialize();
+}
+
+inline STDMETHODIMP_(DWORD)
+CUIFShadow::GetWndStyleEx()
+{
+    DWORD exstyle = CUIFWindow::GetWndStyleEx();
+    if (m_bLayerAvailable)
+        exstyle |= WS_EX_LAYERED;
+    return exstyle;
+}
+
+inline STDMETHODIMP_(void)
+CUIFShadow::OnPaint(HDC hDC)
+{
+    RECT rc = m_rc;
+    HBRUSH hBrush = ::CreateSolidBrush(m_rgbShadowColor);
+    ::FillRect(hDC, &rc, hBrush);
+    ::DeleteObject(hBrush);
+}
+
+inline STDMETHODIMP_(LRESULT)
+CUIFShadow::OnWindowPosChanging(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 
lParam)
+{
+    WINDOWPOS *wp = (WINDOWPOS *)lParam;
+    wp->hwndInsertAfter = m_pShadowOwner->m_hWnd;
+    return ::DefWindowProc(hWnd, Msg, wParam, lParam);
+}
+
+inline STDMETHODIMP_(LRESULT)
+CUIFShadow::OnSettingChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    InitSettings();
+
+    DWORD exstyle;
+    if (m_bLayerAvailable)
+        exstyle = ::GetWindowLongPtr(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
+    else
+        exstyle = ::GetWindowLongPtr(m_hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED;
+
+    ::SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exstyle);
+
+    AdjustWindowPos();
+    InitShadow();
+
+    return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
+}
+
+inline STDMETHODIMP_(void)
+CUIFShadow::Show(BOOL bVisible)
+{
+    if (bVisible && ::IsWindow(m_hWnd) && !::IsWindowVisible(m_hWnd))
+    {
+        AdjustWindowPos();
+        InitShadow();
+    }
+
+    if (::IsWindow(m_hWnd))
+    {
+        m_bVisible = bVisible;
+        ::ShowWindow(m_hWnd, (bVisible ? SW_SHOWNOACTIVATE : SW_HIDE));
+    }
+}

Reply via email to