ScrollBar!!
-
Hallo,
ich habe wieder einmal ene Frage.
Visual Studio fügt meinem Programm eine Vertikale Scrollbar hinzu sobald genügend Steuerelemente vorhanden sind, die also über den unteren Bidschirmrand hinausgehen.
Nun benötige ich eine Methode um rauszufinden wieviele Pixel der Screen nach unten gescrollt wurde.
-
Was hast Du denn für ein Programm? SDI mit CFormView? Du bekommst WM_VSCROLL Nachrichten gesendet, wenn gerollt wird. Gleichfalls kannst Du GetScrllInfo aufrufen, ebenfalls gibt es ja noch die CScrollView Funktionen der MFC wenn Du einen CFormView verwendest!
-
SDI mit CFormView
-
Und wie kann ich der Scrollbar einen eventhandler zufügen?
Wie heisst dieses ScrollbarObjekt? Ich habe es ja nicht selber erstellt.
-
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); }
-
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);
-
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?
-
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“