CListCtrl scrollbars event



  • Hallo zusammen,

    ich habe folgendes Problem:
    Ich habe von der Klasse CListCtrl abgeleitet und muss nun irgendwie mitbekommen, wenn die Scrollbars aus- oder eingeblendet werden. Ich habe mich bereits in die WindowProc gehängt und WM_STYLECHANGED abgefangen. Dort kommt aber leider kein event an, zumindest nicht wenn die Scrollbar aus/eingeblendet wird.
    Es würde mir auch schon reichen wenn ich es mitbekomme, dass sich das client rect meines controls geändert hat (die scrollbars liegen ja außerhalb). Dafür gibt es aber anscheinend kein event.
    Habe mich bereits mit Spy++ bemüht aber nichts brauchbares gefunden 🙄
    Hat von euch vielleicht jemand einen Idee?

    VG
    Thomas


  • Mod

    Nein. Ein direktes Event gibt es nicht.
    Schau mal nach WM_WINDOWPOSCHANGING, oder WM_NCCALCSIZE.

    Aber mal grundsätzlich:
    Wann kann ein Scrollbar erzeugt werden..
    1. Nach dem Hinzufügen von Items
    2. Nach dem Hinzufügen von Columns oder dem Ändern der Spaltenbreite.

    Es bleiben also nur:
    LVM_INSERTITEM, LVM_INSERTCOLUMN, LVM_SETCOLUMNWIDTH die zu beobachten wären.
    Just my 2 Cents.



  • Hallo,

    WM_NCCALCSIZE habe ich bereits probiert. Das funktioniert zuverlässig, wenn die Scrollbar eingeblendet wird. Wenn sie ausgeblendet wird, dann bekomme ich zwar das event, meine client area ist jedoch immer noch die alte (also inclusive scrollbar).

    Ich habe auch schon auf das einfügen von items reagiert. Hier habe ich auch wieder das Problem, dass die client area nach dem einfügen nicht immer stimmt. Das CListCtrl macht das irgendwann später.

    Bin echt kurz davor in custom draw zu überprüfen ob sich an dem client bereich etwas geändert hat und wenn ja mir ein selbst definiertes event zu schicken.
    Aber das ist ja eigentlich auch albern, oder?


  • Mod

    Und wenn Du WM_NCCALCSIZE behandeln lässt und danach prüfst?
    Also nach dem Aufruf von Default();



  • Geht leider auch nicht.
    Das witzige ist, dass beim einblenden das event mehrmals geschickt wird. Beim ersten mal ist das client rect auch noch unverändert.
    Beim ausblenden kommt das event jedoch nur 1 mal.



  • Hallo,

    ich habe das Problem gelöst.
    Man darf auch nach dem Aufruf des default handlers nicht erwarten, dass GetClientRect den neuen client Bereich zurückgibt (zumindest nicht innerhalb des handlers). In einem Test Projekt war das zwar immer der Fall, in der Produktiven Software jedoch nicht immer.
    Also habe ich einfach rgrc[0] verwendet. Dieses rect enthält den neu berechneten client Bereich.

    void CListCtrlColHdl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
    {
    CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);

    CRect rect(lpncsp->rgrc[0]);
    resizeVisibleColumnsRel(rect, false);
    }



  • Die Koordinaten beziehen sich auf den parent, müssen also noch umgerechnet werden:
    GetParent()->ClientToScreen(rect);
    ScreenToClient(rect);


Log in to reply