# ChildWindows:schließt ParentWindow mit



## Silent12 (17. November 2011)

*ChildWindows:schließt ParentWindow mit*

Hallo...
Ich habe gerade ein ParentWindow mit 2 enthaltenen ChildWindows erstellt.
Nun habe ich 2 komische Probleme:

1. Wenn ich das eine ChildWindow über das andere bewege und dann das ChildWindow schließe dann schließt sich das ParentWindow mit, aber nur wenn ich es über das ander ChildWindow bewege, sonst nicht
2. Ich habe per WS_CLIPSIBLINGS  festgelegt, dass immer das aktive ChildWindow im Fordergrund ist, aber das gleiche ChildWindow, das auch das ParentWindow ungewollt schließt lässt sich nicht von dem andern ChildWindow überdecken, sondern bleibt immer im Vordergrund.

Code:

```
// main_cpp //
 
#include <Windows.h>
#include <iostream>
 
int width = 640;
int height = 420;
 
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
bool InitWndClassEx ( WNDCLASSEX *WndClassEx, HINSTANCE hInstance, const char szClassName[] = "Hallo"); 
const char szClassName[] =  "Hallo";
      char szTitle[] = "1.Programm   Grafic3 Silent1297 2011 ©";
 
         HWND hWndChild;    //Handle to 1.ChildWindow
        HWND hWndChild2; //Handle to 2. ChildWindow
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
           LPSTR szCmdLine, int iCmdShow)
 
    {
        WNDCLASSEX WndClassEx;  // legt die Grundeigenschaften für das Fenster fest.
        WNDCLASSEX WndClassExChild; //Grundeigenschaften für ChildWindow
        WNDCLASSEX WndClassExChild2; //Grundeigenschaften für ChildWindow2
        HWND hWnd;      //legt die Eigenschaften des Fensters fest.
        MSG msg;        //darin werden die Daten gespeichert.
        HINSTANCE hChildInst = NULL;

 
     
        //          Registrierung      //

        InitWndClassEx ( &WndClassEx, hInstance, szClassName);
        InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild");
        InitWndClassEx ( &WndClassExChild2, hInstance, "WndClassExChild2");
 
 
        //          Fenster Erstellen          //
 
        hWnd = CreateWindowEx (NULL,    // beeinhaltet die Folgenden Eigenschaften und die Eigenschaften aus WndClassEx
                         szClassName,   //hierüber werden die Eigenschaften aus WndClassEx. eingebunden
                         szTitle,
                        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, //Fenster (Minimierungsbutton.....
                        300, //Abstand-Oben
                        600, //Abstand-Links
                        width, // Breite
                        height, // Höhe
                        NULL,
                        NULL,
                        hInstance,
                        NULL);        
 
        if ( hWnd == NULL )
             {MessageBox ( NULL, "Create Window  failed", "Error", MB_OK);
              return false;
             }
 
        { 
            int cx = GetSystemMetrics(SM_CXSCREEN); //cx = desktopbreite ermitteln
            int cy = GetSystemMetrics(SM_CYSCREEN);//cx = desktophöhe ermitteln
            
            int px = (cx - width) / 2; //AbstanddesFensters von links errechnen
            int py = (cy - height) / 2; //AbstanddesFensters von oben errechnen

            MoveWindow( hWnd, px, py, width, height, true);
        }
 
         ShowWindow( hWnd, iCmdShow);


                hWndChild =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild",
                         "Child Window silent1297", WS_SYSMENU| WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        70, 30, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );

                hWndChild2 =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild2",
                         "Child Window - 2 silent1297",WS_SYSMENU | WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        320, 30, 250, 300,  // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );
 
 
                SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH)); //ändert die Hintergrundfarbe des Fensters dessen HWND (Handle to Window) angegeben ist 
 
        while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL) // -1 = Fehler | 0 // > 0
            {
                TranslateMessage( &msg ); // wird in Character-Message übersetzt
                DispatchMessage ( &msg ); // wird verschickt an die Callback Funktion
            };
            // WINDOW-PROCEDUR(Einleitungsteil) -> WNDCLASSEX(Registrierung) -> HWND(Fenstereinstellungenfestlegen) -> MESSAGELOOP(Messages übersetzen und an die CALLBACK-Funktion weiterverschicken)
        

        return 0;
    }
//Variablen zur Textausgabe des ParentWindow
HDC hDCParent;    // Handle to a Device Context für das ParentWindow
PAINTSTRUCT psParent; //Paintstruktur für das ParentWindow
char szTextParent[] = ("Hallo Welt");    // Text der ausgegeben werden soll für das ParentWindow

//Variablen zur Textausgabe des 1.ChildWindow
HDC hDCChild;    // Handle to a Device Context für das ChildWindow
PAINTSTRUCT psChild; //Paintstruktur für das ChildWindow
char szTextChild[] = ("Hallo 1.ChildFenster");    // Text der ausgegeben werden soll für das ChildWindow




LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)        //Gehirn des eigentlichen Windows, Verarbeitung von Messages...
            {
 
                //Jede Message hat 2 Informationen ( wParam und lParam)
                switch (msg)
                    {  
                        case WM_PAINT:        //Text ausgeben
                                
                            hDCParent = BeginPaint (hWnd,&psParent);        //ParentWindow neu gestalten :D
                                    hDCChild = BeginPaint (hWndChild,&psChild);     //ChildWindow neu gestalten :D


                                    //Settings 1.ChildWindow
                                    SetBkMode (hDCChild, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
                                    SetBkColor( hDCChild, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                                    SetTextColor (hDCChild, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                                    TextOut ( hDCChild, 50, 100, szTextChild, strlen(szTextChild) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
                                    EndPaint ( hWndChild, &psChild); //beendet das neu gestalten des ChildWindows

                            //Settings Parent Window
                            SetBkMode (hDCParent, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
                            SetBkColor( hDCParent, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                            SetTextColor (hDCParent, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                            TextOut ( hDCParent, 10, 10, szTextParent, strlen(szTextParent) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
                            EndPaint ( hWnd, &psParent); //beendet das neu gestalten des ParentWindows

                            break;

                        case WM_DESTROY:        //Fenster Ende (Wenn auf das X-geklickt wird
 
                            PostQuitMessage(0);
                            break;
 
                        default:
                            return DefWindowProc ( hWnd, msg, wParam, lParam);
                    }
            }
 
bool InitWndClassEx ( WNDCLASSEX *WndClassEx , HINSTANCE hInstance, const char *szClassName)     //Funktion mit Defaultwerten für zB ChildWindows
    {
        WndClassEx->cbSize      = sizeof( *WndClassEx);
        WndClassEx->style       = NULL;
        WndClassEx->lpfnWndProc = (WNDPROC)WndProc;  // hWnd -> CreateWindow (szClassName ) -> WndClass.
        WndClassEx->cbClsExtra  = NULL;
        WndClassEx->cbWndExtra  = NULL;
        WndClassEx->hInstance   = hInstance;
        WndClassEx->hIcon      = LoadIcon( NULL, IDI_WARNING); //Icon
        WndClassEx->hCursor    = LoadCursor( NULL,IDC_ARROW); //Cursor
        WndClassEx->hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH) ;    //Fensterfarbe
        WndClassEx->lpszMenuName = NULL;
        WndClassEx->lpszClassName =  szClassName;   // C-String
        WndClassEx->hIconSm      =  LoadIcon (NULL, IDI_APPLICATION);
 
        if ( !RegisterClassEx ( WndClassEx ))
             {MessageBox ( NULL, "Register Class failed", "Error", MB_OK);
              return false;
             }
    }
```

Kann das daran liegen, dass ich nur in das eine ChildWindow einen Text eingefügt habe ? 
Würde mich über Antworten sehr freuen

Gruß
silent12


----------



## bingo88 (17. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Ich habe es jetzt nicht ausprobiert, aber du benutzt für alle Fenster dieselbe WndProc. Und die ruft bei WM_DESTROY PostQuitMessage auf, was den Prozess allerdings beendet. Du schießt dich also selbst ab. Außerdem hast du vergessen, für jeden möglichen Pfad in der WndProc einen Wert zurückzugeben (in deiner Version würde es reichen, return 0; am Ende der Funktion einzufügen).

Der Parameter hWnd in der WndProc ist übrigens das Handle auf das Fenster, für das gerade ne Nachricht verarbeitet wird. Wenn du außerhalb der WndProc keinen Zugriff auf das Handle benötigst, kannst du auch die globalen Variablen dafür entfernen und durch das lokale Handle ersetzen.


----------



## Silent12 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Aber es sollen doch auch alle Fenster von einer WndProc "gesteuert  werden" oder ? Könnte ich nicht irgendwie in die switch-case Schleife  noch eine if-else schleife einbauen, um nur beim Klick auf das X des   ParentWindow die Funktion PostQuitMessage auszuführen ? Oder muss ich  jetzt für jedes ChildWindow eine eigene WndProc schreiben mit ihrer eigenen switch-case Schleife ? 

Gruß
silent12


----------



## bingo88 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Naja, das hängt von deinen Anforderungen ab. Du musst nicht eine WndProc für alle Fenster nutzen. Je nach Anforderung ist das sogar wenig sinnvoll. Wenn du an deinem jetzigen Design festhalten willst, dürftest du bei WM_CLOSE PostQUitMessage nur für dein Main Window aufrufen (also da nen if (hWnd = hMainWnd) { PostQuitMessage(0); } rein). Ich persönlich mag es lieber für jedes Fenster bzw. für jede Fensterklasse(!) eine eigene Handler-Routine zu haben.


----------



## Silent12 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Ah ok, aber wie teste ich ob ein Handle zum Window = dem Handle zum PARENT Window ist ?  ? ==  hWndParent ? Ich müsste irgendwie für das Fragezeichen mein aktives Handle einsetzen, weiß aber nicht wie sowas gehen soll


----------



## bingo88 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Du müsstest dein main window dann auch als globale Variable ablegen, bspw. hMainWnd. Dann kannst du, da WndProc ja das akt. hWnd übergeben bekommt, mittels if (hWnd == hMainWnd) herausbekommen, ob das akt. Fenster dein Hauptfenster ist.


----------



## Silent12 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Das habe ich auch schon gemacht, aber für was steht das hWnd ? hMainWnd ist klar


----------



## bingo88 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

LRESULT CALLBACK WndProc (*HWND hWnd*, UINT msg, WPARAM wParam, LPARAM lParam)

=> das hWnd meine ich.


----------



## Silent12 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Bei mir ist das hWnd genau das selbe wie das hWnd von meinem Hauptwindow :/ habe es nach sterminio Productions erstellt.


----------



## bingo88 (18. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*



Silent12 schrieb:


> Bei mir ist das hWnd genau das selbe wie das hWnd von meinem Hauptwindow :/ habe es nach sterminio Productions erstellt.


 du musst natürlich das hauptwindow (also das globale) anders nennen, z. B. hMainWnd, da du sonst den Namen überdeckst.

sprich anstatt
hWnd = CreateWindow(...);
schreibst du
hMainWnd = CreateWindow(...);

und das HWND hWnd in der WinMain schmeißt du raus (wird durch das globale hMainWnd ersetzt).

du musst das natürlich an den anderen Stellen wie z. B. ShowWindow auch anpassen.


```
HWND hMainWnd;

int WINAPI WinMain(...)
{
   ...
   hMainWnd = CreateWindow(...);
   ...
}

LRESULT CALLBACK WndProc(HWND hWnd, ...)
{
    switch (...)
    {
        ...
        case WM_DESTROY:
            if (hWnd == hMainWnd)
            {
                PostQuitMessage(0); // nur Hauptfenster
            }

            break;
        }

        return 0;
}
```


----------



## Silent12 (19. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Aber das in meiner WndProc erstellte Handle ist dadurch ja nicht in meiner main-Funktion zu verwenden. Theorethisch müsste mein Programm danach ja so aussehen oder ? 


```
// main_cpp //
 
#include <Windows.h>
#include <iostream>
 
int width = 640;
int height = 420;
 
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
bool InitWndClassEx ( WNDCLASSEX *WndClassEx, HINSTANCE hInstance, const char szClassName[] = "Hallo"); 
const char szClassName[] =  "Hallo";
      char szTitle[] = "1.Programm   Grafic3 Silent1297 2011 ©";
 
         HWND hWndChild;    //Handle to 1.ChildWindow
        HWND hWndChild2; //Handle to 2. ChildWindow
        HWND hWndParent;      //legt die Eigenschaften des ParentWindows fest.
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
           LPSTR szCmdLine, int iCmdShow)
 
    {
        WNDCLASSEX WndClassEx;  // legt die Grundeigenschaften für das Fenster fest.
        WNDCLASSEX WndClassExChild; //Grundeigenschaften für ChildWindow
        WNDCLASSEX WndClassExChild2; //Grundeigenschaften für ChildWindow2
        MSG msg;        //darin werden die Daten gespeichert.
        HINSTANCE hChildInst = NULL;

 
     
        //          Registrierung      //

        InitWndClassEx ( &WndClassEx, hInstance, szClassName);
        InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild");
        InitWndClassEx ( &WndClassExChild2, hInstance, "WndClassExChild2");
 
 
        //          Fenster Erstellen          //
 
        hWndParent = CreateWindowEx (NULL,    // beeinhaltet die Folgenden Eigenschaften und die Eigenschaften aus WndClassEx
                         szClassName,   //hierüber werden die Eigenschaften aus WndClassEx. eingebunden
                         szTitle,
                        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, //Fenster (Minimierungsbutton.....
                        300, //Abstand-Oben
                        600, //Abstand-Links
                        width, // Breite
                        height, // Höhe
                        NULL,
                        NULL,
                        hInstance,
                        NULL);        
 
        if ( hWnd == NULL )
             {MessageBox ( NULL, "Create Window  failed", "Error", MB_OK);
              return false;
             }
 
        { 
            int cx = GetSystemMetrics(SM_CXSCREEN); //cx = desktopbreite ermitteln
            int cy = GetSystemMetrics(SM_CYSCREEN);//cx = desktophöhe ermitteln
            
            int px = (cx - width) / 2; //AbstanddesFensters von links errechnen
            int py = (cy - height) / 2; //AbstanddesFensters von oben errechnen

            MoveWindow( hWndParent, px, py, width, height, true);
        }
 
         ShowWindow( hWndParent, iCmdShow);


                hWndChild =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild",
                         "Child Window silent1297", WS_SYSMENU| WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        70, 30, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );

                hWndChild2 =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild2",
                         "Child Window - 2 silent1297",WS_SYSMENU | WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        320, 30, 250, 300,  // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );
 
 
                SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH)); //ändert die Hintergrundfarbe des Fensters dessen HWND (Handle to Window) angegeben ist 
 
        while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL) // -1 = Fehler | 0 // > 0
            {
                TranslateMessage( &msg ); // wird in Character-Message übersetzt
                DispatchMessage ( &msg ); // wird verschickt an die Callback Funktion
            };
            // WINDOW-PROCEDUR(Einleitungsteil) -> WNDCLASSEX(Registrierung) -> HWND(Fenstereinstellungenfestlegen) -> MESSAGELOOP(Messages übersetzen und an die CALLBACK-Funktion weiterverschicken)
        

        return 0;
    }
//Variablen zur Textausgabe des ParentWindow
HDC hDCParent;    // Handle to a Device Context für das ParentWindow
PAINTSTRUCT psParent; //Paintstruktur für das ParentWindow
char szTextParent[] = ("Hallo Welt");    // Text der ausgegeben werden soll für das ParentWindow

//Variablen zur Textausgabe des 1.ChildWindow
HDC hDCChild;    // Handle to a Device Context für das ChildWindow
PAINTSTRUCT psChild; //Paintstruktur für das ChildWindow
char szTextChild[] = ("Hallo 1.ChildFenster");    // Text der ausgegeben werden soll für das ChildWindow




LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)        //Gehirn des eigentlichen Windows, Verarbeitung von Messages...
            {
 
                //Jede Message hat 2 Informationen ( wParam und lParam)
                switch (msg)
                    {  
                        case WM_PAINT:        //Text ausgeben
                                
                            hDCParent = BeginPaint (hWnd,&psParent);        //ParentWindow neu gestalten :D
                                    hDCChild = BeginPaint (hWndChild,&psChild);     //ChildWindow neu gestalten :D


                                    //Settings 1.ChildWindow
                                    SetBkMode (hDCChild, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
                                    SetBkColor( hDCChild, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                                    SetTextColor (hDCChild, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                                    TextOut ( hDCChild, 50, 100, szTextChild, strlen(szTextChild) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
                                    EndPaint ( hWndChild, &psChild); //beendet das neu gestalten des ChildWindows

                            //Settings Parent Window
                            SetBkMode (hDCParent, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
                            SetBkColor( hDCParent, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                            SetTextColor (hDCParent, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
                            TextOut ( hDCParent, 10, 10, szTextParent, strlen(szTextParent) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
                            EndPaint ( hWnd, &psParent); //beendet das neu gestalten des ParentWindows

                            break;

                        case WM_DESTROY:        //Fenster Ende (Wenn auf das X-geklickt wird
 
                            if(hWnd == hWndParent)
                                {
                            PostQuitMessage(0);
                                }

                            break;
 
                        default:
                             return DefWindowProc ( hWnd, msg, wParam, lParam);
                              
                   }
                return 0;
            }
 
bool InitWndClassEx ( WNDCLASSEX *WndClassEx , HINSTANCE hInstance, const char *szClassName)     //Funktion mit Defaultwerten für zB ChildWindows
    {
        WndClassEx->cbSize      = sizeof( *WndClassEx);
        WndClassEx->style       = NULL;
        WndClassEx->lpfnWndProc = (WNDPROC)WndProc;  // hWnd -> CreateWindow (szClassName ) -> WndClass.
        WndClassEx->cbClsExtra  = NULL;
        WndClassEx->cbWndExtra  = NULL;
        WndClassEx->hInstance   = hInstance;
        WndClassEx->hIcon      = LoadIcon( NULL, IDI_WARNING); //Icon
        WndClassEx->hCursor    = LoadCursor( NULL,IDC_ARROW); //Cursor
        WndClassEx->hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH) ;    //Fensterfarbe
        WndClassEx->lpszMenuName = NULL;
        WndClassEx->lpszClassName =  szClassName;   // C-String
        WndClassEx->hIconSm      =  LoadIcon (NULL, IDI_APPLICATION);
 
        if ( !RegisterClassEx ( WndClassEx ))
             {MessageBox ( NULL, "Register Class failed", "Error", MB_OK);
              return false;
             }
        
    }
```


----------



## bingo88 (19. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*


```
if ( hWnd == NULL )
             {MessageBox ( NULL, "Create Window  failed", "Error", MB_OK);
              return false;
             }
 
        { 
            int cx = GetSystemMetrics(SM_CXSCREEN); //cx = desktopbreite ermitteln
            int cy = GetSystemMetrics(SM_CYSCREEN);//cx = desktophöhe ermitteln
            
            int px = (cx - width) / 2; //AbstanddesFensters von links errechnen
            int py = (cy - height) / 2; //AbstanddesFensters von oben errechnen

            MoveWindow( hWndParent, px, py, width, height, true);
        }
 
         ShowWindow( hWndParent, iCmdShow);


                hWndChild =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild",
                         "Child Window silent1297", WS_SYSMENU| WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        70, 30, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );

                hWndChild2 =  CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild2",
                         "Child Window - 2 silent1297",WS_SYSMENU | WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
                        320, 30, 250, 300,  // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );
 
 
                SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH)); //ändert die Hintergrundfarbe des Fensters dessen HWND (Handle to Window) angegeben ist 
 
        while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL) // -1 = Fehler | 0 // > 0
            {
                TranslateMessage( &msg ); // wird in Character-Message übersetzt
                DispatchMessage ( &msg ); // wird verschickt an die Callback Funktion
            };
            // WINDOW-PROCEDUR(Einleitungsteil) -> WNDCLASSEX(Registrierung) -> HWND(Fenstereinstellungenfestlegen) -> MESSAGELOOP(Messages übersetzen und an die CALLBACK-Funktion weiterverschicken)
        

        return 0;
    }
```
da hast du noch ein paar mal hWnd stehen, das müsstest du noch gegen hWndParent ersetzen

Edit: Was meinst du mit "in WndProc erstelltem Handle"? Da wird kein handle erzeugt, nur eins übergeben (welches das Fenster darstellt, für das gerade Nachrichten eingetroffen sind).


----------



## Silent12 (19. November 2011)

*AW: ChildWindows:schließt ParentWindow mit*

Ah jetzt wird mir einiges klarer  Danke für die ausführlichen Tipps 
Jetzt habe ich das SchließProblem nicht mehr, aber immer noch das Problem, dass immer das eine ChildWindow im Vordergrund ist und das andere immer im Hintergrund :/. Könnte dies daran liegen, dass ich nur in einem der beiden Fenster Text ausgebe ? 

Gruß
silent12


----------

