CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Minimalizacja okna i TrayIcon

Minimalizacja okna i TrayIcon

dział ogólny

Minimalizacja okna i TrayIcon

Nowy postprzez duf » czwartek, 28 stycznia 2010, 13:41

Szukam sposobu na umieszczenie aplikacji w trayu po wcisnięciu minimalizacji okna. Jakie zdarzenie zachodzi w formie w chwili wciśnięcia minimalizacji formy ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Corvis » czwartek, 28 stycznia 2010, 13:54

1) Kładziesz na formę : TTrayIcon oraz ApplicationEvent

2) Chowanie okna ( można inczej to zrobić ) OnMinimize w ApplicationEvent

Kod: Zaznacz cały
void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender) {
    Form1->Hide();
    TrayIcon1->Visible=true;
}


3) Pokazywanie okna po kliknięci w ikonę traya OnClick w TTrayIcon

Kod: Zaznacz cały
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
    Form1->Show();
    TrayIcon1->Visible=false;
}


pozdro,
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Cyfrowy Baron » czwartek, 28 stycznia 2010, 14:20

Jeżeli używasz środowiska C++Builder w wersji 2006 lub nowszej to musisz jeszcze w pliku projektu np. Project1.cpp usunąć tą linię:

Kod: Zaznacz cały
SetApplicationMainFormOnTaskBar(Application, true);

lub to (zależy od wersji środowiska):
Kod: Zaznacz cały
Application->MainFormOnTaskBar = true;


lub ustawić to na false:

Kod: Zaznacz cały
SetApplicationMainFormOnTaskBar(Application, false);

Kod: Zaznacz cały
Application->MainFormOnTaskBar = false;




Ten temat był niedawno obszernie opisywany na tym forum w tym wątku: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=810



Na samej górze forum masz takie pole Szukaj... można się nim posłużyć do wyszukiwania odpowiedzi.
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: Minimalizacja okna i TrayIcon

Nowy postprzez ludwik07 » środa, 16 marca 2011, 23:50

A jak innaczej można ustawić TrayIcon tak żeby był widoczny tylko gdy aplikacja jest zminimalizowana? Bo mi jakieś smieszne błędy wyskakują typu "Source File not Found: trayicon.cpp" lub "Cannot Create System Shell Notification Icon".
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Cyfrowy Baron » czwartek, 17 marca 2011, 10:22

Skoro Tobie to nie działa, to znaczy, że coś robisz źle, gdyż używałem kiedyś środowiska C++Builder 6 i nie było z tym problemów.
Jeżeli nie możesz użyć komponentu, to musisz sam wszystko oprogramować. Obsługa ikonki w zasobniku systemowym z BalloonHint została opisana szczegółowo w tym wątku: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=815&p=5065&hilitt#p5059

Podam kompletny kod:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <AppEvnts.hpp>
//---------------------------------------------------------------------------

#define WM_SYSTEM_TRAY_NOTIFY (WM_USER + 1)

class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TPopupMenu *PopupMenu1;
        TMenuItem *Zamknij1;
        TApplicationEvents *ApplicationEvents1;
        TMenuItem *TestPopupMenu1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Zamknij1Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall ApplicationEvents1Minimize(TObject *Sender);
        void __fastcall ApplicationEvents1Restore(TObject *Sender);
        void __fastcall FormShow(TObject *Sender);
        void __fastcall TestPopupMenu1Click(TObject *Sender);
        void __fastcall FormPaint(TObject *Sender);
private:        // User declarations

        TNotifyIconDataA Ficon;

        void ShowBalloonTip(char *szMsg,
          char *szTitle, UINT uTimeout, DWORD dwInfoFlags);
    void ShowHint(char *szHint, UINT uTimeout);

        void __fastcall WMTrayNotify(TMessage &Msg);

        bool winState;

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

 BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_SYSTEM_TRAY_NOTIFY, TMessage, WMTrayNotify)
 END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        Ficon.cbSize = DWORD(&(PNotifyIconData()->hBalloonIcon));
        Ficon.hWnd = AllocateHWnd(WMTrayNotify);
        Ficon.uID = 0;
        Ficon.uFlags = NIF_ICON | NIF_TIP | NIF_INFO | NIF_MESSAGE;
        Ficon.uCallbackMessage = WM_SYSTEM_TRAY_NOTIFY;
        Ficon.hIcon = Application->Icon->Handle;
        Shell_NotifyIconA(NIM_ADD, &Ficon);
}

/* obsługa komunikatów */
//---------------------------------------------------------------------------
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:
                {
                  if(winState) Application->Restore();
                  else Application->Minimize();
          Visible = true;
          break;
        }
        case WM_MOUSEMOVE:
                {
         ShowHint("tytuł komunikatu", 10000);
                 break;
        }
        }
}
//---------------------------------------------------------------------------
void TForm1::ShowHint(char *szHint, UINT uTimeout)
{
                 strcpy( Ficon.szTip, szHint);
                 Ficon.uTimeout = uTimeout;
                 Shell_NotifyIconA(NIM_MODIFY, &Ficon);
}
//---------------------------------------------------------------------------
void TForm1::ShowBalloonTip(char *szMsg,
          char *szTitle, UINT uTimeout, DWORD dwInfoFlags)
{
        strcpy(Ficon.szInfoTitle, szTitle);
        strcpy(Ficon.szInfo, szMsg);
        Ficon.dwInfoFlags = dwInfoFlags;
        Ficon.uTimeout = uTimeout;
        Shell_NotifyIconA(NIM_MODIFY, &Ficon);
}
//---------------------------------------------------------------------------

/* zdarzenie przycisku TButton */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ShowBalloonTip("Komunikat", "Tutuł", 10000, NIIF_WARNING);
}
//---------------------------------------------------------------------------

/* zdarzenia Formularza */
void __fastcall TForm1::FormShow(TObject *Sender)
{
 ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 Shell_NotifyIconA(NIM_DELETE, &Ficon);
}
//---------------------------------------------------------------------------

/* Zdarzenia komponentu TApplicationEvents */
void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender)
{
 winState = true;
 ShowWindow(Application->Handle, SW_HIDE);
 SetForegroundWindow(Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Restore(TObject *Sender)
{
 winState = false;
 ShowWindow(Application->Handle, SW_HIDE);
 SetForegroundWindow(Handle);
}
//---------------------------------------------------------------------------

/* zdarzenia TPopupMenu - podłączonego pod ikonę SysTray */
void __fastcall TForm1::TestPopupMenu1Click(TObject *Sender)
{
 ShowMessage("Kliknięto w menu kontekstowe ikony w zasobniku systemowym");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zamknij1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------


Podany wyżej kod nie korzysta z komponentu TTrayIcon. Należy pamiętać o zmianie w pliku projektu: Application->MainFormOnTaskBar = false;, lub podobnie, zależy od wersji środowiska.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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: Minimalizacja okna i TrayIcon

Nowy postprzez ludwik07 » czwartek, 17 marca 2011, 11:53

Hmmm, może mi czegoś brakuje? Bo wcześniej mi to działało (wtedy chyba jakiś warunek zrobiłem), poprostu dodałem TrayIcon i warunek, że jeśli okno jest widoczne to ikona ma być nie widoczna a jeśli okno zminimalizowane to ikona ma być widoczna ale musiałem to przypadkowo usunąć -.- i teraz problem z tym mam. Teraz to wygląda jakby ikona potrzebowała czegoś co ją poinforumuje o tym czy okno jest zminimalizowane czy nie. Odrazu dodam, że te błędy wyskakują mi wtedy gdy ustawię Visible TrayIcon na true przy minimalizowaniu i false przy przywracaniu.

Spróbuje sobie zrobić to od nowa na nowym projekcie.

A jeśli chodzi o samo działanie ikony to ona jest widoczna cały czas i działa a mi chodzi o to żeby nie była widoczna cały czas tylko gdy okno jest zminimalizowane ;p (no chyba że coś nie doczytałem co jest bardzo możliwe)

A i gdy naciskam ShowBallonTip w tym przykładowym programie to nic sie nie dzieje u mnie ;D
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Cyfrowy Baron » czwartek, 17 marca 2011, 12:26

ludwik07 napisał(a):A i gdy naciskam ShowBallonTip w tym przykładowym programie to nic sie nie dzieje u mnie ;D


Musisz mieć włączone w systemie pokazywanie Balloon'ów. Ja mam np. wyłączone, dlatego wciśnięcie przycisku też nic nie daje.



ludwik07 napisał(a):Teraz to wygląda jakby ikona potrzebowała czegoś co ją poinforumuje o tym czy okno jest zminimalizowane czy nie.


W jaki sposób przechwytujesz komunikaty o minimalizacji i przywróceniu okna?

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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: Minimalizacja okna i TrayIcon

Nowy postprzez ludwik07 » czwartek, 17 marca 2011, 12:53

Cyfrowy Baron napisał(a):W jaki sposób przechwytujesz komunikaty o minimalizacji i przywróceniu okna?

Trudne pytanie :/ jeśli stworzenie warunku lub użycie ApplicationEvents się do tego nie zalicza to w żadne sposób.
I pewnie tego mi brakuje ;D

Ewentualnie może jeszcze innaczej uda mi się rozwiązać ten problem, jak jeszcze TrayIcon mi działał tak jak chce to wysłałem koledze ten projekt wiec jeśli jeszcze go ma to będę mogł sprawdzić cóż takiego zrobiłem żeby mi to działało.
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Cyfrowy Baron » czwartek, 17 marca 2011, 13:22

Chodziło mi o to, żebyś pokazał tutaj swój kod.
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: Minimalizacja okna i TrayIcon

Nowy postprzez ludwik07 » czwartek, 17 marca 2011, 19:58

Próbowałem coś typu (i inne podobne kombinacje ;D na ukrywanie formy coś takiego działa więc uznałem, że i tu powinno):
KOD cpp:     UKRYJ  
if (Form1->Visible)
TrayIcon1->Visible=false;
else
TrayIcon1->Visible=true;

Ale nie działało ;D no i jeszcze to co jest w 2 poście tego tematu co spełniło moje oczekiwania z tym, że można było zminimalizować aplikację tylko raz :/ No a jakie cudo jeszcze wczesniej miałem to Ci niestety narazie nie powiem.

Sorry, że tak późno odpisuję ale znów walczyłem z monitorem ;D (tym razem innym)
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Minimalizacja okna i TrayIcon

Nowy postprzez Cyfrowy Baron » czwartek, 17 marca 2011, 20:48

Nie no człowieku! :twisted: Przecież nie umieszczasz tego kodu w próżni lecz wywołujesz w jakimś zdarzeniu. Pokaż raczej cały kod.

To co widzę nie ma raczej sensu. Posłuż się komponentem TApplicationEvents :

KOD cpp:     UKRYJ  
void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender) /* OnMinimize */
{
 ShowWindow(Application->Handle, SW_HIDE);
 SetForegroundWindow(Handle);
 TrayIcon1->Visible = true;
}
//--------------------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Restore(TObject *Sender) /* OnRestore */
{
 ShowWindow(Application->Handle, SW_SHOW);
 SetForegroundWindow(Handle);
}
//--------------------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender) /* TrayIcon - OnClick lub OnDbClick */
{
  Application->Restore();
  TrayIcon1->Visible = false;
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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: Minimalizacja okna i TrayIcon

Nowy postprzez ludwik07 » czwartek, 17 marca 2011, 21:21

Ahhh sorry :? :? już wiem w czym tkwił problem, na tym pasku po lewej stronie miałem Visible ustawione na true i w FormCreate miałem jedną zabłąkaną linijkę w której też było ustawione na true i przez to wyskakiwały te błędy nawet przy tym kodzie od Ciebie.

Naprawdę przepraszam za kłopot :? będę musiał uważniej przeglądać wszystko :/
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera


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 5 gości