PuppetMaster Geschrieben 3. März 2004 Geschrieben 3. März 2004 Hi zusammen! Ich poste hier jetzt einfach mal rein, in der Hoffnung das hier auch ein paar VC++ PhreakZ dabei sind Main Problem: Ich versuch 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. :eek: 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); } [/php] Vielleicht seht ihr ja meinen Fehler :confused: Zitieren
Guybrush Threepwood Geschrieben 3. März 2004 Geschrieben 3. März 2004 Füg mal am Anfang von beiden Funktionen folgende Zeile ein: memset(&si,0,sizeof(si); Zitieren
PuppetMaster Geschrieben 3. März 2004 Autor Geschrieben 3. März 2004 das hilft leider auch nicht, immer noch der selbe effekt. Ich verstehs echt nicht... :confused: Zitieren
Klotzkopp Geschrieben 3. März 2004 Geschrieben 3. März 2004 Werden vielleicht beide Funktionen aufgerufen, wenn du eine Scrollbar betätigst? P.S.: Du solltest bei HScroll die Breite und bei VScroll die Höhe des Bildes nehmen, nicht andersrum. Zitieren
PuppetMaster Geschrieben 3. März 2004 Autor Geschrieben 3. März 2004 Ja genau das passiert. Aber ich kann mir nicht erklären warum!? P.S. ups, korrigiert Zitieren
Klotzkopp Geschrieben 3. März 2004 Geschrieben 3. März 2004 Passiert das auch, wenn du die ScrollWindow-Aufrufe auskommentierst? Wie sieht die MessageMap aus? Zitieren
PuppetMaster Geschrieben 3. März 2004 Autor Geschrieben 3. März 2004 Wenn ich ScrollWindow() auskommentiere gehts (allerdings wird das Bild nicht gescrollt) Hier die MessageMap BEGIN_MESSAGE_MAP(CPCCView, CView) //{{AFX_MSG_MAP(CPCCView) ON_WM_LBUTTONDOWN() ON_WM_HSCROLL() ON_WM_VSCROLL() //}}AFX_MSG_MAP // Standard-Druckbefehle ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() [/PHP] Zitieren
Klotzkopp Geschrieben 3. März 2004 Geschrieben 3. März 2004 Ist der Parameter pScrollBar bei den Doppelaufrufen jeweils derselbe? Zitieren
PuppetMaster Geschrieben 3. März 2004 Autor Geschrieben 3. März 2004 Ich hoffe ich hab dich jetzt richtig verstanden Also bei beiden Paramtern von pScrollBar sagt mir der Debugger folgendes: pScrollBar = 0x00000000 {CScrollBar hWnd = ????} CWnd = CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden. Zitieren
PuppetMaster Geschrieben 4. März 2004 Autor Geschrieben 4. März 2004 Ich habs hinbekommen! 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)); }[/php] Danke nochmal für die Hilfe (= Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.