RECT r; GetClientRect(...); Ich bitte um Präzision!



  • Hallo zusammen.
    (...Ich schreibe gerade eine Art Scripteditor und dazu einen compiler und wo weiter.. Nun bin ich gerade bei der Programmmaske angekommen:)

    Ich habe auf meinem Hauptfenster:

    (-Unten eine Statusbar (Spielerei...))

    -Ein RichEdit Textfeld
    - Und schließlich zwei ListBoxen Rechts, welche die Callbacks + Befehle anzeigt;

    Folgendes Problem:

    Bei jeder Fenstergrößenänderung muss ja gepainted werden.
    Um die Fenster immer proportional im Gesamtfenster positionieren zu können,
    verwende ich RECT r; und GetClientRect(...);

    Mit r.bottom/2 kann man beispielsweise den (normalerweise EXAKTEN) Mittelpunkt der weissen Fensterfläche errechnen.

    Doch beim Verändern der Fenstergröße machen die ListBoxen zicken:
    Man ziehe gleichmäßig die untere Fensterseite nach unten (Größenveränderung nach unten), so reagieren die ListBoxen nicht mit einem gleichmässigen Folgen (sodass Abstand zw. Unterster ListBox und Statusbar zB. proportional bleiben)
    sondern folgen eine Zeit lang brav, dann machen Sie einen Sprung nach unten (und überschneiden die Schöne Statusbar ><), ein paar Pixel weiter unten folgen Sie wieder und dann wieder ein Sprung...

    Ich.. Weiss das ist schwer mit Worten zu beschreiben...

    Meine Frage: Was stimmt da nicht mir den Ausgerechneten Fensterpositionen ?

    // HWND cblst; "Callbackliste"
    
    /* Vorheriges Fenster zerstören */
    DestroyWindow(cblst);
    
    /* Rect struktur von Windows */
    RECT r; GetClientRect(hWnd,&r);
    
    /* ListBox erbeut erstellen */
    cblst=CreateWindowEx(0,WC_LISTBOX,TEXT(""),LBS_STANDARD|WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_HSCROLL|LBS_SORT,
    r.right-238,r.bottom/2-5,240,r.bottom/2-12,hWnd, 0, NULL,NULL); /* Beim r.bottom/2-12 hakts(?) */
    


  • Listboxen passen ihre grösse selbst an, und zwar so, dass "überschüssiger" Platz unten einfach weg gemacht wird. Anders gesagt: wenn du die List-Box so gross machst dass 2,738 Zeilen Text reinpassen, dann passt die List-Box die Grösse so an dass es genau 2 Zeilen sind. Sie nutzt also nach unten hin nicht alles was du ihr gibst.

    Gibt IIRC irgend einen LBS_ Style den man setzen kann, der das deaktiviert.

    p.S.:

    LBS_NOINTEGRALHEIGHT
    http://msdn.microsoft.com/en-us/library/bb775149(VS.85).aspx



  • LBS_NOINTEGRALHEIGHT



  • Vielleicht noch als Bemerkung zum Quelltext, sofern du es in deinem Programm auch so machst, du solltest die Listboxen nicht bei jedem resize/repaint neu erstellen. Sieh dir hierzu z.B. mal MoveWindow an.



  • Danke

    PS:
    Wirklich ? Gut ich nutz MoveWindow

    [Hab mich schon gefragt, warum Notepad oder Paint beim painten nicht so "ruckeln" :)]


Anmelden zum Antworten