Childfenster wird nicht angezeigt



  • Hallo zusammen,

    ich habe in meinem Programm ein Hauptfenster, das eine Menüleiste enthält. In dieser Menüleiste gibt es einen Punkt zum Anzeigen eines Einstellungsfensters. Dieses Einstellungsfenster (hCfgWnd) soll ein Child des Hauptfensters (hMainWnd) sein. Ich habe nun die beiden Fenster erstellt, und bei Klick auf den Menüpunkt rufe ich die ShowWindow-Methode mit dem Handle meines Childfensters auf. Aber es erscheint nichts. Was mache ich falsch?

    Der Code:

    wc.cbClsExtra	= 0;
    wc.cbWndExtra	= 0;
    wc.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    wc.hCursor	= NULL;
    wc.hIcon		= LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON));
    wc.hInstance	= hInstance;
    wc.lpfnWndProc	= MainWndProc;
    wc.lpszClassName	= L"MainWnd";
    wc.lpszMenuName	= NULL;
    wc.style		= CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&wc);
    
    hMainWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
             L"MainWnd",
    	L"Ueberschrift",
    	WS_VISIBLE,
    	CW_USEDEFAULT,
    	CW_USEDEFAULT,
    	CW_USEDEFAULT,
    	CW_USEDEFAULT,
    	NULL,
    	NULL,
    	hInstance,
             NULL);
    

    Hier wird das Hauptfenster erstellt und registriert, klappt auch alles, ich habs abgetestet.

    Jetzt kommt die Stelle, an der das Childwindow definiert wird. Ich habs jetzt gleich mal mit WS_VISIBLE initialisiert, damit ich sehe, ob überhaupt was passiert. Die Konstante ID_CFGWND wird am Anfang mit 1 initialisiert.

    #define ID_CFGWND 1
    .
    .
    .
    wc.cbWndExtra	= sizeof(long);
    wc.hIcon		= NULL;
    wc.lpfnWndProc	= MainWndChildProc;
    wc.lpszClassName	= L"CfgWnd";
    wc.hbrBackground	= (HBRUSH)(COLORREF)0x00FF0000;
    
    RegisterClass(&wc)
    
    hCfgWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
    	L"CfgWnd",
             NULL,
    	WS_CHILD|WS_VISIBLE,
    	0,
    	0,
    	0,
    	0,
    	hMainWnd,
    	(HMENU)ID_CFGWND,
    	hInstance,
    	NULL);
    

    Was mache ich falsch? Muss ich irgendetwas anders setzen oder kommt er evtl. mit dieser Child-ID (ID_CFGWND) nicht zurecht=

    Vielen Dank für Eure Hilfe!



  • bherd schrieb:

    Ich habs jetzt gleich mal mit WS_VISIBLE initialisiert, damit ich sehe, ob überhaupt was passiert.

    Und? Ist was passiert?
    btw: dein hbrBackground sieht etwas seltsam aus

    This member can be a handle to the physical brush to be used for painting the background, or it can be a color value. A color value must be one of the following standard system colors (the value 1 must be added to the chosen color).

    Du hast einfach nur ein RGB-Wert angegeben und keinen dieser Standard-Farbwerte - das funktioniert so nicht 😉



  • Ja ok, das kann gut sein, dass die Background-Information ziemlicher Müll war 🙂
    Habs jetzt so gemacht, macht zwar nicht viel Sinn, ich will aber lediglich, dass es sich von dem weißen Hintergrund von MainWnd unterscheidet, damit ich sehe ob überhaupt was passiert:

    wc.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT+1);
    

    Es passiert aber nichts. Das Fenster ist nicht zu sehen. Ich hab zum Test mal einen Haltepunkt in die MainWndChildProc gesetzt und dann auf das leere Fenster geklickt, falls es doch angezeigt wird, ich es aber nur nicht sehe. Da passiert aber auch nichts, der Haltepunkt wird nicht angesprungen. Ich hab echt keine Ahnung, wieso das Fenster nicht angezeigt wird. Wenn ich es nicht als Child deklariere sondern ganz normal, dann gehts .... 😕



  • Achso - lol - ich seh es jetzt erst: du hast dem Child gar keine Ausdehnung (Breite, Höhe) gegeben 😉



  • OK, schon wieder Müll 😃 stimmt stimmt die Größe muss natürlich auch hin. Aber das Fenster ist trotzdem nicht zu sehen !!! Es ist zwar da, d.h. in dem Bereich, den ich für das Fenster definiere, werden keine MouseOver-Ereignisse an die Hauptfenster-Nachrichtenschleife geschickt, aber es ist nicht zu sehen !!!!!
    Ich hab jetzt den Fensterstil des Clientfenster auf WS_OVERLAPPED gesetzt, dann müsste doch dieses Fenster eine Titlebar haben oder nicht? Die müsste doch eigentlich auch zu sehen sein ...



  • Bitte das vollständige Programm posten.



  • Was steht in der MainWndChildProc?



  • Steht das auch bei deinem Child-Window ?

    wc.style        = CS_HREDRAW | CS_VREDRAW;
    

    Prüf mal die Rückgabewerte von RegisterClass() und CreateWindowEx()

    Nimm mal ne kontrastreiche Farbe als Hintergrundfarbe (z.B. schwarz):

    wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
    

    ...das Brush-Objekt müsste man natürlich eigentlich wieder freigeben...

    Wird in der WindowProc vom Child-Fenster auch WM_ERASEBKGND abgefangen oder wenn nicht DefWindowProc() aufgerufen ?


Log in to reply