Anfänger Problem bei ChildWindow

Bis jetzt bin ich zwar noch nicht bei der Text ausgabe aber per:
C++:
int lastError = GetLastError();
MessageBox( NULL, lastError ,  "ErrorAusgabe", MB_ICONHAND | MB_OK | MB_DEFBUTTON1 );
klappt es nicht weil als 2.Parameter ein Text vom Typ LPCSTR oder so stehen müsste.
Was mach ich alles falsch ?

Gruß
silent12
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

einen 'int' muss du natürlich erst in einen String umwandeln:
C++:
char buffer[10];
itoa(GetLastError(), buffer, 10);
MessageBox( NULL, buffer ,  "ErrorAusgabe", MB_ICONHAND | MB_OK | MB_DEFBUTTON1 );

Dir scheinen noch arg viel Grundlagen abzugehen.

Gruß
MCoder
 
Ja ich habe bis jetzt auch nur einen Online Grundkurs gemacht und beginne gerade mit einem Grundkurs zu WinApi/Win32.
Ok danke für die vielen Tipps :).
Die Meldung bedeutet: Hot key is already registered.
 
Hi.

Welcher Fehlercode wird denn genau zurückgegeben? Und hast du die GetLastError Funktion auch direkt nach der fehlgeschlagenen Funktion aufgerufen? (also im Block Zeile 55?)

Du rufst die RegisterClassEx doppelt auf - einmal in der InitWndClassEx Funktion und in WinMain. Ist das Absicht?

Gruß
 
Hallo,

also, ich habe deinen Code gerade mal ausprobiert und ich bekomme via GetLastError():
Code:
1407 -> ERROR_CANNOT_FIND_WND_CLASS

Das liegt daran, dass du bei CreateWindowEx() die Variable 'szClassName' übergibst, die allerdings nur einmal mit "Hallo" vorbelegt und dann nie wieder benutzt wird. Bei InitWndClassEx() verwendest du nämlich ganz andere Klassennamen. Diese solltest auch genauso an CreateWindowEx() übergeben.


Du solltest übrigens auch deinen Code mal aufräumen und überflüssigen und damit fehlerträchtigen Code entfernen, siehe auch die Anmerkung von deepthroat.

Gruß
MCoder
 
Zuletzt bearbeitet:
Danke für die Antworten.
Habe gerade ein Problem wieder mit den ChildWindows. Und zwar habe ich per WS_CLIPSIBLINGS festgelegt, dass wenn ich zwei ChildWindows übereinander bewege die Farben und Texte der ChildWindows sich nicht ineinander "verziehen".
Das funktioniert zwar, aber ich bekomme immer nur das eine von beiden ChildWindows in den Vordergrund.
Hier nochmal mein jetziger Code:
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 ©";
 
 		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, 20, 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, 20, 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;
             }
    }
 
Zuletzt bearbeitet von einem Moderator:
Ok habe noch einen schwerwiegenden Fehler gefunden, durch den sich auch gleich ein Problem mehr löste. Und zwar habe ich kein eigenes Handle für mein ParentWindow erstellt :D.
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 ©";
 
 		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 ( hWndParent == 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
                        hWndParent, 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
                        hWndParent, 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, hWndParent, 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

//Variablen zur Textausgabe des 2.ChildWindow
HDC hDCChild2;	// Handle to a Device Context für das ChildWindow
PAINTSTRUCT psChild2; //Paintstruktur für das ChildWindow
char szTextChild2[] = ("Hallo 2.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
											hDCChild2 = BeginPaint (hWndChild2, &psChild2);
											
													//Settings 2.ChildWindow
											SetBkMode (hDCChild2, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
											SetBkColor( hDCChild2, 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 (hDCChild2, RGB(255, 255, 255) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
											TextOut ( hDCChild2, 50, 100, szTextChild2, strlen(szTextChild2) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
											EndPaint ( hWndChild2, &psChild2); //beendet das neu gestalten des ChildWindows2


									//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;
             }
		
    }
Trotzdem habe ich immer noch das Problem, dass immer eins meiner ChildWindows im Vordergrund bleibt egal welches ChildWindow gerade aktiv ist.
 
Zuletzt bearbeitet von einem Moderator:
Zurück