CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Forma bez focusa

Forma bez focusa

dział ogólny

Forma bez focusa

Postprzez sebaskow » piątek, 28 czerwca 2013, 10:26

Jak otworzyć nowe okno:

Kod: Zaznacz cały
Form2->Show()


aby Form2 nie przejęło focusa. ?

Zamierzenie jest takie:
Użytkownik wykonuje jakieś operacje na Form1, wprowadza teks, rozwija listy ComboBox itp... i nagle pod wpływem Timer otwiera się w którymś momencie Form2, jak sprawić aby Form2 nie przejęło focusa podczas pojawiania się. Form2 jest tylko komunikatem który ma się pojawiać.

Z góry dziękuję.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Forma bez focusa

Postprzez Cyfrowy Baron » piątek, 28 czerwca 2013, 23:38

Focus musi zostać przejęty przez przywołane okno by to nie "zapodziało się gdzieś". Możesz po przywołaniu nowego okna przerzucić focus ponownie na okno główne:

KOD cpp:     UKRYJ  
Form2->Show();
this->SetFocus();
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: Forma bez focusa

Postprzez sebaskow » piątek, 28 czerwca 2013, 23:45

Ale ja nie potrafię określić które okno posiadało fokus przed wywołaniem tego nazwijmy to: Form2 ponieważ Form2 jest wywoływane przy pomocy timera.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Forma bez focusa

Postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 09:43

Trzeba zapamiętać Focus przed wywołaniem okna i przywrócić go po jego wywołaniu.

KOD cpp:     UKRYJ  
 HWND hWnd = GetFocus();
 Form2->Show();
 if(hWnd == NULL) { ShowMessage("Brak uchwytu"); return; }
 ::SetFocus(hWnd);
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: Forma bez focusa

Postprzez sebaskow » sobota, 29 czerwca 2013, 16:34

A da się zrobić tak aby otwierane okno nie przejmowało fokusa wogóle ?
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Forma bez focusa

Postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 16:38

Z tego co wiem to się nie da!
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: Forma bez focusa

Postprzez Cyfrowy Baron » niedziela, 30 czerwca 2013, 11:51

Tak wogóle to Ty chcesz wyświetlić okno, czy raczej jakiś komunikat na oknie?
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: Forma bez focusa

Postprzez Corvis » poniedziałek, 1 lipca 2013, 10:44

sebaskow napisał(a):A da się zrobić tak aby otwierane okno nie przejmowało fokusa wogóle ?


A poco tak robić ? :P
"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 7Chrome

Re: Forma bez focusa

Postprzez sebaskow » poniedziałek, 1 lipca 2013, 19:37

To ma być komunikat który się pojawia w formie chmurki.
Niestety chmurka jest zrobiona przy pomocy klasy okna windows.
To jest okienko które się pojawia na kilka sekund i znika.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Forma bez focusa

Postprzez Cyfrowy Baron » poniedziałek, 1 lipca 2013, 20:18

W tym właśnie rzecz, że jeśli trzeba wyświetlić jakiś komunikat bez utracenia focusa to najprościej jest posłużyć się jakimś dymkiem. Można w takim przypadku skorzystać np. z komponentu TBallonHint z zakładki Additional:

KOD cpp:     UKRYJ  
 BalloonHint1->Title = "Tytuł komunikatu";
 BalloonHint1->Description = "Treść Komunikatu";

 BalloonHint1->HideAfter = 5000; /* ukryj komunikat po 5 sekundach */

 TPoint CurrPt;
 GetCursorPos(&CurrPt);  /* pobiera pozycję kursora   */

 BalloonHint1->ShowHint(CurrPt);


Znacznie większe możliwości daje komponent TAdvSmartMessageBox, ale pochodzi z paczki płatnych komponentów TMS Component Pack.

Możesz też skorzystać z tej porady: Zmiana sposobu wyświetlania podpowiedzi w chmurkach (właściwość HINT). w połączeniu z tą Zmiana wyglądu dymka podpowiedzi (HINT)
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: Forma bez focusa

Postprzez Cyfrowy Baron » wtorek, 2 lipca 2013, 17:50

Przypomniałem sobie jak można przywołać okno bez aktywacji:

KOD cpp:     UKRYJ  
ShowWindow(Form2->Handle, SW_SHOWNOACTIVATE);


Jednak tak przywołanego okna nie da się zamknąć poleceniem Close() (wyskoczy błąd), ani też klikając na krzyżyk. Można takie okno co najwyżej ukryć. Jeżeli chcemy, żeby okno (tutaj Form2) chowało się po kliknięciu na krzyżyk zamknięcia to trzeba w zdarzeniu OnClose dla tego formularza dodać taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
 ShowWindow(this->Handle, SW_HIDE);
}


W takiej sytuacji znacznie lepiej jest tworzyć takie okno komunikatu dynamicznie, czyli tworzysz sobie formularz normalnie jak każdy, a następnie wchodzisz w opcje projektu (menu: Project -> Options) do sekcji Forms i przenosisz takie okno z sekcji Auto-create forms do sekcji Available forms:

forms.png


Trzeba pamiętać by w takim oknie komunikatu (tutaj Form3) w zdarzeniu OnClose dać kod niszczący okno:

KOD cpp:     UKRYJ  
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
 Action = caFree;
}


Wywołanie takiego okna komunikatu jest już banalnie proste:

KOD cpp:     UKRYJ  
TForm3 *MessageForm = new TForm3(Application);

 ShowWindow(MessageForm->Handle, SW_SHOWNOACTIVATE);


Potrzeba oczywiście trochę wiedzy jak sterować zawartością takiego okna. Jeżeli okno tylko wyświetla komunikat i samo się zamyka lub zostaje zamknięte krzyżykiem to można takie okno tworzyć lokalnie, jeżeli jednak ma być w dowolny sposób sterowane z poziomu innych okien - jeżeli z poziomu wszystkich okien w aplikacji to deklarujemy okno w sekcji public, jeżeli tylko z poziomu jednego okna to można w sekcji private tegoż okna:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
#include "Unit3.h"
//---------------------------------------------------------------------------
public:
        TForm2 *MessageForm;


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
#include "Unit1.h"
#include "Unit2.h" /* dla Form2 */
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MessageForm = new TForm2(Application);

 ShowWindow(MessageForm->Handle, SW_SHOWNOACTIVATE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 /* Można sterować zawartością okna komunikatu, gdyż jest to okno publiczne */

 MessageForm->Caption = "Tytuł komunikatu";
 MessageForm->Label1->Caption = "Treść komunikatu";
}


Można również sterować tym oknem z poziomu innego okna w aplikacji:
KOD cpp:     UKRYJ  
#include "Unit3.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
 Form1->MessageForm->Caption = "Tytuł komunikatu";
 Form1->MessageForm->Label1->Caption = "Treść komunikatu";
}
Jeżeli chcesz sterować pozycją okna to posiłkujesz się funkcją SetWindowPos:

KOD cpp:     UKRYJ  
MessageForm = new TForm3(Application);

 SetWindowPos(MessageForm->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
 ShowWindow(MessageForm->Handle, SW_SHOWNOACTIVATE);


Pierwszy argument funkcji to uchwyt do okna, drugi określa pozycję okna względem innych, czyli czy ma się wyświetlić przed innymi czy za, trzeci i czwarty argument określają pozycję okna względem lewego górnego rogu ekranu, piąty i szósty wymiary okna - ja użyłem tutaj w siódmym argumencie flagi SWP_NOSIZE, która blokuje zmianę rozmiaru okna więc mimo iż w piątym i szóstym argumencie podałem 0 to rozmiar okna się nie zmieni, bez tej flagi jednak by uległ zmianie. W pliku pomocy ta funkcja została dobrze opisana więc poczytaj sobie. Dzięki tej funkcji można zmieniać pozycję i rozmiar okna bez ustawiania na niego focusa.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
sebaskow
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: Forma bez focusa

Postprzez sebaskow » czwartek, 4 lipca 2013, 19:22

Super Dziękuję. :D

Naprawdę prosta sprawa :-)
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome


  • 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ść