ShowWindow( hWnd, SW_HIDE) funktioniert nicht



  • Hallo liebe Community,
    ich habe seit neusten in meinem C++ Win32 Programm das Problem das ShowWindow( egal welches Window, SW_HIDE) einfach nicht funktioniert. Das einzige was ich dazu gefunden habe ist das man es 2-Mal aufrufen soll da es beim ersten Mal anscheinend ignoriert wird, doch das half leider auch nicht. Also bin ich jetzt wieder hier gelandet. Ich hoffe auf eure Hilfe!
    Hier der Code, anhand eines Bsp-Windows, der aber eigentlich relativ sinnlos ist, da er ja bei allen anderen funktioniert:

    In der WndProc:

    static HWND hwndListBox;
    

    Nach einer if-Abfrage:

                    hwndListBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"listbox", L"g",
                        WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL,
                        500, 100, 300, 400, hWnd, (HMENU)ID_LIST,
                        NULL, NULL);
    

    Und hier beim versuch diese nach einem Knopfdruck auszublenden:

                ShowWindow(hwndListBox, SW_HIDE);
                ShowWindow(hwndListBox, SW_HIDE);
    
    
                UpdateWindow(hWnd);
                UpdateWindow(hwndListBox);
    

    Wobei hWnd das "Mutter"-Window ist. Falls ihr Lösungsvorschläge habt wäre ich euch sehr dankbar wenn ihr sie hier reinstellt.
    Mfg Felix



  • Das wird eigentlich nicht ignoriert. Ist die Listbox denn nach dem Aufruf noch bedienbar?
    Wenn nicht, dann könnte mir vorstellen, dass der Bereich im Parentwindow nicht aktualisiert wird. Ein Grund dafür könnte sein, dass du bei WM_ERASEBKGND true zurückgibst (Edit: ohne den Hintergrund zu zeichnen natürlich).
    Wenn sie immer noch bedienbar ist, würde ich mir das Handle mal genauer anschauen (Check mit IsWindow, IsChild, GetWindowLongPtr(hwndListBox, GWLP_ID)==ID_LIST, ...).



  • Zur Info:
    ShowWindow hat auch einen Rückgabewert, den man sich angucken könnte.



  • @yahendrik sagte in ShowWindow( hWnd, SW_HIDE) funktioniert nicht:

    WM_ERASEBKGND

    Die Listzbox und alle anderen Editboxen sind nicht mehr bedienbar. Das heißt dann doch das dieser Fall auftritt. Nun habe ich WM_ERASEBKGND nicht behandelt. Wie geh ich denn jetzt weiter fort.
    Ps.: Vielen Dank für die schnelle Antwort



  • @DocShoe
    Hab ich jetzt eben mal probiert und es sagt mir auch das es nicht Visible ist, aber man sieht es trotzdem.



  • @Felix

    Hab's selbst gelöst. Hing mit WM_ERASEBKGND zusammen. Da ich bei meinem Parent-Window den Hintergrund als NULL festgelegt hatte wurde anscheinend true zurückgegeben. Hab den Hintergrund jetzt einfach weiß gemacht und es funktioniert wieder alles reibungslos.

    wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    

    Danke an euch beide das ihr euch hierfür die Zeit genommen habt.



  • @Felix
    Du könntest mal versuchen, den Hintergrund per InvalidateRect neu zeichnen zu lassen:

    ShowWindow(hwndListBox, SW_HIDE);
    InvalidateRect(hwnd, nullptr, true); // Hintergrund löschen
    

    Bzw. würde natürlich der Bereich reichen, in dem sich die Listbox befindet. Ich kann es gerade nicht überprüfen, aber ich bin der Meinung, dass Windows dies eigentlich von sich aus macht.
    Ansonsten könnte es evtl. helfen, wenn du mehr Code zeigst. Speziell die Stellen, an denen die Fensterklasse registriert und das Fenster erzeugt wird.


Anmelden zum Antworten