Min. do trayicon przy włączaniu programu

dział ogólny

Min. do trayicon przy włączaniu programu

Nowy postprzez Krzysiu555 » wtorek, 30 wrzeÅ›nia 2008, 16:47

Otóż efekt jaki chciałem uzyskać to to że program sam się minimalizuje do traya po włączeniu programu.

Zrobiłem tak:
1. Umieściłem na Form1 TrayIcon1 oraz ImageList1 (do niego wczytałem ikonę) i dałem właściwość TrayIcon1 icons na ImageList1, a właściwość IconIndex na 0 czyli na tę ikonę którą wczytałem do ImageList1
2. Na Form1 umieściłem Button1, którego zdarzenie onclick wygląda tak:
Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TrayIcon1->Visible = true;
TrayIcon1->Minimize();
}

3. Właściwość TrayIcon1 RestoreOn dałem "imDoubleClick". A zdarzenie OnRestore takie:
Kod: Zaznacz cały
void __fastcall TForm1::TrayIcon1Restore(TObject *Sender)
{
  TrayIcon1->Visible = false;
}

4. Gdy teraz wcisnę Run program się kompiluje i włącza. Wciskam Button1 i program znika z paska zadań, znika z ekranu i pojawia się w zasobniku (koło godziny) klikam dwukrotnie na ikonkę programu i program powraca. A więc wszystko działa tak jak powinno. Wszystko jest OK.

Teraz zajmuję się tym żeby program minimalizował się przy włączeniu jeśli taka jest wola użytkownika.

5. Na Form1 umieszczam CheckBox1 oraz Button2. Jeśli użytkownik chce aby program minimalizował się do tray po włączeniu zaznacza pole CheckBox1, jeśli nie to pozostawia je puste.
6. Gdy już zaznaczy (lub nie) klika przycisk Button2 aby zapisać swój wybór do pliku config.ini. Oto zdarzenie OnClick dla Button2:
Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TIniFile *PlikIni = new TIniFile("config.ini");

PlikIni->WriteBool("USTAWIENIA", "trayonstart", CheckBox1->Checked);

delete PlikIni;
}

7. Teraz dodałem takie coś co przy włączeniu programu zaznacza bądź nie wybór użytkownika zapisany w pliku config.ini:
Kod: Zaznacz cały
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
TIniFile *PlikIni = new TIniFile("config.ini");

CheckBox1->Checked = PlikIni->ReadBool("USTAWIENIA", "trayonstart", false);

delete PlikIni;
}

8. A teraz zdarzeniu OnShow dla Form1 dałem takie coś że jeśli jest zaznaczone pole CheckBox1 to program powinien się zminimalizować do tray'a:
Kod: Zaznacz cały
void __fastcall TForm1::FormShow(TObject *Sender)
{
if(CheckBox1->Checked == true){
TrayIcon1->Visible = true;
TrayIcon1->Minimize();
}
}


I tu właśnie rodzi się moje pytanie. Otóż gdy minimalizuję program do tray'a (tzn. znika on z ekranu oraz paska zadań, a pojawia się w zasobniku) poprzez wciśnięcie Button1 wszystko działa poprawnie.

Natomiast gdy chcę zrobić dokładnie to samo, wykonać ten sam kod w zdarzeniu OnShow program owszem znika z paska zadań owszem pojawia się w zasobniku ale cały czas pozostaje widoczny.

Dodam że dodanie ani Form1-Hide() ani Form1->Visible = false; nie działa - zwracany jest jakiś błąd.
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Cyfrowy Baron » wtorek, 30 wrzeÅ›nia 2008, 18:00

U mnie na ten przykład komponent TTrayIcon nie obsługuje funkcji Minimize, ale to nie problem, można skorzystać z funkcji Application->Minimize().

Przetestowałem to w zdarzeniu OnShow formularza i działa:

Kod: Zaznacz cały
void __fastcall TForm1::FormShow(TObject *Sender)
{
  if(CheckBox1->Checked == true)
  {
   Application->Minimize();
  }
}


Sugeruję ustawić właściwość Visible komponentu TrayIcon ustawić na true już w samym komponencie, nie wiem po co sterujesz tą właściwości za pomocą kodu, raz ustawiona zawsze będzie wyświetlać ikonkę w zasobniku, chyba, że chcesz po przywrócenia okna usunąć ją z zasobnika i wyświetlić na pasku.

Funkcje Application->Minimize() zminimalizuje program, ale niekoniecznie usunie go z paska zadań, nie wiem, gdyż jak wspomniałem u mnie ten komponent nie ma funkcji Minimize i prawdopodobnie ta funkcja ma wbudowaną funkcje usuwania programu z paska zadań, więc być może powinieneś połączyć ze sobą te funkcje:

Kod: Zaznacz cały
void __fastcall TForm1::FormShow(TObject *Sender)
{
  if(CheckBox1->Checked == true)
  {
    TrayIcon1->Visible = true;
    TrayIcon1->Minimize();
    Application->Minimize();
  }
}


Do przywracania programu możesz użyć funkcji Application->Restore();

Czasami przydaje się przywołanie okna na pierwszy plan po jego przywróceniu:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void BringWindowToFront(HWND hWnd)
{
bool Result;
DWORD ForegroundWindowThreadID;
DWORD WindowThreadID;
if(hWnd != GetForegroundWindow())
{
  ForegroundWindowThreadID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
  WindowThreadID = GetWindowThreadProcessId(hWnd, NULL);
  if(ForegroundWindowThreadID != WindowThreadID)
  {
   AttachThreadInput(ForegroundWindowThreadID, WindowThreadID, true);
   SetForegroundWindow(hWnd);
   AttachThreadInput(ForegroundWindowThreadID, WindowThreadID, false);
  }
  else
   SetForegroundWindow(hWnd);
  ShowWindow(hWnd, SW_RESTORE);
}
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
Application->Minimize()
ShowWindow(Application->Handle, SW_HIDE); // tej komunikatu używam, żeby usunąć ikonę z paska zadań
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
Application->Restore();

ShowWindow(Application->Handle, SW_HIDE); // tej komunikatu używam, żeby usunąć ikonę z paska zadań

BringWindowToFront(Application->Handle); // zauważ, że wysyłam komunikat nie do okna programu, lecz do całej aplikacji
}
//---------------------------------------------------------------------------
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
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Krzysiu555 » Å›roda, 8 października 2008, 16:38

dzięki za pomoc, chociaż nie rozwiązała mojego problemu.
znalazłem w necie że w zdarzeniu OnShow i onHide nie można dla głównego okna programu użuwać ani Visible = false; ani Hide(); ani Minimize(); dlatego program nie znikał
a rozwiązałem to tak że onShow uruchamia Timer2 a ten z kolei chowa program poleceniem Minimize();
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Cyfrowy Baron » Å›roda, 8 października 2008, 18:16

No nie wiem... kod który zaprezentowałem u mnie działa prawidłowo...
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
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Krzysiu555 » Å›roda, 8 października 2008, 18:21

być może zależy to od wersji BCB
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Cyfrowy Baron » czwartek, 9 października 2008, 09:32

Czy to znaczy, że funkcja Application->Minimize(); w zdarzeniu OnShow nie minimalizuje okna w Ciebie?
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
    NieznanyNieznana

Re: Min. do trayicon przy włączaniu programu

Nowy postprzez Krzysiu555 » czwartek, 9 października 2008, 14:49

Tak
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana


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

cron