HWND_TOPMOST Problem !!!!
-
Hi,
Problem1:
habe ein HauptFenster Form1 das ich in den Vordergrund bringe mit
SetWindowPos(Form1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
auf diesem Fenster befindet sich ein Button der löst ne Message aus
MessageDlgPos("TEST", mtWarning, TMsgDlgButtons() << mbOK , 0 , 203, 197);
Sobald nun diese Message erscheint und ich nun neben meinen Fenster mit der Mouse klicke
verschwindet die gesamte Application in den Hintergrund.
Aber genau das will ich ja verhindern , das Fenster soll mit der Message im Vordergrund bleiben.Problem 2 (ist ein ähnliches Problem)
habe 2 Fenster in einer Application (Form1 und Form2).
Wie kann ich Form2 so in den Vordergrund bringen und sichtbar machen das es sich über Form1 legt ????,
dabei aber Form1 sichtbar bleibt und nur von Form2 verdeckt wird.
Wenn man nun mit der Mouse irgendwo neben meiner Application klickt soll Form2 im Vordergrund und Form1 sichtbar hinter Form2 bleiben.
-
Hi,
habs hinbekommen so in etwa sollte das sein:
//Fenster Form1 in den Vordergrund bringen __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } //Dialog sichtbar machen void __fastcall TForm1::Button1Click(TObject *Sender) { Dialog1->Show(); Dialog1->Parent = Form1; //EnableWindow(Form1->Handle,FALSE); }
bis bald
-
B R U T A L - T O P M O S T
//Fenster mit BorderStyle = bsDialog sichtbar machen void __fastcall TForm1::Button1Click(TObject *Sender) { Dialog1->ShowModal(); } //bei activierung des bsDialog Fensters void __fastcall TDialog1::FormActivate(TObject *Sender) { this->Parent = Form1; SetWindowPos(Form1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); }
-
Eine Zeile ist noch sehr wichtig da ich noch auf Probleme gestoßen bin,
die Parent Zuweisung muss nach Beendigung von ShowModal() wieder
auf NULL gesetzt werden.//Fenster mit BorderStyle = bsDialog sichtbar machen void __fastcall TForm1::Button1Click(TObject *Sender) { Dialog1->ShowModal(); Dialog1->Parent = NULL; //nach Beendigung wieder auf NULL setzen } //bei Activierung des bsDialog Fensters void __fastcall TDialog1::FormActivate(TObject *Sender) { this->Parent = Form1; SetWindowPos(Form1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); }
-
Hallo,
vergiss das alles!
Machs einfach so:
Öffne das 2te Fesnter mit Form2->ShowModal();.Fenster 2 (unit2.cpp)
#include <vcl.h> #pragma hdrstop #include "Unit2.cpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::FormShow(TObject *Sender) { SetWindowPos(Application->Handle, HWND_TOPMOST, Left,Top, Width, Height, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); }
Fenster 2 (unit2.h)
#ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm2 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; void __fastcall FormShow(TObject *Sender); private: // Anwender-Deklarationen protected: void __fastcall CreateParams(TCreateParams &Params) { TForm::CreateParams(Params); Params.WndParent = Application->MainForm->Handle; } public: // Anwender-Deklarationen __fastcall TForm2(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm2 *Form2; //--------------------------------------------------------------------------- #endif
-
Geht einfacher!
Wenn das Hauptfenster den Status "HWND_TOPMOST" hat und man nun ein weiteres Fenster darüber legen will zum Beispiel einen Dialog kann man den so aufrufen:
void __fastcall TForm1::SpeedButton3Click(TObject *Sender) { Dialog2->Show(); Dialog2->Parent = Application->MainForm; }
Egal was man nun macht die gesamte Application befindet sich nun im Vordergrund und sichtbar ist der aufgerufene Dialog und dahinter das Hauptfenster Form1.
-
Zu Prob 1:
Formstyle Stay on Top aus und an machen !
-
Wichtig ist auch das wenn ein Fenster "HWND_TOPMOST" ist und man dann zum Beispiel eine MessageBox oder OpenDialoge öffnet und diese nicht in den Hintergrund verschwinden sollen diese so aufruft:
Application->NormalizeTopMosts(); ShowMessage("Hallo"); Application->RestoreTopMosts();