tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
4838
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Slazer Slazer ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Beiträge
    30
    Hallo,
    Wenn ich ein Fenster unter Windows erstelle, kann ich nur die absoluten Maße angeben. Der Clienbereich hat aber dann nicht die richtige Größe. Sind die Maße der Fensterränder immer gleich, oder sind die unterschiedlich? Wie kann ich diese auslesen?
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Es ist tatsächlich nicht ganz einfach, ein Fenster so gross zu machen, dass der resultierende Clientbereich exakt eine vorgebene Grösse hat. Erstens sind da natürlich Titel und Rahmen, aber was erschwerend noch dazukommt sind eventuell Menüsleisten, Statusbalken und -- ganz übel -- Scrollbalken.

    Ich habe mir mal folgende Routine gebastelt, die auch tatsächlich funktioniert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void CMeinView::SetSize( int width, int height )
    {
      int counter = 0; //- nur 5 Versuche!
      CRect rectMain, rectClient;
      for ( GetClientRect( rectClient ); 
            ( counter < 5 ) && ( rectClient.Width() != width || rectClient.Height() != height ); 
            ++counter, GetClientRect( rectClient ) )
      {
        TRACE( "rectClient: %d, %d\n", rectClient.Width(), rectClient.Height() );
        
        GetParent()->GetWindowRect( rectMain );
        int borderwidth = rectMain.Width() - rectClient.Width();
        int borderheight = rectMain.Height() - rectClient.Height();
        GetParent()->MoveWindow( rectMain.left, rectMain.top, width + borderwidth, height + borderheight );
        ((CFrameWnd*)GetParent())->RecalcLayout();
      }
    }
    Das habe ich mit MFC gemacht - ich denke aber, dass es die entsprechenden Funktionen auch als Nicht-Methoden in der WinAPI gibt. Meine Routine funktioniert übrigens für Framewindows. Falls du das nicht brauchst, kannst du den Kram mit GetParent() weglassen (es wird das Fenster selbst geändert) und auch RecalcLayout() fällt weg.

    Hilft dir das weiter?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Es gibt auch die Win32-Methode AdjustWindowRect(Ex), die je nach BOOL die zugehörige Client/Window-Size ausrechnet. Die berücksichtigt aber dummerweise keine umgeklappten Menüs und Scrollbars.

    Die funktioniert allerdings auch ohne HWND. Wenn das Fenster bereits existiert, ist's wohl besser, die Funktion von Kachelator zu nehmen, die geht auf Nummer sicher.
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    AdjustWindowRect
    Cool. Die habe ich noch nie benutzt. Muss ich mir merken.

    Wann hat das Gelerne eigentlich mal ein Ende? *Haare rauf*
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    Slazer Slazer ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Beiträge
    30
    hm ich versteh nicht recht wie man die funktion benutzt!
    kannst du des mir mal genau erklären mit parameter etc.
     

  6. #6
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Versuch es mal so:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
      RECT rect;
      // gewünschte linke obere Ecke von Clientarea
      rect.left   = 100;
      rect.top    = 100;
      // gewünschte rechte untere Ecke von Clientarea
      rect.right  = 200;
      rect.bottom = 200;
     
      // welchen Style hat das Fenster?
      DWORD dwStyle = WS_OVERLAPPED;
     
      // hat es ein Menü?  
      BOOL bMenu = FALSE;
     
      int iResult = AdjustWindowRect( &rect, dwStyle, bMenu );
      if ( iResult == 0 )
      {
        // hat nicht geklappt
        MessageBox( 0, "Fehler bei AdjustWindowRect()", "Au ha!", MB_ICONERROR );   
      }
      else
      {
        // rect enthält jetzt die benötigte Fenstergrösse und kann zum Positionieren verwendet werden
        SetWindowPos( hwndVonMeinemFenster, 
                      0, 
                      rect.left,              rect.top, 
                      rect.right - rect.left, rect.bottom - rect.top, 
                      SWP_NOZORDER );
      }
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  7. #7
    Slazer Slazer ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Beiträge
    30
    also bei mir will die methode garnicht funktionieren!
     

  8. #8
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Könntest du eventuell mal deinen Code posten?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  9. #9
    MaDsTyLe MaDsTyLe ist offline Grünschnabel
    Registriert seit
    Sep 2007
    Beiträge
    1
    Ist zwar lange her, aber es muss trotzdem mal gesagt werden:

    Sowas macht man mit GetSystemMetrics().

    Daran ist überhaupt nichts kompliziert.

    lg Max
     

  10. #10
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Nicht? Du mußt dir alle Bordertypen je nach Style raussuchen und aufaddieren, die Caption, falls vorhanden, das Menü, falls vorhanden.

    Und alles das kannst du mit einem Aufruf per AdjustWindowRect(Ex) erledigen.

    Warum das Rad neu erfinden, runder wird es nicht.
     

Ähnliche Themen

  1. BufferedImage an Fenstergröße anpassen
    Von Wassermelone im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 01.02.10, 00:13
  2. Fenstergröße an Bild anpassen
    Von d-braun im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 26.07.06, 01:13
  3. GridLayout an Fenstergröße anpassen
    Von sjostjerna im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 07.10.05, 11:45
  4. Hintergrundbild an Fenstergröße anpassen
    Von Riegel im Forum HTML & XHTML
    Antworten: 4
    Letzter Beitrag: 20.05.05, 16:56
  5. Fenstergröße anpassen
    Von uwee im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 14.01.05, 13:34