https://git.reactos.org/?p=reactos.git;a=commitdiff;h=89d8b472af5b5c3960cbe92f9521b9d866398798

commit 89d8b472af5b5c3960cbe92f9521b9d866398798
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Wed Jan 17 12:42:54 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Wed Jan 17 12:42:54 2024 +0900

    [MSUTB] Add CTrayIconItem (#6371)
    
    Supporting Language Bar...
    JIRA issue: CORE-19363
    - Implement CTrayIconItem class.
    - Add delay link to shell32.dll.
---
 dll/win32/msutb/CMakeLists.txt |   2 +-
 dll/win32/msutb/msutb.cpp      | 107 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+), 1 deletion(-)

diff --git a/dll/win32/msutb/CMakeLists.txt b/dll/win32/msutb/CMakeLists.txt
index d4259dc7cda..dd79a30d8c5 100644
--- a/dll/win32/msutb/CMakeLists.txt
+++ b/dll/win32/msutb/CMakeLists.txt
@@ -15,5 +15,5 @@ set_module_type(msutb win32dll)
 add_dependencies(msutb msctf psdk)
 target_link_libraries(msutb wine uuid atl_classes)
 add_importlibs(msutb user32 gdi32 advapi32 msvcrt kernel32 ntdll)
-add_delay_importlibs(msutb comctl32 msctf ole32 oleaut32)
+add_delay_importlibs(msutb comctl32 msctf ole32 oleaut32 shell32)
 add_cd_file(TARGET msutb DESTINATION reactos/system32 FOR all)
diff --git a/dll/win32/msutb/msutb.cpp b/dll/win32/msutb/msutb.cpp
index 4ba8f878913..ec7e1ea24cb 100644
--- a/dll/win32/msutb/msutb.cpp
+++ b/dll/win32/msutb/msutb.cpp
@@ -30,6 +30,113 @@ END_OBJECT_MAP()
 
 CMsUtbModule gModule;
 
+/***********************************************************************/
+
+class CTrayIconWnd
+{
+public:
+    //FIXME
+    HWND GetNotifyWnd() { return NULL; };
+};
+
+/***********************************************************************/
+
+class CTrayIconItem
+{
+protected:
+    HWND m_hWnd;
+    UINT m_uCallbackMessage;
+    UINT m_uNotifyIconID;
+    DWORD m_dwIconAddOrModify;
+    BOOL m_bIconAdded;
+    CTrayIconWnd *m_pTrayIconWnd;
+    DWORD m_dw;
+    GUID m_guid;
+    RECT m_rcMenu;
+    POINT m_ptCursor;
+
+    CTrayIconItem(CTrayIconWnd *pTrayIconWnd);
+
+    BOOL _Init(HWND hWnd, UINT uCallbackMessage, UINT uNotifyIconID, const 
GUID& rguid);
+    BOOL UpdateMenuRectPoint();
+    BOOL RemoveIcon();
+
+    STDMETHOD_(BOOL, SetIcon)(HICON hIcon, LPCTSTR pszTip);
+    STDMETHOD_(LRESULT, OnMsg)(WPARAM wParam, LPARAM lParam) { return 0; };
+    STDMETHOD_(LRESULT, OnDelayMsg)(LPARAM lParam) { return 0; };
+};
+
+/***********************************************************************
+ * CTrayIconItem
+ */
+
+CTrayIconItem::CTrayIconItem(CTrayIconWnd *pTrayIconWnd)
+{
+    m_dwIconAddOrModify = NIM_ADD;
+    m_pTrayIconWnd = pTrayIconWnd;
+}
+
+BOOL
+CTrayIconItem::_Init(
+    HWND hWnd,
+    UINT uCallbackMessage,
+    UINT uNotifyIconID,
+    const GUID& rguid)
+{
+    m_hWnd = hWnd;
+    m_uCallbackMessage = uCallbackMessage;
+    m_uNotifyIconID = uNotifyIconID;
+    m_guid = rguid;
+    return TRUE;
+}
+
+BOOL CTrayIconItem::RemoveIcon()
+{
+    if (m_dwIconAddOrModify == NIM_MODIFY)
+    {
+        NOTIFYICONDATA NotifyIcon = { sizeof(NotifyIcon), m_hWnd, 
m_uNotifyIconID };
+        NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
+        NotifyIcon.uCallbackMessage = m_uCallbackMessage;
+        ::Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);
+    }
+
+    m_dwIconAddOrModify = NIM_ADD;
+    m_bIconAdded = TRUE;
+    return TRUE;
+}
+
+BOOL CTrayIconItem::SetIcon(HICON hIcon, LPCTSTR pszTip)
+{
+    if (!hIcon)
+        return FALSE;
+
+    NOTIFYICONDATA NotifyIcon = { sizeof(NotifyIcon), m_hWnd, m_uNotifyIconID 
};
+    NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE;
+    NotifyIcon.uCallbackMessage = m_uCallbackMessage;
+    NotifyIcon.hIcon = hIcon;
+    if (pszTip)
+    {
+        NotifyIcon.uFlags |= NIF_TIP;
+        StringCchCopy(NotifyIcon.szTip, _countof(NotifyIcon.szTip), pszTip);
+    }
+
+    ::Shell_NotifyIcon(m_dwIconAddOrModify, &NotifyIcon);
+
+    m_dwIconAddOrModify = NIM_MODIFY;
+    m_bIconAdded = NIM_MODIFY;
+    return TRUE;
+}
+
+BOOL CTrayIconItem::UpdateMenuRectPoint()
+{
+    HWND hNotifyWnd = m_pTrayIconWnd->GetNotifyWnd();
+    ::GetClientRect(hNotifyWnd, &m_rcMenu);
+    ::ClientToScreen(hNotifyWnd, (LPPOINT)&m_rcMenu);
+    ::ClientToScreen(hNotifyWnd, (LPPOINT)&m_rcMenu.right);
+    ::GetCursorPos(&m_ptCursor);
+    return TRUE;
+}
+
 /***********************************************************************
  *              GetLibTls (MSUTB.@)
  *

Reply via email to