Przypomniałem sobie jak można przywołać okno bez aktywacji:
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:
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:
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
Wywołanie takiego okna komunikatu jest już banalnie proste:
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
#include "Unit3.h"
//---------------------------------------------------------------------------
public:
TForm2 *MessageForm;
Plik źródłowy np. Unit1.cpp
#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:
#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:
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.