CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Balonik z traya

Balonik z traya

dział ogólny

Balonik z traya

Nowy postprzez mko000 » wtorek, 12 stycznia 2010, 22:16

Witam. Jak zrobic taki balonik z traya co pisz np ze aktualizacje sa dostepne itp ?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Balonik z traya

Nowy postprzez mckri » wtorek, 12 stycznia 2010, 23:06

Czyzby w Builderze 2010 nie było komponentu TrayIcon?
W najprostrzy możliwy sposób mozna to zrobić za pomoca własnie tego komponentu:
Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TrayIcon1->Visible=true;
   TrayIcon1->BalloonHint="Tekst dymka";
   TrayIcon1->BalloonTitle="Tytuł dymka";
   TrayIcon1->BalloonFlags=bfInfo;
   TrayIcon1->ShowBalloonHint();
}
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » środa, 13 stycznia 2010, 11:33

To nie zadziała, przynajmniej w C++Builder 2010, u mnie z jakiegoś powodu nie działa, ale coś takiego z tworzeniem ikony zadziała:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void ShowBalloonTip(wchar_t *szMsg,
  wchar_t *szTitle, UINT uTimeout, DWORD dwInfoFlags, HANDLE hWnd)
{
TNotifyIconData Ficon;
Ficon.cbSize = DWORD(&(PNotifyIconData()->hBalloonIcon));
Ficon.hWnd = hWnd;
Ficon.uID = 0;
Ficon.uFlags = NIF_ICON | NIF_TIP | NIF_INFO;
Ficon.uCallbackMessage = WM_USER + 1;
wcscpy(Ficon.szTip, L"Tool Tip");
Ficon.hIcon = Application->Icon->Handle;
wcscpy(Ficon.szInfoTitle, szTitle);
wcscpy(Ficon.szInfo, szMsg);
Ficon.dwInfoFlags = NIIF_INFO;
Ficon.uTimeout = 10000;
Shell_NotifyIconW(NIM_ADD, &Ficon);
//Shell_NotifyIconW(NIM_DELETE, &Ficon);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
ShowBalloonTip(L"Treść komunikatu", L"Tytuł", 10000, NIIF_INFO, Handle);
}
//---------------------------------------------------------------------------


A jak to zrobić z komponentem TTrayIcon? Jeszcze nie wiem.



W C++ Builder na zakładce Additional znajdziesz fajny komponent TBalloonHint pozwalający wyświetlać balon w dowolnej pozycji. Ma też więcej możliwości, ale nie będę się o nim rozpisywał, gdyż sam go dobrze jeszcze nie znam. Po połączeniu z TImageList można nawet stworzyć w nim animowaną ikonę.

Sposób użycia:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
POINT pt;
GetCursorPos(&pt);
BalloonHint1->Title = "Tytuł";
BalloonHint1->Description = "Komunikat";
BalloonHint1->ImageIndex = 0;
BalloonHint1->ShowHint(pt);
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez Witold » środa, 13 stycznia 2010, 12:59

Cyfrowy Baron napisał(a):To nie zadziała, przynajmniej w C++Builder 2010, u mnie z jakiegoś powodu nie działa

Może chodzi o to http://qc.embarcadero.com/wc/qcmain.aspx?d=77561

W podanym tam workaround’cie ustawia się TNotifyIconData.cbSize zależnie od systemu.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » środa, 13 stycznia 2010, 13:12

Nie bardzo rozumiem jak miałbym to podłączyć pod komponent TrayIcon1.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez banita » środa, 13 stycznia 2010, 13:25

napisali ze problem rozwiazany w upodate 2. ja posiadam c++builder z update 5 (wszystkie jakie wyszly) i cos nie dziala ten balonik na win xp sp3
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows XPOpera

Re: Balonik z traya

Nowy postprzez Witold » środa, 13 stycznia 2010, 13:31

Cyfrowy Baron napisał(a):Nie bardzo rozumiem jak miałbym to podłączyć pod komponent TrayIcon1.


Poprawka jest w Update 4. TNotifyIconData.cbSize zależnie od systemu można ustawić dla tego kodu który podałeś ShowBalloonTip(), inaczej może nie działać na systemach innych niż XP (nie testowałem). Co do zastosowanie workaround’a to nie wiem jak to zrobić dla C++ Builder'a.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Balonik z traya

Nowy postprzez mckri » środa, 13 stycznia 2010, 17:04

Ciekawe rzeczy mówicie, bo to co napisałem działa w Builderze 2007 i 2009
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Balonik z traya

Nowy postprzez Pitek » środa, 13 stycznia 2010, 20:56

Przy okazji czy można zaaktualizować i jak tak to jak wersję Rad Studio 2010 ?
Bo jak ja zaaktualizuję to mi sie już nie chce otworzyć środowisko tylko jakaś strona www.
Ostatnio edytowano środa, 13 stycznia 2010, 22:23 przez Pitek, łącznie edytowano 1 raz
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPInternet Explorer 8

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » środa, 13 stycznia 2010, 21:32

Dokonałem aktualizacji, ale to niestety nic nie dało, błąd w bibliotece TTrayIcon wciąż występuje, ale to oczywiste, gdyż aktualizacja jak się okazuje nie aktualizuje bibliotek.

Ciekawe rzeczy mówicie, bo to co napisałem działa w Builderze 2007 i 2009


Gdyż ten błąd dotyczy komponentu TTrayIcon w środowisku Delphi i C++Builder 2010.



Update 2 dostępne jest tylko dla Delphi 2010.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » środa, 13 stycznia 2010, 23:09

Można by stworzyć własny działający komponent, czy też po prostu kod umieszczający ikonę w systray, ale jak podłączyć pod taką ikonę PopupMenu.

Próbowałem tak:

Unit1.h
Kod: Zaznacz cały
class TForm1 : public TForm
{
__published:   // IDE-managed Components
   TButton *Button1;
   TPopupMenu *PopupMenu1;
   TMenuItem *Zamknij1;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall Zamknij1Click(TObject *Sender);
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:   // User declarations
   TNotifyIconData Ficon;

   void TForm1::ShowBalloonTip(wchar_t *szMsg,
     wchar_t *szTitle, UINT uTimeout, DWORD dwInfoFlags);

   void __fastcall WMTrayNotify(TMessage &Msg);

public:      // User declarations
   __fastcall TForm1(TComponent* Owner);


BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER + 1001, TMessage, WMTrayNotify)
END_MESSAGE_MAP(TForm)
};


Unit1.cpp
Kod: Zaznacz cały
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{

   Ficon.cbSize = DWORD(&(PNotifyIconData()->hBalloonIcon));
   Ficon.hWnd = Handle;
   Ficon.uID = 0;
   Ficon.uFlags = NIF_ICON | NIF_TIP | NIF_INFO;
   Ficon.uCallbackMessage = WM_USER + 1001;
   Ficon.hIcon = Application->Icon->Handle;
   Shell_NotifyIconW(NIM_ADD, &Ficon);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMTrayNotify(TMessage &Msg)
{
   switch(Msg.LParam)
   {
      case WM_RBUTTONUP:
      {
         POINT WinPoint;
         GetCursorPos(&WinPoint);
            SetForegroundWindow(Handle);
         PopupMenu1->Popup(WinPoint.x,WinPoint.y);
         PostMessage(Handle, WM_NULL, 0,0);
         break;
        }
      case WM_LBUTTONDBLCLK:
      {
         Shell_NotifyIconW(NIM_DELETE, &Ficon);
         ShowWindow(Application->Handle, SW_SHOW);
         Visible = true;
         break;
        }
   }


}
//---------------------------------------------------------------------------
void TForm1::ShowBalloonTip(wchar_t *szMsg,
     wchar_t *szTitle, UINT uTimeout, DWORD dwInfoFlags)
{
   wcscpy(Ficon.szInfoTitle, szTitle);
   wcscpy(Ficon.szInfo, szMsg);
   Ficon.dwInfoFlags = dwInfoFlags;
   Ficon.uTimeout = uTimeout;
   Shell_NotifyIconW(NIM_MODIFY, &Ficon);
   //Shell_NotifyIconW(NIM_DELETE, &Ficon);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowBalloonTip(L"Komunikat", L"Tutuł", 10000, NIIF_WARNING);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zamknij1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Shell_NotifyIconW(NIM_DELETE, &Ficon);
}
//---------------------------------------------------------------------------


Ikona pojawia się, chmurka jest wyświetlana, ale nie działa PopupMenu, nie przechwytuje komunikatu USER + 1001, albo coś robię nie tak i komunikat nie dociera gdzie trzeba, nie wiem...

Jakiś pomysł? :((
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » środa, 13 stycznia 2010, 23:28

Dobrze! Już sobie z tym poradziłem. Źle poustawiałem TNotifyIconData, takie drobne przeoczenie, ale teraz już działa. W podanym niżej kodzie można wyświetlać BalloonHint w zdarzeniu OnClick przycisku Button1, można też przywołać prawym klawiszem myszy PopupMenu1 po kliknięciu na ikonę w SysTray. By PopupMenu działało, trzeba umieścić na formularzu obiekt PopupMenu1 i utworzyć w nim jakieś polecenie, w przykładzie jest tylko jedno polecenie Zamknij kończące pracę programu:

► Wyświetlanie ikonki w SysTray z PopupMenu 

No i obyło się bez komponentu... :w
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez mckri » piątek, 30 kwietnia 2010, 06:29

Baronie... czy dałoby radę to tego kodu, dołożyc obsługe kliknięcia w balonik?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Balonik z traya

Nowy postprzez Cyfrowy Baron » piątek, 30 kwietnia 2010, 18:48

Wystarczy dodać obsługę komunikatu odpowiedzialnego za kliknięcie w balonik NIN_BALLOONUSERCLICK i umieścić to w funkcji WMTrayNotify:

KOD cpp:     UKRYJ  
void __fastcall TForm1::WMTrayNotify(TMessage &Msg)
{
    switch(Msg.LParam)
    {
        case WM_RBUTTONUP:

            POINT WinPoint;
            GetCursorPos(&WinPoint);
            SetForegroundWindow(Handle);
            PopupMenu1->Popup(WinPoint.x,WinPoint.y);
            PostMessage(Handle, WM_NULL, 0,0);
            break;
        case WM_LBUTTONDBLCLK:
            ShowWindow(Application->Handle, SW_SHOW);
            Visible = true;
            break;
        case NIN_BALLOONUSERCLICK :
             ShowMessage("Kliknąłeś w balonik");
             break;
   }
}
 


Inne komunikaty:

NIN_BALLOONSHOW - komunikat wysyłany gdy balonik jest wyświetlany
NIN_BALLOONHIDE - komunikat wysyłany gdy balonik jest kasowany NIM_DELETE - Shell_NotifyIconW(NIM_MODIFY, &Ficon);
NIN_BALLOONTIMEOUT - komunikat wysyłany gdy mija czas wyświetlania balonika Ficon.uTimeout = int czas wyświetlania
NIN_BALLOONUSERCLICK - komunikat wysyłany gdy użytkownik kliknie w balonik
NIN_POPUPOPEN - komunikat wyświetlany gdy PopupMenu ikonki z zasobnika jest wyświetlane
NIN_POPUPCLOSE - komunikat wyświetlany gdy PopupMenu ikonki z zasobnika jest zamykane
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Balonik z traya

Nowy postprzez mckri » czwartek, 22 lipca 2010, 18:33

Witam.
Odgrzewam temat, gdyż napotkałem na problem wykorzystania tej metody generowania ikony tray.
Jeżeli mój program pracuje sobie w tle i 'siedzi' w tray, to w systemie Windows XP pojawia się problem z zamknięciem systemu operacyjnego. Nie jest możliwe zakończenie sesji użytkownika (na Vista i 7 ten problem nie występuje).
Zastosowałem ponizszy kod, który przechwytuje zakończenie sesji. Próbuję w nim zamknąć program. Program udaje się zamknąć podczas pierwszej próby wylogowania sesji uzytkownika w Windows, jednak samo zamknięcie sesji uzytkownika zostaje wstrzymane.
Dopiero drugie zamknięcie sesji (gdy wczesniej mój program został zamknięty), powoduje pomyslne zakończenie sesji użytkownika Windows.

unit1.hpp
KOD cpp:     UKRYJ  
void __fastcall WndProc(Messages::TMessage &Message);

unit1.cpp
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
           if(Message.Msg==WM_QUERYENDSESSION)
           {
                  Close();
           }
          TWinControl::WndProc(Message);
}


Sprawdziłem działanie mojego programu, który 'siedzi' w tray, na bardzo wielu stanowiskach z Windows XP i na każdym jest problem z zamknięciem sesji użytkownika.

Sądzę, że problem tkwi w samym kodzie generowania ikony tray przedstawiony w ostatnim poście przez Cyfrowego Barona. "Coś" trzyma ikonę w pamięci i blokuje poprawne zamknięcie Windows.
Czy znacie sposób na ominięcie tego problemu?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaInternet Explorer 8

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość