Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

System Tray
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2991
Страница 1 от 1

Автор:  Nikola Kirov [ Пон Окт 02, 2006 11:33 pm ]
Заглавие:  System Tray

Как става една програма да се направи да се минимизира не в таск бара а в system tray?
Работя с майкрософтското студио.
Че не се сещам изобщо откъде да го почна :)

Автор:  Predator_MF [ Вто Окт 03, 2006 1:00 am ]
Заглавие: 

Ползвай функцията Shell_NotifyIcon()

Автор:  Nikola Kirov [ Вто Окт 03, 2006 1:22 am ]
Заглавие: 

Нещо не схващам ква е идеята с това :cry:

Автор:  Predator_MF [ Вто Окт 03, 2006 2:33 am ]
Заглавие: 

Значи, за да направиш иконка в 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 по принцип и някой път меша синтаксиса му с този на студиото, все пак принципа е абсолютно същия.

Автор:  Nikola Kirov [ Вто Окт 03, 2006 2:43 am ]
Заглавие: 

Аха. Като че ли ми просветна :)

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

Автор:  Predator_MF [ Вто Окт 03, 2006 2:51 am ]
Заглавие: 

E това е само тая част за създаване на иконка в Tray-а, трябва да направиш Handler за кликания с мишка, изкачане на Popup Menu например и да триеш програмата от статусбара на Windows при Minimize, аз си играх две седмици да го напиша всичкото това в Delphi и оттогава го ползвам навсякъде където ми се наложи.

Автор:  darkyp [ Вто Окт 03, 2006 9:45 am ]
Заглавие: 

правил съм го на делфи, лесно става, ако искаш ще шерна. освен shell_notifyicon трябва да се скрие и application.handle - ако искаш да не ти остава в taskbar-а. на shell_notifyicon му казваш какво съобщение да ти праща и на кой прозорец - обикновено на глваната форма - и там си хващаш кликания и други...

Автор:  darkyp [ Вто Окт 03, 2006 9:50 am ]
Заглавие: 

и още нещо, забравих да допълня горе, когато explorer-а крашне обикновено си загубва трея. хубаво е да сложиш таймер, който например на всяка секунда да вика shell_notifyicon да се регва в трея.

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

Автор:  Nikola Kirov [ Вто Окт 03, 2006 11:21 am ]
Заглавие: 

Явно въпроса си иска повечко внимание. Ще го отваботя като си посвърша по спешната работа. Засега ще го оставя както е.
После ако имам някакви въпроси пак ще пиша.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/