cześć.
Chciałem proić o pomoc.
Dawno nie pisałem nic w Borland Builder C++ a potrzebuję banalnie prosty program, który umieszcza swoją ikonę w Systray'u i po kliknięciu pokazuje się.
Program ma być banalnie prosty bo założenie jest takie aby odczas uruchamiania pokazywał się w Tray'u i jak pisałem po kliknięciu w ikone pokazywał się a ma służyć do automatycznego zamykania WinXp.
Prosze o pomoc bo niezabardzo więm jak się do tego zabrać zwłaszcza obsługa tray'a.
Bardzo bardzo dawno tego nie robiłem i mam pewien kłopot w tym.
wskazówki do napisania prog. w Borland C++
Trzy lineczki do poczytania do poduszki, czy jak tam lubisz....
o systemowej strukturze NOTIFYICONDATA, funkcji Shell_NotifyIcon() oraz takie ogólne...
A w załączniku programik demo...wydziergany w Builder 6 Personal
Jak go odpalisz, to on sobie zainstaluje ikonkę na systemowym podajniku,
jak ją kilkniesz lewą myszą to okno się schowa, a ikonka się zmieni
jak klikniesz ponownie to wróci jak było wcześniej, a jak zamkniesz program to ikonka
sie odinstaluje z systraya...
no to miłego dziubania,
pa,
tasza
- Załączniki
-
- bcb6_systray.zip
- (29.74 KiB) Pobrany 874 razy
oj...no wiesz....ale dzięki za miłe słowa....
i sorki, że teraz dopiero a nie wieczorem, przy Elportalu miałam ubaw
w załączniku masz odpowiednio skomentowane pliki main.c oraz main.h
to co dopisałam ręcznie jest pomiedzy //++tasza....//--tasza
szablony handlerów zdarzeń OnCreate(), OnClose() wygenerował automat,
treść jest moja... OnSystemTrayMessage() napisany od zera....
aha, może kilka słów...
tak jak masz to napisane w main.h - powiązanie własnych komunikatów z metodami
do obsługi jest w takim super-makrze MESSAGE_MAP
tę mape deklaruje się wewnątrz klasy, kompilator sobie te makra rozwikła na odpowiedni kod w C++
ogólna zasada jest taka:
definiujesz własny identyfikator meldunku np.: MSG_TRAYICONCLICKED
a potem kojarzysz go z handlerem...
handler musi być zadeklarowany tak:
w msg dostaniesz referencję do obiektu klasy TMessage, w nim będzie zestaw
informacji właściwy dla danej akcji systemowej....
uff, no to wszystko chyba...
jak coś nie halo - pytaj proszę...
pozdrawiam,
tasza
i sorki, że teraz dopiero a nie wieczorem, przy Elportalu miałam ubaw
w załączniku masz odpowiednio skomentowane pliki main.c oraz main.h
to co dopisałam ręcznie jest pomiedzy //++tasza....//--tasza
szablony handlerów zdarzeń OnCreate(), OnClose() wygenerował automat,
treść jest moja... OnSystemTrayMessage() napisany od zera....
aha, może kilka słów...
tak jak masz to napisane w main.h - powiązanie własnych komunikatów z metodami
do obsługi jest w takim super-makrze MESSAGE_MAP
tę mape deklaruje się wewnątrz klasy, kompilator sobie te makra rozwikła na odpowiedni kod w C++
ogólna zasada jest taka:
definiujesz własny identyfikator meldunku np.: MSG_TRAYICONCLICKED
a potem kojarzysz go z handlerem...
Kod: Zaznacz cały
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER( identyfikator_komunikatu, TMessage, nazwa_handlera)
END_MESSAGE_MAP(TForm)
Kod: Zaznacz cały
void __fastcall nazwa_handlera ( TMessage &msg ) {
}
informacji właściwy dla danej akcji systemowej....
uff, no to wszystko chyba...
jak coś nie halo - pytaj proszę...
pozdrawiam,
tasza
- Załączniki
-
- main_c_h.zip
- (2.64 KiB) Pobrany 784 razy
Dzięki za odpowiedź.
Z miłą chęcią bym pytał ale nie mogę się ośmielić, ponieważ bym Cię chyba zameczył pytaniami.
U mnie jest tak że im w coś barzdiej sie wgłębiam tym mam więcej pytań wątpliwości, niejasności, które sie mnożą i mnożą. A jak sam próbuję szukać odpowiedzi w necie to czasami trafiam na takie sprzeczności, że coraz bardziej wtedy wariuję i mam juz taki mętlik że szkoda gadać.
Z miłą chęcią bym pytał ale nie mogę się ośmielić, ponieważ bym Cię chyba zameczył pytaniami.
U mnie jest tak że im w coś barzdiej sie wgłębiam tym mam więcej pytań wątpliwości, niejasności, które sie mnożą i mnożą. A jak sam próbuję szukać odpowiedzi w necie to czasami trafiam na takie sprzeczności, że coraz bardziej wtedy wariuję i mam juz taki mętlik że szkoda gadać.
To może na początek coś niby prostego.
ak to jest z używaniem funkcji WinAPI w BCB. Pytam o to ponieważ pisząc Visual Basicu 6 każdą funkcę API musiałem zadeklarować w sposób:
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
A dlaczego w BCB nie robi sie tego. Przecież to też w pewnym sensie korzystanie z bibliotek dll Windowsa.
NIe załącza się też czasami pliku shellapi.h
Dla przykładu funkcja API: GetCursorPos W VB6 aby z tego skorzystać trzeba zadeklarować ją jak wyżej, a dlaczego w BCB tak nie jest
ak to jest z używaniem funkcji WinAPI w BCB. Pytam o to ponieważ pisząc Visual Basicu 6 każdą funkcę API musiałem zadeklarować w sposób:
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
A dlaczego w BCB nie robi sie tego. Przecież to też w pewnym sensie korzystanie z bibliotek dll Windowsa.
NIe załącza się też czasami pliku shellapi.h
Dla przykładu funkcja API: GetCursorPos W VB6 aby z tego skorzystać trzeba zadeklarować ją jak wyżej, a dlaczego w BCB tak nie jest
no faktycznie, niby proste ale....
Utwórz proszę nowy projekt, z jedną formą i jednym na niej guzikiem,
w handlerze Button1Click() zawołaj funkcję Win32 API o nazwie MessageBox()
Jak już się nacieszysz tym messagebox-em to ustaw się kursorem
na linii #include <vcl.h> i wtedy PKM* potem "Open file at cursor"...
w vcl.h znajdź linię #include <basepch0.h> i to samo
potem #include <system.hpp> (odpowiednik system.pas z Delphi
)
a potem #include <sysmac.h>, #include <windows.h>, #include <winuser.h>
w ten sposób otwierając kolejne wołające się pliki nagłówkowe doklikasz się
do miejsca gdzie siedzi sobie funkcja MessageBox (A to zwykła, W - to dla unicode)
a teraz zerknij na zrzutkę ekranu z załącznika...
wywołując polecenie 'Project Manager' z głównego menu 'View'
możesz sobie porozwijać to drzewko i tam znajdziesz całe stadko
plików nagłówkowych, które gdzieś tam po drodze się zainkludowały...
i ShellApi i WinUser i wiele wiele innych...
tasza
-----------------
* - PKM - prawy klawisz myszy
Utwórz proszę nowy projekt, z jedną formą i jednym na niej guzikiem,
w handlerze Button1Click() zawołaj funkcję Win32 API o nazwie MessageBox()
Kod: Zaznacz cały
::MessageBox ( this->Handle, "komunikat", "tytuł", MB_ICONEXCLAMATION );
na linii #include <vcl.h> i wtedy PKM* potem "Open file at cursor"...
w vcl.h znajdź linię #include <basepch0.h> i to samo
potem #include <system.hpp> (odpowiednik system.pas z Delphi
a potem #include <sysmac.h>, #include <windows.h>, #include <winuser.h>
w ten sposób otwierając kolejne wołające się pliki nagłówkowe doklikasz się
do miejsca gdzie siedzi sobie funkcja MessageBox (A to zwykła, W - to dla unicode)
Kod: Zaznacz cały
WINUSERAPI int WINAPI MessageBoxA( IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType);
wywołując polecenie 'Project Manager' z głównego menu 'View'
możesz sobie porozwijać to drzewko i tam znajdziesz całe stadko
plików nagłówkowych, które gdzieś tam po drodze się zainkludowały...
i ShellApi i WinUser i wiele wiele innych...
tasza
-----------------
* - PKM - prawy klawisz myszy
- Załączniki
-
- gdzie_jest_MessageBox.GIF
- (43.35 KiB) Pobrany 728 razy