Anfänger Problem bei ChildWindow

silent12

Mitglied
Hallo,
ich habe gerade versucht ein Child Window mit einer andern Hintergrundfarbe als ein Parent Window zu erstellen. Nur leider erscheint mein Child Window jetzt gar nicht mehr ?
Würde mich über Hilfen sehr freuen.


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);
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;
		HWND hWnd;		//legt die Eigenschaften des Fensters fest.
		MSG msg;		//darin werden die Daten gespeichert.
		
		

		//          Registrierung   von WndClassEx        //

		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;
			 }

		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;
const char szClassNameChild[] = "ChildWindow";

		hWndChild =  CreateWindowEx (WS_EX_CLIENTEDGE, szClassNameChild,
						 "Child Window silent1297", WS_OVERLAPPEDWINDOW  | WS_CHILD| WS_VISIBLE,
						200, 200, 500, 200,
						hWnd, NULL, hChildInst, NULL );



			//          Registrierung   von WndClassExChild        //

		
		WndClassExChild.cbSize      = sizeof( WndClassExChild);
		WndClassExChild.style       = NULL;
		WndClassExChild.lpfnWndProc = (WNDPROC)WndProc;	 // hWnd -> CreateWindow (szClassName ) -> WndClass.
		WndClassExChild.cbClsExtra  = NULL;
		WndClassExChild.cbWndExtra  = NULL;
		WndClassExChild.hInstance   = hInstance;
		WndClassExChild.hIcon	   = LoadIcon( NULL, IDI_WARNING); //Icon
		WndClassExChild.hCursor	   = LoadCursor( NULL,IDC_ARROW); //Cursor
		WndClassExChild.hbrBackground = (HBRUSH) GetStockObject ( BLACK_BRUSH) ;	//Fensterfarbe
		WndClassExChild.lpszMenuName = NULL;
		WndClassExChild.lpszClassName =  szClassNameChild;	// C-String
		WndClassExChild.hIconSm      =  LoadIcon (NULL, IDI_APPLICATION);

			if ( !RegisterClassEx ( &WndClassExChild ))
			 {MessageBox ( NULL, "Register Class Child failed", "Error", MB_OK);
			  return false;
			 }





		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);
					}
			};

LG
silent1297
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

was mir aufgefallen ist:

Du hast die Reihenfolge vertauscht: Die Fensterklasse muss zuerst registriert werden, dann erst kann CreateWindowEx() aufgerufen werden.

Du brauchst keine spezielle 'hChildInst'. Es wird der derselbe HINSTANCE-Parameter verwendet, wie beim Hauptfenster.

Jedes Fenster bekommt auch eine eigene WndProc.

Gruß
MCoder
 
Schon wieder ein Problem an dem ich gerade scheitere :/ Ich habe eine Funktion erstellt (InitWndClassEx) um nicht für jedes ChildWindow jedes mal WndClassExChild2, WndClassExChild3, ... definieren zu müssen. Aber beim Aufrufen sagt er diese Funktion würde keine 3 Parameter aktzeptieren. Wo liegt mein Fehler ?
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";
      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
		WNDCLASSEX WndClassExChild2; //Grundeigenschaften für 2. 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 ( &WndClassEx, 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 ( &WndClassEx, 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;
			 }
	}

Ich würde mich sehr über eine Antwort freuen.
Gruß
silent12
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

das solltest du eigentlich schon selber sehen; die Fehlermeldung ist doch ziemlich eindeutig: Der Funktionsprotyp hat 2 Parameter, die Implementierung allerdingss 3.

Gruß
MCoder
 
Ja so hab ich das auch verstanden, aber *WndClassEx ist doch der 1. hInstance der 2. und *szClassName der 3. oder?
Wo liegt mein Denkfehler********
*peinlich*
?
 
Zuletzt bearbeitet:
Ohman fail :D Passiert wenn man unten was verändert und es nicht überträgt :/ thx
Warum erstelt es das Fenster jetzt trotzdem nicht ? (wird mir von meiner messagebox mitgeteilt)
 
Zuletzt bearbeitet:
Hallo,

Copy & Paste ist der Klassiker unter den Programmierfehler :D

Du musst für die Registrierung der Child-Windows natürlich auch WndClassExChild und WndClassExChild2 an die Funktion übergeben. Außerdem reicht es aus, dafür nur eine Fensterklasse zu registrieren. Die kannst du dann für mehrere Child Windows verwenden.

Gruß
MCoder
 
Zurück