Работа с треем
От: Аноним  
Дата: 21.04.06 07:28
Оценка:
Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?
Re: Работа с треем
От: Aera Беларусь  
Дата: 21.04.06 07:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?

// Pavel Amialiushka
// TrayWindow.h
#pragma once

template<typename T> class TrayWindow
{
  int   NIM_NOTIFYICON;
  int   NIM_TASKBAR_CREATED;

protected:
  bool  installed_;

  enum { NOTIFY_ICON = -1 };
  static HICON GetNotifyIcon()
  {
    return  ::LoadIcon(
      _Module.GetResourceInstance(), 
      MAKEINTRESOURCE( T::NOTIFY_ICON ));
  }

  std::string GetNotifyString()
  {
    return "My cool Appication";
  }

  bool DoHideOnMinimize()
  {
    return true;
  }

public:
  
  TrayWindow()
  {
    installed_ = false;
    NIM_NOTIFYICON = ::RegisterWindowMessage("NotifyIcon Message");
    NIM_TASKBAR_CREATED = ::RegisterWindowMessage("TaskbarCreated");
  }

  void InstallNotifyIcon()
  {
    installed_ = true;
    NOTIFYICONDATA data={sizeof(NOTIFYICONDATA), static_cast<T*>(this)->m_hWnd, 0};
    data.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
    
    data.uCallbackMessage=NIM_NOTIFYICON;
    lstrcpy(data.szTip, static_cast<T*>(this)->GetNotifyString().c_str());
    data.hIcon=static_cast<T*>(this)->GetNotifyIcon();

    Shell_NotifyIcon(NIM_ADD, &data);
  }
  
  void UninstallNotifyIcon()
  {
    installed_ = false;
    T* lp = static_cast<T*>(this);
    NOTIFYICONDATA data={sizeof(NOTIFYICONDATA), lp->m_hWnd, 0};
    Shell_NotifyIcon(NIM_DELETE, &data);
  }
  
  bool IsWindowHidden()
  {
    return !static_cast<T*>(this)->IsWindowVisible();
  }
  
  void HideMainWindow()
  {
    T* pT = static_cast<T*>(this);
    if (!IsIconic(*pT))
    {
      pT->ShowWindow(SW_MINIMIZE);
    }
    pT->ShowWindow(SW_HIDE);
    //pT->SetWindowLong(GWL_HWNDPARENT, (LONG)::GetDesktopWindow());
  }

  void ShowMainWindow()
  {
    T* wnd = static_cast<T*>(this);
    if (IsWindowHidden())
    {
      //wnd->SetWindowLong(GWL_HWNDPARENT, (LONG)NULL);
      wnd->ShowWindow(SW_SHOW);
      wnd->ShowWindow(SW_RESTORE);
    }
    ::SetForegroundWindow(static_cast<T*>(this)->m_hWnd);
  }

public:

  BEGIN_MSG_MAP(TrayWindow<T>)
    MESSAGE_HANDLER(NIM_NOTIFYICON, OnIconMessage);    
    MESSAGE_HANDLER(NIM_TASKBAR_CREATED, OnTasbarCreated);
    MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand);
  END_MSG_MAP();

protected:  
  void OnIconRButtonClick() 
  {
  }
  
  void OnIconLButtonClick()
  {
    if (IsWindowHidden()) ShowMainWindow();
    else HideMainWindow();
  }

  LRESULT OnIconMessage(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
  {
    switch(lParam)
    {
      case WM_RBUTTONDOWN:
      case WM_CONTEXTMENU:
        static_cast<T*>(this)->OnIconRButtonClick();
        break;
      case WM_LBUTTONDOWN:
        static_cast<T*>(this)->OnIconLButtonClick();
        break;
    }
    return 0;
  }

  LRESULT OnTasbarCreated(UINT, WPARAM, LPARAM, BOOL& bHandled)
  { bHandled = false;
    if (installed_) InstallNotifyIcon();
    return 0;
  }

  LRESULT OnSysCommand(UINT, WPARAM code, LPARAM, BOOL& bHandled)
  { bHandled = false; 
    if (DoHideOnMinimize() && code==SC_MINIMIZE)
    {
      HideMainWindow();
      bHandled = true;
    }

    return 0;
  }
};
--
RedApe
Re: Работа с треем
От: pigeon Великобритания
Дата: 21.04.06 08:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?

Я пользуюсь этим .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Premature optimization is the root of all evil in programming. Donald Knuth
Re: Работа с треем
От: BuHHunyx Беларусь  
Дата: 21.04.06 08:57
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?


WTL Tray Icon Template
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.