Pracujeme s tray ikonou (MFC a C++)

V tomto článku se naučíme pracovat s tzv. tray ikonou, která je umístěna na hlavním panelu vedle hodin. Na obrázku vidíte, jak to nakonec bude vypadat.

Zde se nachází Tray ikona

Nejdříve si vytvoříme aplikaci založenou na dialogu a umístíme na ni jedno tlačítko, kterým se bude aplikace schovávat do tray ikony. Pro vytvoření a odebrání tray ikony slouží funkce Shell_NotifyIcon.

BOOL Shell_NotifyIcon{
  DWORD dwMessage,      //typ zprávy
  PNOTIFYICONDATA pnid  //vlastnosti ikony
};

Parametr dwMessage určuje, co se s ikonou bude dělat. Zde jsou některé možné hodnoty:

NIM_ADD - přidání nové ikony
NIM_DELETE - odebrání ikony
NIM_MODIFY - nastavení nových vlastností ikony

Druhý parametr pnid je ukazatel na strukturu NOTIFYICONDATA. Neuvedu zde všechny její položky, ale pouze ty které budeme používat.

typedef struct _NOTIFYICONDATA{
  DWORD cbSize;
  HWND hWnd;
  UINT nID;
  UINT uFlags;
  UINT uCallbackMessage;
  HICON hIcon;
  TCHAR szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

A nyní popis jednotlivých položek:

cbSize - velikost struktury (stačí zadat sizeof(NOTIFYICONDATA))
hWnd - handle okna, kterému kterému se budou zasílat zprávy
uID - identifikátor ikony. Hodí se, když má jedno okno více ikon
uFlags - příznak určující, které prvky struktury jsou platné
uCallbackMessage - uživatelská zpráva, pomocí které budou zasílány zprávy oknu
hIcon - handle ikony, která se má zobrazit
szTip - standardní tool-tip, který se zobrazí po najetí na ikonu (max 64 znaků)

Když už víme vše potřebné, tak si na vhodném místě nadefinujeme naši zprávu

#define WM_NotifyIcon (WM_USER+1)

A teď můžeme konečně přistoupit k vytvoření funkce, která bude přidávat ikonu a potom skryje okno.

void CTrayiconDlg::OnTrayIcon()
{
  NOTIFYICONDATA nid;
  nid.cbSize=sizeof(NOTIFYICONDATA);
  nid.hIcon=(HICON)LoadImage(AfxGetInsatnceHandle(),MAKEINTRESOURCE(
    IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
  nid.hWnd=m_hWnd;
  strcpy(nid.szTip,"Tray ikona");
  nid.uCallbackMessage=WM_NotifyIcon;
  nid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
  nid.uID=1;

  Shell_NotifyIcon(NIM_ADD,&nid);
  ShowWindow(SW_HIDE);
}

Jediné, co nám teď ještě zbývá, je naučit se zpracovávat zprávy, které nám ikona bude zasílat. Tuto reakci můžeme provést uvnitř funkce WindowProc. V parametru lParam je uložena zpráva, na kterou ikona zareagovala (např WM_LBUTTONDOWN). Nyní si vše ukažme na příkladu.

LRESULT CTrayiconDlg::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
  switch(message)
  {
    case WM_NotifyIcon:
    {
      switch(lParam)
      {
        case WM_LBUTTONUP:
        {
          ShowWindow(SW_SHOW);
          NOTIFYICONDATA nid;
          ZeroMemory(&nid,sizeof(nid));
          nid.cbSize=sizeof(nid);
          nid.hWnd=m_hWnd;
          nid.uID=1;
          return Shell_NotifyIcon(NIM_DELETE,&nid);
        }
      }
    }
  }
  
return CDialog::WindowProc(message,wParam,lParam);
}

Stáhnout zdrojový kód (24kb)

UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.