Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.10.2006, 09:43

Fenster schließen

Hallo

Ich habe eine recht banale Frage, auf die ich allerdings leider keine Antwort finde.

Mein Programm sieht folgendermaßen aus:

Main.h/cpp
Setup.h/cpp
Hauptprogramm.h/cpp

Es wird also zunächst ein Objekt Setup erstellt mit:

Setup set;

Dieses baut wiederum mit CreateWindowEx ein Fenster auf, in welchem mit CreateWindow verschiedene Einstellungsboxen platziert werden.
Das ganze soll wirklich manuell passieren, auch wenn es mit einer "DialogBox" kein Problem darstellt.
Anschließend sollen die Daten an das Hauptprogramm übertragen werden, wo dann die eigentlichen Anwendung erzeugt wird.

Mein Problem besteht nun darin, dass es mir nicht gelingt, die SetupBox zu schließen. Im Prinzip sollte es doch reichen, wenn ich das Handle des Hauptfensters (das mit CreateWindowEx erstellte) zum beenden nehme.
Wenn ich aber nun, z.B. mit DestroyWindow() jenes handle angebe, schließt die komplette Anwendung.

Ich suche nun also einen befehl/Möglichkeit, wie ich ein einzelenes Fenster wieder beenden kann.

Hoffe es kann mir jemand weiterhelfen

Viele Grüße

falcon

Anonymous

unregistriert

2

04.10.2006, 10:48

Dann guck mal was in Deiner WM_DESTROY Message drin steht, sicherlich sowas wie PostQuitMessage (0); ;)

Das bedeutet: Fenster zerstören :arrow: Programm Ende.

3

04.10.2006, 11:36

Hallo unsigned long

Zunächst mal Danke für deine Antwort, auf die Idee bin ich nicht gekommen, das hier WM_Destroy einspringt.

Wie kann ich hier nun differenzieren?

Als Beispiel:

Wenn ich auf das x in der Rechten oberen Ecke klicke soll sich die gesamte Anwendung schließen.


Darüber hinaus möchte ich aber, z.B bei einem klick auf einen Butto oder automatisch oder...dass sich Fenster 1 schließt ohne, dass dabei die Anwendung geschlossen wird.

Wie kann ich das erreichen?

Gruß

falcon

4

04.10.2006, 13:21

falcon

Du kannst die X-Nachricht abfragen. Such mal in der MSDN unter WM_???.
Da gibt's irgendwas... ONCLOSE? Nein. WM_CLOSE ähnlich. Fällt mir grad nicht ein, sry.

5

09.10.2006, 17:19

Hallo FOGX

Entschuldigung, dass ich erst so spät anworte.

Das mit den Nachrichten ist mir eigentlich klar.

Ich switche unter z.B. WinProc durch die verscheidenen Nachrichten und kann dort dann z.B. auf die WM_Close NAchricht reagieren. Meine Frage ist nun wie? soll ich darauf reagieren, also mit welchem Befehl schließe ich das Fenster, ohne dass sichd er Rest der Anwendung mit schließt?

6

10.10.2006, 09:24

Vielleicht noch ein anderes Beispiel zum nachvollziehen:

Man erstelle ein normales Windows-Standardgerüst (Winmain, WindowProc)

Anschließend 2 Handles

Jedes Handle bekommt mit CreateWindow ein Fenster zugewiesen, beide sind gleichwertig.

Nun möchte ich, dass ich das eine Fenster schließen kann, das andere aber geöffnet bleibt.
Wenn ich den WM_Close Befehl nehme bleibt nur ein DestroyWindow(xhwnd). Diese versendet aber wiederum eine WM_Destroy Message, worauf sich die ganze Anwendung schließt, was sie bei WM_Destroy ja eigentlich auch tun soll.

Hoffe es wird klar was ich meine.

Gruß

falcon

Anonymous

unregistriert

7

10.10.2006, 16:52

Wie wäre es mit ner Proc für das 2. Fenster? Dann WM_Close und dann
gibts auch keine Probleme... Ist doch logisch, das ansonsten beide geschlossen werden...

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

8

10.10.2006, 17:06

Du bekommst ja bei der WinProc mit übergeben um welches Fenster es sich handelt. Wenn ich dein Problem richtig verstanden habe, denn willst du ja nur beim einen Fenster, dass sich die Anwendung dann schliesst.
Baue also einfach eine Abfrage in den case-Zweig für WM_DESTROY ein und wenn es das richtige Fenster ist schreibst du PostQuitMessage(0) und sonnst halt nicht.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

9

10.10.2006, 17:43

Hallo

Danke für die Antworten.
Kann ich denn einem Fenster eine eigene Proc zuweisen? das wäre mir neu, kenn ich nur für Dialog Boxen.

cih häng mal ein runtergebrochenes Beispiel an, vielleicht kann man es daran genau erklären:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <windows.h>
 
 
LRESULT CALLBACK WindowProcedure(HWND hwnd,UINT msg,WPARAM 
 
wparam,LPARAM lparam);
HWND awindow;
HWND bwindow;
void Register(WNDCLASSEX WindowClass)
{
 RECT DesktopSize;
   GetClientRect(GetDesktopWindow(),&DesktopSize);
   WindowClass.cbSize = sizeof(WNDCLASSEX);
   WindowClass.style = CS_HREDRAW | CS_VREDRAW;
   WindowClass.lpfnWndProc = WindowProcedure;
   WindowClass.cbClsExtra = 0;
   WindowClass.cbWndExtra = 0;
   WindowClass.hInstance = GetModuleHandle(NULL);
   WindowClass.hIcon = NULL;
   WindowClass.hCursor = NULL;
   WindowClass.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
   WindowClass.lpszMenuName = NULL;
   WindowClass.lpszClassName = "ClassName";
   WindowClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
   RegisterClassEx(&WindowClass);
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR Ipcmdline, int cCmdShow)
{
MSG Message; 
WNDCLASSEX WindowClass;
 
ZeroMemory(&WindowClass,sizeof(WNDCLASSEX));
Register(WindowClass);
 
 
awindow=CreateWindow( "ClassName",
                       "Window A",
                        WS_OVERLAPPED|WS_SYSMENU|WS_VISIBLE,
                        200,300,
                        200,300,
                        NULL,
                        NULL,
                        GetModuleHandle(NULL),
                        NULL);
 
 
 
 

bwindow=CreateWindow( "ClassName",
                          "Window B",
                           WS_OVERLAPPED|WS_SYSMENU|WS_VISIBLE,
                           500,300,
                           200,300,
                           NULL,
                           NULL,
                           GetModuleHandle(NULL),
                           NULL);


ZeroMemory(&Message,sizeof(MSG));
while(Message.message!=WM_QUIT) 
 {
         if(PeekMessage(&Message,NULL,0U,0U,PM_REMOVE)) 
           {    
                    TranslateMessage(&Message); 
                    DispatchMessage(&Message); 
            {
}
return 0;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)

{
              case WM_KEYDOWN:
               {
                            switch(wparam)
                             {
                                 case VK_ESCAPE: 
                                  {
                                    DestroyWindow(bwindow);
                                    break;
                                   }
                              }
                              return 0;
                 }
                 case WM_DESTROY:
                 {
                        PostQuitMessage(0);
                          break;
                 }
}
return DefWindowProc(hwnd,msg,wparam,lparam);
}



Sollte lauffähig sein, habs jetzt mal einfach so gemacht, dass sich Fenster B schließen soll, wenn Escape gedrückt wurde.

Gruß

falcon

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

10

10.10.2006, 17:55

Du kannst verschiedenen Fenstern verschiedene WinProcs geben, indem du für verschiedene Fenster verschiedene Fensterklassen registrierst.

Quellcode

1
2
3
4
WNDCLASSEX WindowClass;
 
ZeroMemory(&WindowClass,sizeof(WNDCLASSEX));
Register(WindowClass);

Also das ist ziemlich sinnlos. Besser du deklarierst WindowClass gleich in der Funktion oder noch besser, lass die Funktion ganz weg und erledige alles in der WinMain.

Quellcode

1
2
3
4
5
case WM_DESTROY:
                 {
                        PostQuitMessage(0);
                          break;
                 }


Logisch wird so das Programm beendet, wenn du ein Fenster schliesst.
PostQuitMessage() beendet die Ereignisswarteschleife und somit dein Programm...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige