WinAPI: Child-Window erneut öffnen

Michl

Grünschnabel
Hallo,

ich beschäftige mich gerade mit der WinAPI und möchte ein kleines Programm schreiben, mit dem ich aus einem Fenster heraus über das Menü weitere Fenster öffne.
Das habe ich auch (nach einem langen und harten Kampf :) ) hinbekommen.

Jetzt hapert es nur noch an einer Kleinigkeit.
Wie gesagt kann ich das Child window nach Auswahl eines Menü-Punktes mit CreateWindow öffnen. Wenn ich das Child schließe und anschließend über den selben Menüpunkt öffnen möchte geschieht allerdings nichts. :(
Muss ich das Child window erst vollständig löschen bevor ich es mit CreateWindow erneut aufbaue?

Bin leider noch ein blutiger Anfänger und kenne mich in der Ecke noch nicht so gut aus. Bin über jeden Hinweis dankbar.

Danke & Viele Grüße
Michl
 
Hi,

hier mal mein Code.

Code:
#include <windows.h>

#define OPEN_WINDOW 101

HINSTANCE main_inst;
HWND hwnd_main, hwnd_child;
WNDCLASS wc;
HMENU main_menu;

LRESULT CALLBACK WndMain (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndChild (HWND, UINT, WPARAM, LPARAM);

// MAIN WINDOW
int WINAPI WinMain(HINSTANCE hinst_main, HINSTANCE root, LPSTR t, int d)
{ MSG msg_main;

// REGISTER MAIN WINDOW
  wc.style        = CS_HREDRAW | CS_VREDRAW ;
  wc.lpfnWndProc  = WndMain;
  wc.cbClsExtra   = 0;
  wc.cbWndExtra   = 0;
  wc.hInstance    = hinst_main;
  wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground= NULL;
  wc.lpszMenuName =  NULL;
  wc.lpszClassName= "main";

  if (!RegisterClass(&wc)) 
         return 0;

// CREATE MENU
  main_menu=CreateMenu();           
  AppendMenu(main_menu,MF_STRING,OPEN_WINDOW,"Open Child");

// CREATE MAIN WINDOW
  main_inst = hinst_main;
  hwnd_main= CreateWindow("main",      //Name der Fensterklasse
						   "Main Window",        //Fenstertitel
						   WS_OVERLAPPEDWINDOW |  //Fensterstil
						   WS_VISIBLE,
						   CW_USEDEFAULT,		  //x-Koordinate linke obere Ecke
						   CW_USEDEFAULT,         //y-Koordinate linke obere Ecke
						   500,                   //Fensterbreite
						   200,                   //Fensterhöhe
						   NULL,                  //Vaterfenster
						   main_menu,                  //Menü
						   hinst_main,                 //Programmzähler
						   NULL);                 //zusätzliche Parameter

  while (GetMessage(&msg_main,NULL,0,0)) DispatchMessage(&msg_main);
 
  return msg_main.wParam;
}

// CALLBACK OF MAIN WINDOW
LRESULT CALLBACK WndMain(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{ 
  switch(message)
  { case WM_COMMAND:
         switch(LOWORD(wparam))
               { case OPEN_WINDOW: 
                           
					{    // REGISTER CHILD WINDOW
						  wc.hIcon         = NULL;
						  wc.lpszClassName = "child";
						  wc.lpfnWndProc   = WndChild;
						  if (!RegisterClass(&wc))
							return 0;

						  hwnd_child= CreateWindow("child",      //Name der Fensterklasse
							         			   "Child Window",        //Fenstertitel
									        	   WS_OVERLAPPEDWINDOW |  //Fensterstil
										           WS_VISIBLE,
										           CW_USEDEFAULT,		  //x-Koordinate linke obere Ecke
										           CW_USEDEFAULT,         //y-Koordinate linke obere Ecke
										           500, 200,                   //Fensterhöhe
												   hwnd_main,                  //Vaterfenster
												   NULL,                  //Menü
												   main_inst,                 //Programmzähler
												   NULL);                 //zusätzliche Parameter
					};		 

					return 0;
               }

    case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
  }

  return DefWindowProc(hwnd, message, wparam, lparam);
}


// CALLBACK OF CHILD WINDOW
LRESULT CALLBACK WndChild(HWND hwnd_child, UINT message, WPARAM wParam, LPARAM lParam)
{

return DefWindowProc (hwnd_child, message, wParam, lParam);

}

Danke für deine Hilfe!

Viele Grüße
Michl
 
Muss bei
C++:
while (GetMessage(&msg_main,NULL,0,0)) DispatchMessage(&msg_main);

nicht noch ein TranslateMessage() rein?:
C++:
while (GetMessage(&msg_main,NULL,0,0))
{
  TranslateMessage(&msg_main); 
  DispatchMessage(&msg_main);
}
 
Du solltest die Window-Klasse "child" nicht jedes mal neu registrieren. Denn ab dem zweiten Mal erhälst du den Fehler, dass der Name bereits vergeben ist.
Code:
ERROR_CLASS_ALREADY_EXISTS
1410 (0x582) Class already exists.
 
:offtopic: @_GST_: Du hast hier schon einige Beiträge geschrieben. Willst du dich nicht registrieren, dann kannst du auch Beiträge editieren ;)
 
Es soll vorkommen, dass hier auch Gäste schreiben, die eigentlich registriert sind, zum Beispiel weil sie an einem fremden PC keine Ahnung von ihrem Passwort haben :p
 
Zurück