Child window resizing



  • Tach zusammen!

    Ich habe ein einfaches Win32 Fenster und ein Child Fenster mit STATUSCLASSNAME als Fensterklasse. Wenn das Hauptfenster seine Groesse veraendert, dann sollte die Status Bar auch entsprechend die Groesse und Position veraendern. Leider macht die das nicht. Gibt's da irgend etwas, was man beachten muss oder so? Laut MSDN sendet das Parent-Window automatisch eine WM_SIZE-Nachricht, mach se aber nicht, so das ich das per Hand erledigen muss, was ich aber nicht will.

    Danke schonmal.



  • bearbeitest du die wm_size beim childwindow?
    du musst das Neuzeichnen selber übernehmen. Dir wird nur gesagt, dsas da Childwindow sich in der Größe ändern muss. Da windows aber nicht ahnen kann, wie das childwindow sich verhalten soll, tut es erstmal garnichts.



  • Die WindowProc() des Child-Fensters ist durch STATUSCLASSNAME definiert. In der Dokumentation steht, dass Status Bars automatisch eine WM_SIZE Nachricht erhalten. Aus den WM_SIZE-Handler der WindowProc() habe ich keinen Winfluss.



  • case WM_SIZE:
    MoveWindow(,,,);

    probier das mal (natürlich mit den passenden Parametern)



  • zeich mal deinen ganzen code her. du musst sie nicht selbst moven. das sollte automatisch gehen. also hast du einen fehler in deinem code.



  • OK, hier ist ein Beispiel, welches dieses Problem hat. Eigentlich reicht es, dem Status Bar Fenster eine WM_SIZE-Message zu senden, aber das will ich nicht:

    HWND MainWindow   = 0;
    HWND StatusWindow = 0;
    
    LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int ) {
        WNDCLASSEX WcEx;
        ZeroMemory( &WcEx, sizeof( WcEx ) );
        WcEx.cbSize = sizeof( WNDCLASSEX );
        WcEx.style = CS_VREDRAW | CS_HREDRAW;
        WcEx.lpfnWndProc = WindowProc;
        WcEx.hInstance = hInstance;
        WcEx.hIcon = LoadIcon( 0, IDI_APPLICATION );
        WcEx.hCursor = LoadCursor( 0, IDC_ARROW );
        WcEx.hbrBackground = ( HBRUSH )COLOR_GRAYTEXT;
        WcEx.lpszClassName = TEXT( "StatBar" );
        WcEx.hIconSm = WcEx.hIcon;
        if( !RegisterClassEx( &WcEx ) ) {
            MessageBox( 0, TEXT( "Registering the main window class failed!" ), 0, MB_OK );
        }
    
        MainWindow = CreateWindowEx( WS_EX_APPWINDOW | WS_EX_OVERLAPPEDWINDOW,
                                     TEXT( "StatBar" ),
                                     TEXT( "StatBar" ),
                                     WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                     CW_USEDEFAULT,
                                     SW_SHOWMAXIMIZED,
                                     CW_USEDEFAULT,
                                     0, 0, 0,
                                     hInstance, 0 );
        if( !MainWindow ) {
            MessageBox( 0, TEXT( "Couldn't create the main window!" ), 0, MB_OK );
        }
    
        InitCommonControls();
        StatusWindow = CreateWindowEx( 0,
                                       STATUSCLASSNAME,
                                       0,
                                       WS_CHILD | WS_VISIBLE,
                                       CW_USEDEFAULT,
                                       CW_USEDEFAULT,
                                       CW_USEDEFAULT,
                                       CW_USEDEFAULT,
                                       MainWindow, ( HMENU )1,
                                       hInstance,
                                       0 );
        SendMessage( StatusWindow, SB_SETTEXT, 0, ( LPARAM )TEXT( "Ready" ) );
    
        MSG Msg;
        while( GetMessage( &Msg, 0, 0, 0 ) ) {
            TranslateMessage( &Msg );
            DispatchMessage( &Msg );
        }
    
        if( StatusWindow ) {
            DestroyWindow( StatusWindow );
            StatusWindow = 0;
        }
    
        if( MainWindow ) {
            DestroyWindow( MainWindow );
            MainWindow = 0;
        }
    
        UnregisterClass( TEXT( "StatBar" ), hInstance );
    
        return( Msg.wParam );
    }
    
    LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
        switch( uMsg ) {
            case WM_DESTROY:
                PostQuitMessage( 0 );
                break;
            default:
                return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
        }
    
        return( 0 );
    }
    


  • Hat keiner ne Idee?



  • Wieso willst du WM_SIZE nicht selber senden? Ist doch nicht viel Arbeit.

    cya



  • Zugegebenermassen ist das nicht viel Arbeit, selber WM_SIZE zu senden, aber ich finde es nur sehr merkwuerdig, das die MSDN sagt, dass das Parent-Window diese Nachricht automatisch an alle Child-Windows sendet. Das funktioniert ja auch bei allen Fenstern mit einer von mir registrierten Fensterklasse, nur halt nicht bei STATUSCLASSNAME. Also wenn ich wirklich keinen Fehler in meinem Code habe, dann muss ich wohl selber ne WM_SIZE schicken.



  • schau die mal die funktion EnumChildWindows näher an "google oder so"


Anmelden zum Antworten