Отговори на тема  [ 9 мнения ] 
System Tray 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение System Tray
Как става една програма да се направи да се минимизира не в таск бара а в system tray?
Работя с майкрософтското студио.
Че не се сещам изобщо откъде да го почна :)


Пон Окт 02, 2006 11:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ползвай функцията Shell_NotifyIcon()


Вто Окт 03, 2006 1:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Нещо не схващам ква е идеята с това :cry:


Вто Окт 03, 2006 1:22 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Значи, за да направиш иконка в System Tray използваш функцията:

Код:
Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpdata)


вадя ти от MSDN
dwMessage е командата, която ще се изпълни, възможни са три стойности:
NIM_ADD: добавя иконка в System Tray
NIM_DELETE: изтрива иконка в System Tray
NIM_MODIFY: променя иконка в System Tray
Втория параметър ти е указател към NOTIFYICONDATA структура, в която стои самата иконка както и няколко параметъра за извежданата иконка.
Код:
typedef struct _NOTIFYICONDATA {
    DWORD cbSize;
    HWND hWnd;
    UINT uID;
    UINT uFlags;
    UINT uCallbackMessage;
    HICON hIcon;
    TCHAR szTip[64];
    DWORD dwState;
    DWORD dwStateMask;
    TCHAR szInfo[256];
    union {
        UINT uTimeout;
        UINT uVersion;
    };
    TCHAR szInfoTitle[64];
    DWORD dwInfoFlags;
    GUID guidItem;
    HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

За изчертаването на иконката са необходими следните параметри (само на тези ще се спра щото става дълга и широка):
cbSize: Размера на структурата
hWnd: Handle на прозореца, който ще приема съобщенията
uId: Това е ID номер на иконката в статуса
uFlags: Значи, тук просто задаваш комбинация от следните стойности в зависимост от това какво точно ще правиш с иконката:

NIF_ICON: Passing this flag indicates that the value for the
hIcon will be the icon that appears in the taskbar status area.

NIF_MESSAGE: Passing this flag indicates that the uCallBackMessage
value will be used as the callback message.

NIF_TIP: Passing this flag indicates that the value of szTip will
be used as the ToolTip for the icon in the taskbar status area.
uCallBackMessage: Identifier of the notification message sent to the
window that is used to receive the messages.
hIcon: Handle на иконката (самата картинка) която ще се изчертае в tray-a
szTip: Стринг който ще се използва за "Tooltip" на иконката

Накратко (то стана дълго и подробно де :) ) правиш обект тип NOTIFYICONDATA, при създаване на главната форма на проекта ти викаш функцията Shell_NotifyIcon(NIM_ADD, *MyNotifyIconData). При унищожаване на формата викаш същата функция само, че с параметър NIM_DELETE.

Прост пример:
Код:
PNotifyIconData MyData;

void MyApp::OnCreate(...){
MyData->hIcon = <хендъл от иконка в resource file например>;
MyData->cbSize = SizeOf(MyData);
StrCopy(MyData->szTip,'My First Tray Icon', 18);
MyData->uFlags = NIF_ICON | NIF_MESSAGE;
MyData->hWnd = MyAppMainWindowHandle;
MyData-> uCallBackMessage = MyOwnMessage; //някакво дефинирано от теб съобщение което ще се праща към прозореца който си подал в hWnd, изпраща се при движение на мишката в иконката или цъкане с бутон върху нея и пр.

Shell_NotifyIcon(NIM_ADD, *MyData);
}


От теб остава да си дефинираш съобщение което ще се се подава към програмата ти при поява на движение върху иконката и там да хващаш командите пратени от иконката (WM_LBUTTONDOWN, WM_MOUSEMOVE и пр.). Извинявай ако в кода откриеш грешки, ползвам Delphi по принцип и някой път меша синтаксиса му с този на студиото, все пак принципа е абсолютно същия.


Вто Окт 03, 2006 2:33 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Аха. Като че ли ми просветна :)

Мерси за дългото изложение.
Явно ще трябва да отделя повечко време за това че да си го организирам като хората.


Вто Окт 03, 2006 2:43 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
E това е само тая част за създаване на иконка в Tray-а, трябва да направиш Handler за кликания с мишка, изкачане на Popup Menu например и да триеш програмата от статусбара на Windows при Minimize, аз си играх две седмици да го напиша всичкото това в Delphi и оттогава го ползвам навсякъде където ми се наложи.


Вто Окт 03, 2006 2:51 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Дек 12, 2005 6:03 pm
Мнения: 263
Местоположение: София
Мнение 
правил съм го на делфи, лесно става, ако искаш ще шерна. освен shell_notifyicon трябва да се скрие и application.handle - ако искаш да не ти остава в taskbar-а. на shell_notifyicon му казваш какво съобщение да ти праща и на кой прозорец - обикновено на глваната форма - и там си хващаш кликания и други...


Вто Окт 03, 2006 9:45 am
Профил ICQ YIM
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Дек 12, 2005 6:03 pm
Мнения: 263
Местоположение: София
Мнение 
и още нещо, забравих да допълня горе, когато explorer-а крашне обикновено си загубва трея. хубаво е да сложиш таймер, който например на всяка секунда да вика shell_notifyicon да се регва в трея.

аа, сега се сещам и още един проблем, вероятно за делфи само важи защото аз там витая. та проблема (за който разбира се има решение което мисля съм отиграл) е при shutdown / logoff, че трябва да си обработиш събитието сам (т.е. не се отработва автоматично от делфи) и да си затвориш програмата, иначе windows няма да се shutdown / logoff.


Вто Окт 03, 2006 9:50 am
Профил ICQ YIM
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Явно въпроса си иска повечко внимание. Ще го отваботя като си посвърша по спешната работа. Засега ще го оставя както е.
После ако имам някакви въпроси пак ще пиша.


Вто Окт 03, 2006 11:21 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 11 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни