Anfänger Problem bei ChildWindow

Aber wenn ich WndClassExChild auch noch als Parameter an die Funktion übergebe, dann habe ich ja immer 4 Parameter obwohl ich immer nur 3 brauche.
Sry bin grad bisschen verwirrt von den vielen WndClassEx ... :/
 
Was ich meine:
C++:
InitWndClassEx ( &WndClassExChild , /*falsch: &WndClassEx*/ , hInstance, "WndClassExChild2");
// ...
InitWndClassEx ( &WndClassExChild2,  /*falsch:  &WndClassEx*/, hInstance, "WndClassExChild");
Gruß
MCoder
 
Danke aber irgendwie meldet sich immer noch meine MessageBox mit Create Window failed.
Will weiter programmieren aber komm nicht weiter. Hat jemand noch einen Tipp ?
Hier nochmal die ganze Datei.
C++:
// 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 ©";
 
 
 
 
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
        HWND hWnd;      //legt die Eigenschaften des Fensters fest.
        MSG msg;        //darin werden die Daten gespeichert.
        
        
 
        //          Registrierung   von WndClassEx        //
 
        InitWndClassEx ( &WndClassEx, hInstance, "WndClassEx");
        
    
 
        RegisterClassEx ( &WndClassEx );
 
 
        //          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;
             }
 
        ShowWindow( hWnd, iCmdShow);
 
        { 
            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);
        }
 
HINSTANCE hChildInst = NULL;
HWND hWndChild;
HWND hWndChild2;
 
 
    
 
 
 
            //          Registrierung   von ChildWindow1        //
 
                InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild");
    
 
                hWndChild =  CreateWindowEx (WS_EX_CLIENTEDGE, szClassName,
                         "Child Window silent1297", WS_CAPTION | WS_CHILD| WS_VISIBLE,
                        70, 20, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );
 
                
            //          Registrierung   von ChildWindow2        //
 
                InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild2");
    
 
                hWndChild2 =  CreateWindowEx (WS_EX_CLIENTEDGE, szClassName,
                         "Child Window - 2 silent1297", WS_CAPTION | WS_CHILD| WS_VISIBLE,
                        320, 20, 250, 300,  // LinksAbstand, Obenabstand, Breite, Höhe
                        hWnd, NULL, hChildInst, NULL );
 
 
                SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH));
 
        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;
    }
 
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_CLOSE:      //Programm Ende
                            {
                            DestroyWindow( hWnd);
                            }
                            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;
             }
    }
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

welches Window ist es denn, was nicht erzeugt wird?
Ansonsten - beim Registrieren des 2. Childs muss es doch "InitWndClassEx ( &WndClassExChild2,.." heißen.

Gruß
MCoder
 
Es wird gar nichts erzeugt (kein Parentwindow -> keine ChildWindows).
Geht es nicht, dass ich beide Childwindows eine WndClassExChild nutzen lasse ?
Gruß
silent12
 
Es wird gar nichts erzeugt (kein Parentwindow -> keine ChildWindows).
Beim Code fällt mir nichts auf. Wenn es aber fehlschlägt rufe doch anschließend mal die Funktion GetLastError() auf und schaue, welcher Fehlercode dort zurückgegeben wird. Die Beschreibungen findest du hier: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx

Geht es nicht, dass ich beide Childwindows eine WndClassExChild nutzen lasse ?
Doch das geht, aber dann brauchst du Klasse auch nur ein einziges Mal registrieren, also nur ein Aufruf von InitWndClassEx() für beide Child Windows.

Gruß
MCoder
 
GetLastError() gibt einen Zahlenwert zurück, für den du im oben angegeben Link nachschauen kannst, was schiefgegangen ist. Es behebt nicht das Problem, hilft aber bei der Diagnose.
 
Der wird gar nicht ausgegeben.
Mit
C++:
int abc = GetLastError...
bekommst du den Wert und kannst ihn selber ausgeben.
 
Zurück