https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d3ae8258c203bb6bd0bdea34da0b37236e0086cb
commit d3ae8258c203bb6bd0bdea34da0b37236e0086cb Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Wed Jan 10 11:25:59 2024 +0900 Commit: GitHub <nore...@github.com> CommitDate: Wed Jan 10 11:25:59 2024 +0900 [SDK] cicuif.h: Add CUIFSchemeDef (#6329) Supporting TIPs... JIRA issue: CORE-19360 - Add CUIFSchemeDef class. - Improve CUIFWindow class. --- sdk/include/reactos/cicero/cicuif.h | 573 +++++++++++++++++++++++++++++++----- 1 file changed, 497 insertions(+), 76 deletions(-) diff --git a/sdk/include/reactos/cicero/cicuif.h b/sdk/include/reactos/cicero/cicuif.h index fc0e46617ef..465b3048cf6 100644 --- a/sdk/include/reactos/cicero/cicuif.h +++ b/sdk/include/reactos/cicero/cicuif.h @@ -302,6 +302,7 @@ protected: public: CUIFColorTableSys() { } + COLORREF GetColor(INT iColor) const { return m_rgbColors[iColor]; } HBRUSH GetBrush(INT iColor); STDMETHOD_(void, InitColor)() override; @@ -318,6 +319,7 @@ protected: public: CUIFColorTableOff10() { } + COLORREF GetColor(INT iColor) const { return m_rgbColors[iColor]; } HBRUSH GetBrush(INT iColor); STDMETHOD_(void, InitColor)() override; @@ -423,6 +425,7 @@ HBITMAP cicChangeBitmapColor(LPCRECT prc, HBITMAP hbm, COLORREF rgbBack, COLORRE HBITMAP cicConvertBlackBKGBitmap(LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, HBRUSH hBrush); HBITMAP cicCreateMaskBmp(LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, HBRUSH hbr, COLORREF rgbColor, COLORREF rgbBack); +BOOL cicGetIconBitmaps(HICON hIcon, HBITMAP *hbm1, HBITMAP *hbm2, const SIZE *pSize); ///////////////////////////////////////////////////////////////////////////// @@ -432,7 +435,70 @@ public: static CUIFColorTableSys *s_pColorTableSys; static CUIFColorTableOff10 *s_pColorTableOff10; - CUIFScheme(DWORD type); + CUIFScheme() { } + virtual ~CUIFScheme() { } + + STDMETHOD_(DWORD, GetType)() = 0; + STDMETHOD_(COLORREF, GetColor)(INT iColor) = 0; + STDMETHOD_(HBRUSH, GetBrush)(INT iColor) = 0; + STDMETHOD_(INT, CyMenuItem)(INT cyText) = 0; + STDMETHOD_(INT, CxSizeFrame)() = 0; + STDMETHOD_(INT, CySizeFrame)() = 0; + STDMETHOD_(INT, CxWndBorder)() = 0; + STDMETHOD_(INT, CyWndBorder)() = 0; + STDMETHOD_(void, FillRect)(HDC hDC, LPCRECT prc, INT iColor); + STDMETHOD_(void, FrameRect)(HDC hDC, LPCRECT prc, INT iColor); + STDMETHOD_(void, DrawSelectionRect)(HDC hDC, LPCRECT prc, int) = 0; + STDMETHOD_(INT, GetCtrlFaceOffset)(DWORD, DWORD, LPSIZE pSize) = 0; + STDMETHOD_(void, DrawCtrlBkgd)(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) = 0; + STDMETHOD_(void, DrawCtrlEdge)(HDC hDC, LPCRECT prc, DWORD, DWORD) = 0; + STDMETHOD_(void, DrawCtrlText)(HDC hDC, LPCRECT prc, LPCWSTR pszText, INT cchText, DWORD flags, BOOL bRight) = 0; + STDMETHOD_(void, DrawCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) = 0; + STDMETHOD_(void, DrawCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) = 0; + STDMETHOD_(void, DrawFrameCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) = 0; + STDMETHOD_(void, DrawMenuSeparator)(HDC hDC, LPCRECT prc) = 0; + STDMETHOD_(void, DrawFrameCtrlBkgd)(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) = 0; + STDMETHOD_(void, DrawFrameCtrlEdge)(HDC hDC, LPCRECT prc, DWORD dw1, DWORD dw2) = 0; + STDMETHOD_(void, DrawFrameCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) = 0; + STDMETHOD_(void, DrawFrameCtrlBitmap2)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) = 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; +}; + +class CUIFSchemeDef : public CUIFScheme +{ +protected: + DWORD m_dwFlags; + DWORD m_dwType; + +public: + CUIFSchemeDef(DWORD dwType) : m_dwFlags(0), m_dwType(dwType) { } + + STDMETHOD_(DWORD, GetType)() override; + STDMETHOD_(COLORREF, GetColor)(INT iColor) override; + STDMETHOD_(HBRUSH, GetBrush)(INT iColor) override; + STDMETHOD_(INT, CyMenuItem)(INT cyText) override; + STDMETHOD_(INT, CxSizeFrame)() override; + STDMETHOD_(INT, CySizeFrame)() override; + STDMETHOD_(INT, CxWndBorder)() override; + STDMETHOD_(INT, CyWndBorder)() override; + STDMETHOD_(void, DrawSelectionRect)(HDC hDC, LPCRECT prc, int) override; + STDMETHOD_(INT, GetCtrlFaceOffset)(DWORD, DWORD, LPSIZE pSize) override; + STDMETHOD_(void, DrawCtrlBkgd)(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) override; + STDMETHOD_(void, DrawCtrlEdge)(HDC hDC, LPCRECT prc, DWORD, DWORD) override; + STDMETHOD_(void, DrawCtrlText)(HDC hDC, LPCRECT prc, LPCWSTR pszText, INT cchText, DWORD flags, BOOL bRight) override; + STDMETHOD_(void, DrawCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) override; + STDMETHOD_(void, DrawCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) override; + STDMETHOD_(void, DrawFrameCtrlBitmap)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) override; + STDMETHOD_(void, DrawMenuSeparator)(HDC hDC, LPCRECT prc) override; + STDMETHOD_(void, DrawFrameCtrlBkgd)(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) override; + STDMETHOD_(void, DrawFrameCtrlEdge)(HDC hDC, LPCRECT prc, DWORD dw1, DWORD dw2) override; + STDMETHOD_(void, DrawFrameCtrlIcon)(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) override; + STDMETHOD_(void, DrawFrameCtrlBitmap2)(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) 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; }; DECLSPEC_SELECTANY CUIFColorTableSys *CUIFScheme::s_pColorTableSys = NULL; @@ -457,8 +523,8 @@ protected: CUIFWindow *m_pUnknown7; CUIFObject *m_pCaptured; CUIFObject *m_pPointed; - DWORD m_dwUnknown8; - DWORD m_dwUnknown9; + BOOL m_bPointingStarted; + CUIFWindow *m_pPointingWindow; CUIFToolTip *m_pToolTip; CUIFShadow *m_pShadow; BOOL m_bShowShadow; @@ -469,6 +535,7 @@ protected: friend class CUIFButton; public: + enum { POINTING_TIMER_ID = 0x7982 }; CUIFWindow(HINSTANCE hInst, DWORD style); ~CUIFWindow() override; @@ -497,7 +564,7 @@ public: 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, OnPointingEnded)(LONG x, LONG y); STDMETHOD_(void, OnCreate)(HWND hWnd); STDMETHOD_(void, OnDestroy)(HWND hWnd); STDMETHOD_(void, OnNCDestroy)(HWND hWnd); @@ -523,7 +590,7 @@ public: 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, OnPointingStarted)(UINT uMsg, LONG x, LONG y); STDMETHOD_(void, OnAnimationStart)(); STDMETHOD_(void, OnAnimationEnd)(); STDMETHOD_(void, HandleMouseMsg)(UINT uMsg, LONG x, LONG y); @@ -1185,22 +1252,22 @@ inline void CUIFObject::SetScheme(CUIFScheme *scheme) inline STDMETHODIMP_(void) CUIFColorTableSys::InitColor() { - m_rgbColors[0] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[1] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[2] = GetSysColor(COLOR_ACTIVEBORDER); - m_rgbColors[3] = GetSysColor(COLOR_ACTIVECAPTION); - m_rgbColors[4] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[5] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[6] = GetSysColor(COLOR_BTNTEXT); - m_rgbColors[7] = GetSysColor(COLOR_CAPTIONTEXT); - m_rgbColors[8] = GetSysColor(COLOR_GRAYTEXT); - m_rgbColors[9] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[10] = GetSysColor(COLOR_HIGHLIGHTTEXT); - m_rgbColors[11] = GetSysColor(COLOR_INACTIVECAPTION); - m_rgbColors[12] = GetSysColor(COLOR_INACTIVECAPTIONTEXT); - m_rgbColors[13] = GetSysColor(COLOR_MENUTEXT); - m_rgbColors[14] = GetSysColor(COLOR_WINDOW); - m_rgbColors[15] = GetSysColor(COLOR_WINDOWTEXT); + m_rgbColors[0] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[1] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[2] = ::GetSysColor(COLOR_ACTIVEBORDER); + m_rgbColors[3] = ::GetSysColor(COLOR_ACTIVECAPTION); + m_rgbColors[4] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[5] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[6] = ::GetSysColor(COLOR_BTNTEXT); + m_rgbColors[7] = ::GetSysColor(COLOR_CAPTIONTEXT); + m_rgbColors[8] = ::GetSysColor(COLOR_GRAYTEXT); + m_rgbColors[9] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[10] = ::GetSysColor(COLOR_HIGHLIGHTTEXT); + m_rgbColors[11] = ::GetSysColor(COLOR_INACTIVECAPTION); + m_rgbColors[12] = ::GetSysColor(COLOR_INACTIVECAPTIONTEXT); + m_rgbColors[13] = ::GetSysColor(COLOR_MENUTEXT); + m_rgbColors[14] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[15] = ::GetSysColor(COLOR_WINDOWTEXT); } inline STDMETHODIMP_(void) CUIFColorTableSys::InitBrush() @@ -1237,38 +1304,38 @@ inline HBRUSH CUIFColorTableOff10::GetBrush(INT iColor) /// @unimplemented inline STDMETHODIMP_(void) CUIFColorTableOff10::InitColor() { - m_rgbColors[0] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[1] = GetSysColor(COLOR_WINDOW); - m_rgbColors[2] = GetSysColor(COLOR_WINDOW); - m_rgbColors[3] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[4] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[5] = GetSysColor(COLOR_WINDOW); - m_rgbColors[6] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[7] = GetSysColor(COLOR_WINDOWTEXT); - m_rgbColors[8] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[9] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[10] = GetSysColor(COLOR_HIGHLIGHTTEXT); - m_rgbColors[11] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[12] = GetSysColor(COLOR_BTNTEXT); - m_rgbColors[13] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[14] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[15] = GetSysColor(COLOR_WINDOW); - m_rgbColors[16] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[17] = GetSysColor(COLOR_BTNTEXT); - m_rgbColors[18] = GetSysColor(COLOR_WINDOW); - m_rgbColors[19] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[20] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[21] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[22] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[23] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[24] = GetSysColor(COLOR_CAPTIONTEXT); - m_rgbColors[25] = GetSysColor(COLOR_HIGHLIGHT); - m_rgbColors[26] = GetSysColor(COLOR_HIGHLIGHTTEXT); - m_rgbColors[27] = GetSysColor(COLOR_BTNFACE); - m_rgbColors[28] = GetSysColor(COLOR_BTNTEXT); - m_rgbColors[29] = GetSysColor(COLOR_BTNSHADOW); - m_rgbColors[30] = GetSysColor(COLOR_BTNTEXT); - m_rgbColors[31] = GetSysColor(COLOR_WINDOWTEXT); + m_rgbColors[0] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[1] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[2] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[3] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[4] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[5] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[6] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[7] = ::GetSysColor(COLOR_WINDOWTEXT); + m_rgbColors[8] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[9] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[10] = ::GetSysColor(COLOR_HIGHLIGHTTEXT); + m_rgbColors[11] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[12] = ::GetSysColor(COLOR_BTNTEXT); + m_rgbColors[13] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[14] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[15] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[16] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[17] = ::GetSysColor(COLOR_BTNTEXT); + m_rgbColors[18] = ::GetSysColor(COLOR_WINDOW); + m_rgbColors[19] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[20] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[21] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[22] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[23] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[24] = ::GetSysColor(COLOR_CAPTIONTEXT); + m_rgbColors[25] = ::GetSysColor(COLOR_HIGHLIGHT); + m_rgbColors[26] = ::GetSysColor(COLOR_HIGHLIGHTTEXT); + m_rgbColors[27] = ::GetSysColor(COLOR_BTNFACE); + m_rgbColors[28] = ::GetSysColor(COLOR_BTNTEXT); + m_rgbColors[29] = ::GetSysColor(COLOR_BTNSHADOW); + m_rgbColors[30] = ::GetSysColor(COLOR_BTNTEXT); + m_rgbColors[31] = ::GetSysColor(COLOR_WINDOWTEXT); } inline STDMETHODIMP_(void) CUIFColorTableOff10::InitBrush() @@ -1334,12 +1401,260 @@ inline void cicDoneUIFScheme(void) /// @unimplemented inline CUIFScheme *cicCreateUIFScheme(DWORD type) { - return new(cicNoThrow) CUIFScheme(type); + return new(cicNoThrow) CUIFSchemeDef(type); +} + +inline STDMETHODIMP_(DWORD) CUIFSchemeDef::GetType() +{ + return m_dwType; +} + +inline STDMETHODIMP_(COLORREF) CUIFSchemeDef::GetColor(INT iColor) +{ + return s_pColorTableSys->GetColor(iColor); +} + +inline STDMETHODIMP_(HBRUSH) CUIFSchemeDef::GetBrush(INT iColor) +{ + return s_pColorTableSys->GetBrush(iColor); +} + +inline STDMETHODIMP_(INT) CUIFSchemeDef::CyMenuItem(INT cyText) +{ + return cyText + 2; +} + +inline STDMETHODIMP_(INT) CUIFSchemeDef::CxSizeFrame() +{ + return ::GetSystemMetrics(SM_CXSIZEFRAME); +} + +inline STDMETHODIMP_(INT) CUIFSchemeDef::CySizeFrame() +{ + return ::GetSystemMetrics(SM_CYSIZEFRAME); +} + +inline STDMETHODIMP_(INT) CUIFSchemeDef::CxWndBorder() +{ + return 1; +} + +inline STDMETHODIMP_(INT) CUIFSchemeDef::CyWndBorder() +{ + return 1; +} + +inline STDMETHODIMP_(void) CUIFScheme::FillRect(HDC hDC, LPCRECT prc, INT iColor) +{ + ::FillRect(hDC, prc, GetBrush(iColor)); +} + +inline STDMETHODIMP_(void) CUIFScheme::FrameRect(HDC hDC, LPCRECT prc, INT iColor) +{ + ::FrameRect(hDC, prc, GetBrush(iColor)); +} + +inline STDMETHODIMP_(void) CUIFSchemeDef::DrawSelectionRect(HDC hDC, LPCRECT prc, int) +{ + ::FillRect(hDC, prc, GetBrush(6)); +} + +/// @unimplemented +inline STDMETHODIMP_(INT) CUIFSchemeDef::GetCtrlFaceOffset(DWORD, DWORD, LPSIZE pSize) +{ + return 0; +} + +inline STDMETHODIMP_(void) CUIFSchemeDef::DrawCtrlBkgd(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) +{ + ::FillRect(hDC, prc, GetBrush(9)); + + if (!(flags & 0x10) && (flags & 0x2)) + return; + + HBRUSH hbrDither = cicCreateDitherBrush(); + if (!hbrDither) + return; + + COLORREF rgbOldText = ::SetTextColor(hDC, ::GetSysColor(COLOR_BTNFACE)); + COLORREF rgbOldBack = ::SetBkColor(hDC, ::GetSysColor(COLOR_BTNHIGHLIGHT)); + + RECT rc = *prc; + ::InflateRect(&rc, -2, -2); + ::FillRect(hDC, &rc, hbrDither); + ::SetTextColor(hDC, rgbOldText); + ::SetBkColor(hDC, rgbOldBack); + ::DeleteObject(hbrDither); +} + +/// @unimplemented +inline STDMETHODIMP_(void) CUIFSchemeDef::DrawCtrlEdge(HDC hDC, LPCRECT prc, DWORD, DWORD) +{ + //FIXME + RECT rc = *prc; + ::DrawEdge(hDC, &rc, BDR_RAISEDINNER, BF_RECT); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawCtrlText( + HDC hDC, + LPCRECT prc, + LPCWSTR pszText, + INT cchText, + DWORD flags, + BOOL bRight) +{ + COLORREF rgbOldText = ::GetTextColor(hDC); + INT OldBkMode = ::SetBkMode(hDC, TRANSPARENT); + + if (cchText == -1) + cchText = lstrlenW(pszText); + + RECT rc = *prc; + if (flags & 0x20) + { + ::OffsetRect(&rc, 1, 1); + ::SetTextColor(hDC, ::GetSysColor(COLOR_BTNHIGHLIGHT)); + ::ExtTextOutW(hDC, (bRight ? rc.right : rc.left), rc.top, ETO_CLIPPED, &rc, + pszText, cchText, NULL); + ::OffsetRect(&rc, -1, -1); + } + + ::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)); + ::ExtTextOutW(hDC, (bRight ? rc.right : rc.left), rc.top, ETO_CLIPPED, &rc, + pszText, cchText, NULL); + + ::SetTextColor(hDC, rgbOldText); + ::SetBkMode(hDC, OldBkMode); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawCtrlIcon(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) +{ + if (m_dwFlags & 1) + { + HBITMAP hbm1, hbm2; + if (cicGetIconBitmaps(hIcon, &hbm1, &hbm2, pSize)) + { + DrawCtrlBitmap(hDC, prc, hbm1, hbm2, flags); + ::DeleteObject(hbm1); + ::DeleteObject(hbm2); + } + } + else + { + UINT uFlags = DST_PREFIXTEXT | DST_TEXT; + if (flags & 0x20) + uFlags |= (DSS_MONO | DSS_DISABLED); + ::DrawState(hDC, 0, 0, (LPARAM)hIcon, 0, prc->left, prc->top, 0, 0, uFlags); + } } /// @unimplemented -inline CUIFScheme::CUIFScheme(DWORD type) +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawCtrlBitmap(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) +{ + //FIXME +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawFrameCtrlBitmap(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) +{ + DrawCtrlBitmap(hDC, prc, hbm1, hbm2, flags); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawMenuSeparator(HDC hDC, LPCRECT prc) +{ + RECT rc = *prc; + rc.bottom = rc.top + (rc.bottom - rc.top) / 2; + ::FillRect(hDC, &rc, (HBRUSH)UlongToHandle(COLOR_BTNSHADOW + 1)); + + rc = *prc; + rc.top += (rc.bottom - rc.top) / 2; + ::FillRect(hDC, &rc, (HBRUSH)UlongToHandle(COLOR_BTNHIGHLIGHT + 1)); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawFrameCtrlBkgd(HDC hDC, LPCRECT prc, DWORD unused, DWORD flags) +{ + DrawCtrlBkgd(hDC, prc, unused, flags); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawFrameCtrlEdge(HDC hDC, LPCRECT prc, DWORD dw1, DWORD dw2) +{ + DrawCtrlEdge(hDC, prc, dw1, dw2); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawFrameCtrlIcon(HDC hDC, LPCRECT prc, HICON hIcon, DWORD flags, LPSIZE pSize) { + DrawCtrlIcon(hDC, prc, hIcon, flags, pSize); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawFrameCtrlBitmap2(HDC hDC, LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, DWORD flags) +{ + DrawFrameCtrlBitmap(hDC, prc, hbm1, hbm2, flags); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawWndFrame(HDC hDC, LPCRECT prc, DWORD type, DWORD unused1, DWORD unused2) +{ + RECT rc = *prc; + if (type && type <= 2) + ::DrawEdge(hDC, &rc, BDR_RAISED, BF_RECT); + else + FrameRect(hDC, &rc, 14); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawDragHandle(HDC hDC, LPCRECT prc, BOOL bFlag) +{ + RECT rc; + if (bFlag) + rc = { prc->left, prc->top + 1, prc->right, prc->top + 4 }; + else + rc = { prc->left + 1, prc->top, prc->left + 4, prc->bottom }; + ::DrawEdge(hDC, &rc, BDR_RAISEDINNER, BF_RECT); +} + +inline STDMETHODIMP_(void) +CUIFSchemeDef::DrawSeparator(HDC hDC, LPCRECT prc, BOOL bFlag) +{ + HPEN hLightPen = ::CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNHIGHLIGHT)); + if (!hLightPen) + return; + + HPEN hShadowPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW)); + if (!hShadowPen) + { + ::DeleteObject(hLightPen); + return; + } + + HGDIOBJ hPenOld = ::SelectObject(hDC, hShadowPen); + if (bFlag) + { + ::MoveToEx(hDC, prc->left, prc->top + 1, NULL); + ::LineTo(hDC, prc->right, prc->top + 1); + ::SelectObject(hDC, hLightPen); + ::MoveToEx(hDC, prc->left, prc->top + 2, NULL); + ::LineTo(hDC, prc->right, prc->top + 2); + } + else + { + ::MoveToEx(hDC, prc->left + 1, prc->top, NULL); + ::LineTo(hDC, prc->left + 1, prc->bottom); + ::SelectObject(hDC, hLightPen); + ::MoveToEx(hDC, prc->left + 2, prc->top, NULL); + ::LineTo(hDC, prc->left + 2, prc->bottom); + } + ::SelectObject(hDC, hPenOld); + + ::DeleteObject(hShadowPen); + ::DeleteObject(hLightPen); } ///////////////////////////////////////////////////////////////////////////// @@ -1708,6 +2023,39 @@ cicCreateMaskBmp(LPCRECT prc, HBITMAP hbm1, HBITMAP hbm2, return CUIFBitmapDC::s_phdcDst->DetachBitmap(); } +inline BOOL cicGetIconBitmaps(HICON hIcon, HBITMAP *hbm1, HBITMAP *hbm2, const SIZE *pSize) +{ + if (!CUIFBitmapDC::s_fInitBitmapDCs) + return NULL; + + LONG cx, cy; + SIZE size; + if (pSize) + { + size = *pSize; + } + else + { + if (!cicGetIconSize(hIcon, &size)) + return FALSE; + } + + CUIFBitmapDC::s_phdcSrc->SetDIB(cx, cy, 1, 32); + CUIFBitmapDC::s_phdcMask->SetBitmap(cx, cy, 1, 1); + + RECT rc = { 0, 0, size.cx, size.cy }; + ::FillRect(*CUIFBitmapDC::s_phdcSrc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + + ::DrawIconEx(*CUIFBitmapDC::s_phdcSrc, 0, 0, hIcon, size.cx, size.cy, 0, 0, DI_NORMAL); + ::DrawIconEx(*CUIFBitmapDC::s_phdcMask, 0, 0, hIcon, size.cx, size.cy, 0, 0, DI_MASK); + + CUIFBitmapDC::s_phdcSrc->Uninit(TRUE); + CUIFBitmapDC::s_phdcMask->Uninit(TRUE); + *hbm1 = CUIFBitmapDC::s_phdcSrc->DetachBitmap(); + *hbm2 = CUIFBitmapDC::s_phdcMask->DetachBitmap(); + return TRUE; +} + ///////////////////////////////////////////////////////////////////////////// inline CUIFWindow::CUIFWindow(HINSTANCE hInst, DWORD style) @@ -1723,11 +2071,11 @@ inline CUIFWindow::CUIFWindow(HINSTANCE hInst, DWORD style) m_pCaptured = NULL; m_pUnknown7 = NULL; m_pPointed = NULL; - m_dwUnknown8 = 0; + m_bPointingStarted = FALSE; m_pToolTip = NULL; m_pShadow = NULL; m_bShowShadow = TRUE; - m_dwUnknown9 = 0; + m_pPointingWindow = NULL; CUIFWindow::CreateScheme(); } @@ -2098,7 +2446,6 @@ CUIFWindow::OnThemeChanged(HWND hWnd, WPARAM wParam, LPARAM lParam) ClearTheme(); } -/// @unimplemented inline LRESULT CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -2130,8 +2477,29 @@ CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) POINT Point; ::GetCursorPos(&Point); ::ScreenToClient(m_hWnd, &Point); - //FIXME - return 1; + + if (m_pPointingWindow) + { + m_pPointingWindow->OnPointingStarted(HIWORD(lParam), Point.x, Point.y); + return TRUE; + } + + if (!m_bPointingStarted) + { + ::SetTimer(m_hWnd, POINTING_TIMER_ID, 1000, NULL); + m_bPointingStarted = TRUE; + } + + if (m_pToolTip) + { + MSG msg = { m_hWnd, HIWORD(lParam), 0, MAKELPARAM(Point.x, Point.y) }; + m_pToolTip->RelayEvent(&msg); + } + + if (!(m_style & UIF_STYLE_VERTICAL)) + HandleMouseMsg(HIWORD(lParam), Point.x, Point.y); + + return TRUE; } case WM_MOUSEACTIVATE: return MA_NOACTIVATE; @@ -2180,10 +2548,57 @@ CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return 0; } case WM_COMMAND: + { return 0; + } case WM_TIMER: - //FIXME - return 0; + { + switch (wParam) + { + case 0x5461: + { + if (m_pUnknown7) + m_pUnknown7->OnUnknown9(); + break; + } + case POINTING_TIMER_ID: + { + POINT pt; + ::GetCursorPos(&pt); + + POINT pt2 = pt; + ::ScreenToClient(m_hWnd, &pt2); + + RECT rc; + ::GetWindowRect(m_hWnd, &rc); + + if (::PtInRect(&rc, pt) && ::WindowFromPoint(pt) == m_hWnd) + { + m_pPointingWindow->OnPointingStarted(WM_MOUSEMOVE, pt2.x, pt2.y); + } + else + { + ::KillTimer(m_hWnd, POINTING_TIMER_ID); + m_bPointingStarted = FALSE; + SetObjectPointed(NULL, pt2); + OnPointingEnded(pt2.x, pt2.y); + } + + if (m_pToolTip) + { + MSG msg = { m_hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(pt2.x, pt2.y) }; + m_pToolTip->RelayEvent(&msg); + } + break; + } + default: + { + OnTimer(wParam); + break; + } + } + break; + } case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: @@ -2195,13 +2610,18 @@ CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_RBUTTONDBLCLK: case WM_RBUTTONUP: { - //FIXME - HandleMouseMsg(uMsg, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam)); - return 0; + if (m_pPointingWindow) + m_pPointingWindow->OnPointingStarted(uMsg, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam)); + else + HandleMouseMsg(uMsg, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam)); + + break; } case WM_KEYUP: + { OnKeyUp(hWnd, wParam, lParam); - return 0; + break; + } case WM_WINDOWPOSCHANGING: { WINDOWPOS *pwp = (WINDOWPOS *)lParam; @@ -2240,7 +2660,7 @@ CUIFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CUIFWindow *pThis = CUIFWindow::GetThis(hWnd); pThis->OnUser(hWnd, uMsg, wParam, lParam); - return 0; + break; } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -2381,8 +2801,8 @@ CUIFWindow::PaintObject(HDC hDC, LPCRECT prc) FAILED(DrawThemeParentBackground(m_hWnd, hMemDC, &m_rc))) && FAILED(DrawThemeBackground(hMemDC, m_iStateId, &m_rc, 0))) { - //if (m_pScheme) - // m_pScheme->FillRect(hMemDC, pRect, 22); //FIXME + if (m_pScheme) + m_pScheme->FillRect(hMemDC, pRect, 22); } CUIFObject::PaintObject(hMemDC, pRect); ::BitBlt(hDC, @@ -2421,11 +2841,13 @@ 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); @@ -2483,11 +2905,9 @@ CUIFWindow::OnSetFocus(HWND hWnd) { } -/// @unimplemented inline STDMETHODIMP_(void) -CUIFWindow::OnLButtonDown2(LONG x, LONG y) +CUIFWindow::OnPointingEnded(LONG x, LONG y) { - //FIXME } inline STDMETHODIMP_(void) @@ -2500,11 +2920,9 @@ CUIFWindow::OnNotify(HWND hWnd, WPARAM wParam, LPARAM lParam) { } -/// @unimplemented inline STDMETHODIMP_(void) CUIFWindow::OnTimer(WPARAM wParam) { - //FIXME } inline STDMETHODIMP_(void) @@ -2570,9 +2988,8 @@ CUIFWindow::OnEraseBkGnd(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return FALSE; } -/// @unimplemented inline STDMETHODIMP_(void) -CUIFWindow::OnSetCapture(HWND hWnd, UINT, LONG) +CUIFWindow::OnPointingStarted(UINT uMsg, LONG x, LONG y) { } @@ -2772,6 +3189,10 @@ CUIFToolTip::GetDelayTime(UINT uType) return ::GetDoubleClickTime(); return nDelayTime; } + default: + { + return 0; + } } }