https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4287f07c757136b86a6847ff4b118b0f693e5b1f

commit 4287f07c757136b86a6847ff4b118b0f693e5b1f
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Thu Jan 11 22:09:19 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Jan 11 22:09:19 2024 +0900

    [SDK] cicuif.h: Add CUIFGripper (#6332)
    
    Supporting TIPs...
    JIRA issue: CORE-19360
    - Add CUIFGripper class.
---
 sdk/include/reactos/cicero/cicuif.h | 174 +++++++++++++++++++++++++++++++-----
 1 file changed, 151 insertions(+), 23 deletions(-)

diff --git a/sdk/include/reactos/cicero/cicuif.h 
b/sdk/include/reactos/cicero/cicuif.h
index 0beab5656d7..457fe782536 100644
--- a/sdk/include/reactos/cicero/cicuif.h
+++ b/sdk/include/reactos/cicero/cicuif.h
@@ -23,8 +23,9 @@ class CUIFTheme;
         class CUIFWindow;
             class CUIFToolTip;
             class CUIFShadow;
-        class CUIFButton;
-            class CUIFButton2;
+    class CUIFButton;
+        class CUIFButton2;
+    class CUIFGripper;
 class CUIFObjectArray;
 class CUIFColorTable;
     class CUIFColorTableSys;
@@ -465,8 +466,8 @@ public:
     STDMETHOD_(void, DrawFrameCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, 
DWORD dwDrawFlags, LPSIZE pSize) = 0;
     STDMETHOD_(void, DrawFrameCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, 
HBITMAP hbm2, DWORD dwDrawFlags) = 0;
     STDMETHOD_(void, DrawWndFrame)(HDC hDC, LPCRECT prc, DWORD type, DWORD 
unused1, DWORD unused2) = 0;
-    STDMETHOD_(void, DrawDragHandle)(HDC hDC, LPCRECT prc, BOOL bFlag) = 0;
-    STDMETHOD_(void, DrawSeparator)(HDC hDC, LPCRECT prc, BOOL bFlag) = 0;
+    STDMETHOD_(void, DrawDragHandle)(HDC hDC, LPCRECT prc, BOOL bVertical) = 0;
+    STDMETHOD_(void, DrawSeparator)(HDC hDC, LPCRECT prc, BOOL bVertical) = 0;
 };
 
 class CUIFSchemeDef : public CUIFScheme
@@ -499,8 +500,8 @@ public:
     STDMETHOD_(void, DrawFrameCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, 
DWORD dwDrawFlags, LPSIZE pSize) override;
     STDMETHOD_(void, DrawFrameCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, 
HBITMAP hbm2, DWORD dwDrawFlags) override;
     STDMETHOD_(void, DrawWndFrame)(HDC hDC, LPCRECT prc, DWORD type, DWORD 
unused1, DWORD unused2) override;
-    STDMETHOD_(void, DrawDragHandle)(HDC hDC, LPCRECT prc, BOOL bFlag) 
override;
-    STDMETHOD_(void, DrawSeparator)(HDC hDC, LPCRECT prc, BOOL bFlag) override;
+    STDMETHOD_(void, DrawDragHandle)(HDC hDC, LPCRECT prc, BOOL bVertical) 
override;
+    STDMETHOD_(void, DrawSeparator)(HDC hDC, LPCRECT prc, BOOL bVertical) 
override;
 };
 
 DECLSPEC_SELECTANY CUIFColorTableSys *CUIFScheme::s_pColorTableSys = NULL;
@@ -538,6 +539,7 @@ protected:
 
 public:
     enum { POINTING_TIMER_ID = 0x7982 };
+    operator HWND() const { return m_hWnd; }
     CUIFWindow(HINSTANCE hInst, DWORD style);
     ~CUIFWindow() override;
 
@@ -727,6 +729,26 @@ public:
 
 /////////////////////////////////////////////////////////////////////////////
 
+class CUIFGripper : public CUIFObject
+{
+protected:
+    POINT m_ptGripper;
+
+public:
+    CUIFGripper(CUIFObject *pParent, LPCRECT prc, DWORD style);
+    ~CUIFGripper() override;
+
+    STDMETHOD_(void, OnMouseMove)(LONG x, LONG y) override;
+    STDMETHOD_(void, OnLButtonDown)(LONG x, LONG y) override;
+    STDMETHOD_(void, OnLButtonUp)(LONG x, LONG y) override;
+    STDMETHOD_(BOOL, OnPaintTheme)(HDC hDC) override;
+    STDMETHOD_(void, OnPaintNoTheme)(HDC hDC) override;
+    STDMETHOD_(BOOL, OnSetCursor)(UINT uMsg, LONG x, LONG y) override;
+    STDMETHOD_(void, SetStyle)(DWORD style) override;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
 inline void cicInitUIFLib(void)
 {
     cicInitUIFSys();
@@ -1629,10 +1651,10 @@ CUIFSchemeDef::DrawWndFrame(HDC hDC, LPCRECT prc, DWORD 
type, DWORD unused1, DWO
 }
 
 inline STDMETHODIMP_(void)
-CUIFSchemeDef::DrawDragHandle(HDC hDC, LPCRECT prc, BOOL bFlag)
+CUIFSchemeDef::DrawDragHandle(HDC hDC, LPCRECT prc, BOOL bVertical)
 {
     RECT rc;
-    if (bFlag)
+    if (bVertical)
         rc = { prc->left, prc->top + 1, prc->right, prc->top + 4 };
     else
         rc = { prc->left + 1, prc->top, prc->left + 4, prc->bottom };
@@ -1640,7 +1662,7 @@ CUIFSchemeDef::DrawDragHandle(HDC hDC, LPCRECT prc, BOOL 
bFlag)
 }
 
 inline STDMETHODIMP_(void)
-CUIFSchemeDef::DrawSeparator(HDC hDC, LPCRECT prc, BOOL bFlag)
+CUIFSchemeDef::DrawSeparator(HDC hDC, LPCRECT prc, BOOL bVertical)
 {
     HPEN hLightPen = ::CreatePen(PS_SOLID, 0, 
::GetSysColor(COLOR_BTNHIGHLIGHT));
     if (!hLightPen)
@@ -1654,7 +1676,7 @@ CUIFSchemeDef::DrawSeparator(HDC hDC, LPCRECT prc, BOOL 
bFlag)
     }
 
     HGDIOBJ hPenOld = ::SelectObject(hDC, hShadowPen);
-    if (bFlag)
+    if (bVertical)
     {
         ::MoveToEx(hDC, prc->left, prc->top + 1, NULL);
         ::LineTo(hDC, prc->right, prc->top + 1);
@@ -2514,12 +2536,10 @@ CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam)
             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);
-            }
+            if (m_pToolTip && ::IsWindow(*m_pToolTip))
+                ::DestroyWindow(*m_pToolTip);
+            if (m_pShadow && ::IsWindow(*m_pShadow))
+                ::DestroyWindow(*m_pShadow);
             OnDestroy(hWnd);
             return 0;
         case WM_SIZE:
@@ -3040,7 +3060,7 @@ inline void CUIFShadow::InitShadow()
 
 inline void CUIFShadow::AdjustWindowPos()
 {
-    HWND hwndOwner = m_pShadowOrToolTipOwner->m_hWnd;
+    HWND hwndOwner = *m_pShadowOrToolTipOwner;
     if (!::IsWindow(m_hWnd))
         return;
 
@@ -3093,7 +3113,7 @@ inline STDMETHODIMP_(LRESULT)
 CUIFShadow::OnWindowPosChanging(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 
lParam)
 {
     WINDOWPOS *wp = (WINDOWPOS *)lParam;
-    wp->hwndInsertAfter = m_pShadowOrToolTipOwner->m_hWnd;
+    wp->hwndInsertAfter = *m_pShadowOrToolTipOwner;
     return ::DefWindowProc(hWnd, Msg, wParam, lParam);
 }
 
@@ -3224,7 +3244,7 @@ CUIFToolTip::GetTipTextColor()
 inline CUIFObject*
 CUIFToolTip::FindObject(HWND hWnd, POINT pt)
 {
-    if (hWnd == m_pShadowOrToolTipOwner->m_hWnd)
+    if (hWnd == *m_pShadowOrToolTipOwner)
         return m_pShadowOrToolTipOwner->ObjectFromPoint(pt);
     return NULL;
 }
@@ -3246,7 +3266,7 @@ CUIFToolTip::ShowTip()
 
     POINT Point;
     ::GetCursorPos(&Point);
-    ::ScreenToClient(m_pToolTipTarget->m_pWindow->m_hWnd, &Point);
+    ::ScreenToClient(*m_pToolTipTarget->m_pWindow, &Point);
 
     RECT rc;
     m_pToolTipTarget->GetRect(&rc);
@@ -3264,8 +3284,8 @@ CUIFToolTip::ShowTip()
     GetTipWindowSize(&size);
 
     RECT rc2 = rc;
-    ::ClientToScreen(m_pToolTipTarget->m_pWindow->m_hWnd, (LPPOINT)&rc);
-    ::ClientToScreen(m_pToolTipTarget->m_pWindow->m_hWnd, (LPPOINT)&rc.right);
+    ::ClientToScreen(*m_pToolTipTarget->m_pWindow, (LPPOINT)&rc);
+    ::ClientToScreen(*m_pToolTipTarget->m_pWindow, (LPPOINT)&rc.right);
     GetTipWindowRect(&rc2, size, &rc);
 
     m_bShowToolTip = TRUE;
@@ -3709,7 +3729,7 @@ CUIFButton::GetTextSize(LPCWSTR pszText, LPSIZE pSize)
     INT cchText = lstrlenW(pszText);
     HGDIOBJ hFontOld = ::SelectObject(hDC, m_hFont);
 
-    if (!m_bHasCustomFont && SUCCEEDED(EnsureThemeData(m_pWindow->m_hWnd)))
+    if (!m_bHasCustomFont && SUCCEEDED(EnsureThemeData(*m_pWindow)))
     {
         RECT rc;
         GetThemeTextExtent(hDC, 0, pszText, cchText, 0, NULL, &rc);
@@ -4077,3 +4097,111 @@ CUIFButton2::OnPaintNoTheme(HDC hDC)
     ::SelectObject(hdcMem, hbmOld);
     ::DeleteObject(hbmMem);
 }
+
+/////////////////////////////////////////////////////////////////////////////
+
+inline
+CUIFGripper::CUIFGripper(CUIFObject *pParent, LPCRECT prc, DWORD style)
+    : CUIFObject(pParent, 0, prc, style)
+{
+    m_iStateId = 0;
+    m_pszClassList = L"REBAR";
+    if (m_style & 1)
+        m_iPartId = RP_GRIPPERVERT;
+    else
+        m_iPartId = RP_GRIPPER;
+}
+
+inline CUIFGripper::~CUIFGripper()
+{
+}
+
+inline STDMETHODIMP_(void)
+CUIFGripper::OnMouseMove(LONG x, LONG y)
+{
+    if (IsCapture())
+    {
+        POINT pt;
+        ::GetCursorPos(&pt);
+        m_pWindow->Move(pt.x - m_ptGripper.x, pt.y - m_ptGripper.y, -1, -1);
+    }
+}
+
+inline STDMETHODIMP_(void)
+CUIFGripper::OnLButtonDown(LONG x, LONG y)
+{
+    StartCapture();
+    m_ptGripper.x = x;
+    m_ptGripper.y = y;
+    ::ScreenToClient(*m_pWindow, &m_ptGripper);
+    RECT rc;
+    ::GetWindowRect(*m_pWindow, &rc);
+    m_ptGripper.x -= rc.left;
+    m_ptGripper.y -= rc.top;
+}
+
+inline STDMETHODIMP_(void)
+CUIFGripper::OnLButtonUp(LONG x, LONG y)
+{
+    if (IsCapture())
+        EndCapture();
+}
+
+inline STDMETHODIMP_(BOOL)
+CUIFGripper::OnPaintTheme(HDC hDC)
+{
+    if (FAILED(EnsureThemeData(*m_pWindow)))
+        return FALSE;
+
+    if (m_style & 1)
+    {
+        m_rc.top += 2;
+        m_rc.bottom -= 2;
+    }
+    else
+    {
+        m_rc.left += 2;
+        m_rc.right -= 2;
+    }
+
+    if (FAILED(DrawThemeBackground(hDC, 1, &m_rc, 0)))
+        return FALSE;
+
+    return TRUE;
+}
+
+inline STDMETHODIMP_(void)
+CUIFGripper::OnPaintNoTheme(HDC hDC)
+{
+    if (m_pScheme)
+    {
+        m_pScheme->DrawDragHandle(hDC, &m_rc, !!(m_style & 1));
+        return;
+    }
+
+    RECT rc;
+    if (m_style & 1)
+        rc = { m_rc.left, m_rc.top + 1, m_rc.right, m_rc.top + 4 };
+    else
+        rc = { m_rc.left + 1, m_rc.top, m_rc.left + 4, m_rc.bottom };
+
+    ::DrawEdge(hDC, &rc, BDR_RAISEDINNER, BF_RECT);
+}
+
+inline STDMETHODIMP_(BOOL)
+CUIFGripper::OnSetCursor(UINT uMsg, LONG x, LONG y)
+{
+    HCURSOR hCursor = ::LoadCursor(NULL, IDC_SIZEALL);
+    ::SetCursor(hCursor);
+    return TRUE;
+}
+
+inline STDMETHODIMP_(void)
+CUIFGripper::SetStyle(DWORD style)
+{
+    m_style = style;
+    if (m_style & 1)
+        SetActiveTheme(L"REBAR", RP_GRIPPERVERT, 0);
+    else
+        SetActiveTheme(L"REBAR", RP_GRIPPER, 0);
+}

Reply via email to