ScrollBar!!



  • Afaik bekommt nicht der Scrollbar diesen Event, sondern das übergeordnete Fenster (also dein View-Objekt).



  • Also immer wenn ich scrolle soll CFormView::GetScrollBarInfo aufgerufen werden.
    Also dachte ich, ich muss der Scrollbar ein eventhandler zufügen, oder wie soll das sonst funktionieren??



  • Ich habe nun folgendes hinzugefügt, doch leider fehlt mir ein Parameter:

    void CParView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    	CFormView::GetScrollInfo(SB_VERT, ??????, SIF_ALL);
    	CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    
    typedef struct tagSCROLLINFO { 
        UINT cbSize; 
        UINT fMask; 
        int  nMin; 
        int  nMax; 
        UINT nPage; 
        int  nPos; 
        int  nTrackPos; 
    	}   SCROLLINFO, *LPSCROLLINFO; 
    typedef SCROLLINFO CONST *LPCSCROLLINFO;
    

    Wie funktioniert das mit dem Pointer auf LPSCROLLINFO??



  • Erstmal brauchst du die Struktur nicht von Hand zu definieren - die steht schon so in den WinAPI-Headern.

    Und zweitens mußt du dir stattdessen eine Variable von dem Typ anlegen:

    void CParView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        SCROLLINFO si;
        CFormView::GetScrollInfo(SB_VERT, &si, SIF_ALL);
        TRACE("Scroll to Position %d\n",si.nPos);
        ...
    
        CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    

  • Mod

    maRKus23 schrieb:

    SDI mit CFormView

    Nochmal grundsätzlich: Was ist Dein Problem? SDI mit CFormView macht alles automatisch. Was baruchst Du?



  • Ich brauchte eine Methode die mir die Anzahl der gerollten Pixel liefert.
    Ich habe das dann so gemacht:

    void CParView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {	
             SCROLLINFO scrollinfo;
    	CFormView::GetScrollInfo(SB_VERT,&scrollinfo, SIF_ALL);
    	CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    

    wenn ich nähmlich scrolle und dann die Fenster neuzeichnen lasse, befinden sie sich nicht mehr an der Stelle an der sie sein solten, da die Client-area verschoben wurde.

    Also mach ich das so:

    for(j=0; j<5; j++)pointWindowPos[0][j].SetPoint(0, iYPos[0][j] - scrollinfo.nTrackPos);
    

  • Mod

    Das neuzeichnenklappt also ncith? Wie machst Du das?
    IMHO sorgt auch hier CScrollView für die korrekte Behandlung und Einstellung des DCs mit OnPrepareDC.
    Du musst in Deinem WM_PAINT Handler hier entsprechend reagieren. Nicht wenn gerollt wird.



  • So wie ich es gemacht habe klappt jetzt alles 🙂



  • Was heißt IMHO?


  • Mod

    http://de.wikipedia.org/wiki/Liste_der_Abkürzungen_(Netzjargon)

    IMHO =
    Meistens: „In My Humble Opinion“ - „Meiner unmaßgeblichen/bescheidenen Meinung nach“,
    Seltener: „In My Honest Opinion“ - „Meiner aufrichtigen Überzeugung nach“


Anmelden zum Antworten