Scrollbars
-
Hi zusammen!
Ich hab folgendes Problem:
Ich hab ne MDI-Anwendung, in der ich in den Childs Bilder anzeige (mit Hilfe der Bild-KLasse aus der FAQ).
Jetzt kommt es natürlich vor, das ein Bild größer ist, als der Anzeige-Bereich erlaubt. D.h. ich müsste scrollen um den rest sehen zu können. Aber ich hab keine Ahnung wie ich das anstellen soll. Ich gucke die ganze Zeit schon in der MSDN nach usw, aber ich verstehs einfach nicht
Wie fange ich denn überhaupt so ein OnScroll-Event ab?
Anzeigen lasse ich sie mitEnableScrollBarCtrl(SB_HORZ, TRUE);Aber wie bekomm ich denn da jetzt mit, wann gescrollt wird?? und in welche Richtung?
Ich hoffe ihr wisst was ich meine und könnt mir helfen

P.S. kann es sein das die Suchfunktion immer noch spinnt? Ich bekomme nämlich für fast alle suchanfragen keine Beirtäge angezeigt
-
Es gibt wenn ich mich recht erinnere WM_VSCROLL und WM_HSCROLL. Die kannst du fangen.
-
Danke das hilft mir schon was weiter

-
Hi zusammen, hab meinen alten thread noch mal rausgekramt. Ich versuch jetzte ein Bild zu scrollen, aber das gelingt mir nicht wirklich so wie ich das gern hätte.
Wenn ich zB nach unten scrolle, wir automatisch mit nach rechts gescrollt, umgekehrt genauso. Scrolle ich nach oben, wird automatisch nach links gescrollt.

So hab ich das ganze implementiert:
void CPCCView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(SB_HORZ, &si, si.fMask); hscroll = si.nPos; switch(nSBCode) { case SB_PAGERIGHT: si.nPos += si.nPage; break; case SB_LINERIGHT: si.nPos += 2; break; case SB_PAGELEFT: si.nPos -= si.nPage; break; case SB_LINELEFT: si.nPos -= 2; break; case SB_THUMBPOSITION: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS; SetScrollInfo(SB_HORZ, &si, TRUE); GetScrollInfo(SB_HORZ, &si); //Bei Positionsänderung: Fenster horizontal rollen if(si.nPos != hscroll) { ScrollWindow(m_Image->m_Height * (hscroll - si.nPos), 0, NULL, NULL); } CView::OnHScroll(nSBCode, nPos, pScrollBar); } void CPCCView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(SB_VERT, &si, si.fMask); vscroll = si.nPos; switch(nSBCode) { case SB_PAGEDOWN: si.nPos += si.nPage; break; case SB_LINEDOWN: si.nPos += 2; break; case SB_PAGEUP: si.nPos -= si.nPage; break; case SB_LINEUP: si.nPos -= 2; break; case SB_TOP: si.nPos = si.nMin; break; case SB_BOTTOM: si.nPos = si.nMax; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS; SetScrollInfo(SB_VERT, &si, TRUE); GetScrollInfo(SB_VERT, &si); //Bei Positionsänderung: Fenster vertikal rollen und aktualisieren if(si.nPos != vscroll) { ScrollWindow(0, m_Image->m_Width * (vscroll - si.nPos) , NULL, NULL); UpdateWindow(); } CView::OnVScroll(nSBCode, nPos, pScrollBar); }Vielleicht seht ihr ja meinen Fehler

-
+push+
-
Benutze CScrollView für deine Childfenster.
Da ist die Scrollfunktionalität schon teilweise mit eingebaut.
Turbobrain
-
Aber das ich nutze doch CScrollView, weil bei meinem MDI-Child erbt CView von CSrollview.
-
Wenn ich ScrollWindow() auskommentiere, dann laufen die Bildleisten so wie sie sollen.
Ich versteh einfach nicht warum sich beide Scrollleisten bewegen, wenn ich nur EINE betätige. Warum passiert dieser Parallel-Aufruf? Und wie bekomm ich den Weg?

-
Ich hab das Problem gelöst!

Es lag an der OnDraw Methode. In dieser hab ich die Scrollleisten ständig neuzeichnen lassen, daher hat das Prog wohl auch immer beide Scrollbars bewegt...
Habs jetzt einfach über ein Flag gelöst. Wenn das erste mal gezeichnet wird, wird nach dem zeichnen der Scrollbars das Flag auf "true" gesetzt und danach, werden die Scrollbars nicht weiter neugezeichnet.

void CPCCView::OnDraw(CDC* pDC) { CPCCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(!m_first) { m_Image->Load(pDoc->GetPathName()); //Vertikale Scrollbar anpassen, positionieren und neuzeichnen si.nMax = m_Image->m_Height; si.nPage = m_Image->m_Height/2; this->SetScrollInfo(SB_VERT, &si, TRUE); //Horizontale Scrollbar anpassen, positionieren und neuzeichnen si.nMax = m_Image->m_Width; si.nPage = m_Image->m_Width/2; this->SetScrollInfo(SB_HORZ, &si, TRUE); m_first = true; } //Bild zeichnen m_Image->UpdateSizeOnDC(pDC); //m_Image->Show(pDC, CPoint(0,0), CPoint(m_Image->m_Width, m_Image->m_Height), 0,0); m_Image->Show(pDC, CRect(0, 0, m_Image->m_Width, m_Image->m_Height)); }+freu+
-
Interessanter Beitrag
Bitte in die FAQ stellen 
Merci
-
*push*