Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tray 
:(
    Опции темы
NiJazz
  Дата 18.2.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



У кого-нибудь есть простой пример программы, которая садится в System Tray?
Мне нужны исходники, как программу кидают в трей на C++.
Спасибо.
PM MAIL   Вверх
srd
Дата 18.2.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 5
Всего: 49



Такая программа ничем не отличается от обычной win32-программы. Просто она не показывает своё окно на экране всё время, а только при получении какого-либо сообщения от иконки. Вот слепил простейший пример: главное (и единственное) окно на экран не выводится вообще, в трее рисуется стандартная иконка, при щелчке на ней левой кнопкой показывается MessageBox, правой - программа завершает работу.
Код

#define STRICT
#define WIN32_LEAN_AND_MEAN
#define WINVER 0x0400

#include <tchar.h>
#include <windows.h>
#include <shellapi.h>

// это сообщение мы будем ловить, когда юзер делает что-то с иконкой
#define WM_ICONTRAY (WM_USER + 1)

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
   const TCHAR *const window_class = _T("MainWindow");

   WNDCLASSEX wc;
   memset(&wc, 0, sizeof (wc));

   wc.cbSize        = sizeof (wc);
   wc.hInstance     = hInstance;
   wc.lpfnWndProc   = wnd_proc;
   wc.lpszClassName = window_class;

   RegisterClassEx(&wc);
   CreateWindowEx(0, window_class, 0, 0, 0, 0, 0, 0, 0, 0, hInstance, 0);

   MSG msg;
   while (GetMessage(&msg, 0, 0, 0))
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }

   return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
   const UINT icon_id = 1; // идентификатор иконки. иконка однозначно идентифицируется
                                        // дескриптором окна программы и произвольным идентификатором
   NOTIFYICONDATA nid;

   switch (msg)
   {
   case WM_CREATE:
       {
           // Добавляем иконку в трей

           memset(&nid, 0, sizeof (nid));

           nid.cbSize           = sizeof (nid);
           nid.hWnd             = hwnd;  // дескриптор окна программы, которому будут лететь сообщения
                                                      // от иконки
           nid.uID              = icon_id;   // идентификатор иконки
           nid.uFlags           = NIF_ICON | NIF_MESSAGE;
           nid.uCallbackMessage = WM_ICONTRAY;  // идентификатор сообщения
           nid.hIcon            = LoadIcon(0, IDI_APPLICATION); // сама иконка (мы юзаем стандартную).

           Shell_NotifyIcon(NIM_ADD, &nid);
       }
       break;

   case WM_ICONTRAY:
       if (wparam == icon_id)
       {
           switch (lparam)
           {
           case WM_LBUTTONDOWN:
               MessageBox(hwnd, _T("Привет"), _T("Иконка в трее"), MB_OK | MB_ICONINFORMATION);
               break;

           case WM_RBUTTONDOWN:
               PostMessage(hwnd, WM_CLOSE, 0, 0);
               break;
           }
       }
       break;

   case WM_DESTROY:
       {
           // здесь мы убиваем иконку и завершаем работу.
           memset(&nid, 0, sizeof (nid));

           nid.cbSize = sizeof (nid);
           nid.hWnd   = hwnd;
           nid.uID    = icon_id;

           Shell_NotifyIcon(NIM_DELETE, &nid);
           PostQuitMessage(0);
       }
       break;

   default:
       return DefWindowProc(hwnd, msg, wparam, lparam);
   }

   return 0;
}



Это сообщение отредактировал(а) srd - 18.2.2005, 09:54


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
NiJazz
Дата 18.2.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



srd
Спасибо за пример. smile
PM MAIL   Вверх
AndreySol
Дата 21.2.2005, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



А можно так:
Для начала к примеру в InitDialog:
Код

// Устанавливаю иконку в SysTray
NOTIFYICONDATA nf = {0};
nf.hWnd = m_hWnd;
nf.uID = NULL;
nf.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nf.uCallbackMessage = IDM_MYICONNOTIFY;
strcpy(nf.szTip, "DSPlayer");
nf.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Shell_NotifyIcon(NIM_ADD,&nf);

где IDM_MYICONNOTIFY - добавь свой ID в resource.h
Далее добавь в прогу ф-цию void-типа
Код

OnIconNotify(WPARAM wp, LPARAM lp)

В ней реализация обработки кликов на иконке:
Код

if (lp == 514)
{ // левый клик мышей - скрываем \ показываем главное окно
if(ShowMainWindow == 0)
{ // значит отображаем окно
 if(HideToTray == 1)
 {
  ::ShowWindow(m_hWnd, SW_SHOWNORMAL);
  ::SetWindowPos(m_hWnd, HWND_TOPMOST, NULL, NULL, NULL,
    NULL, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
  ::SetWindowPos(m_hWnd, HWND_NOTOPMOST, NULL, NULL, NULL,
    NULL, SWP_NOSIZE | SWP_NOMOVE);
  ShowMainWindow = 1;
 }
 else
 {
  ::ShowWindow(m_hWnd, SW_SHOWNORMAL);
  ShowMainWindow = 1;
 }
}
else
{ // значит скрываем окно в SysTray
 if(HideToTray == 1)
 {
  ::ShowWindow(m_hWnd, SW_HIDE);
  ShowMainWindow = 0;
 }
 else
 {
  ::ShowWindow(m_hWnd, SW_MINIMIZE);
  ShowMainWindow = 0;
 }
}
}
else
if (lp == 517)
{ // правый клик мышей - выводим меню

}

И на последок в OnDestroy():
Код

// удаляю иконку из SysTray при завершении приложения
NOTIFYICONDATA nf;
nf.hWnd = m_hWnd;
nf.uID = NULL;
nf.uFlags = NIF_ICON;
nf.uCallbackMessage = NULL;
nf.hIcon = NULL;
Shell_NotifyIcon(NIM_DELETE, &nf);

Код выдернут из проги, так что разберешся с переменными.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.