CFormview scrollen



  • Hallo!

    Ich habe folgendes Problem:
    Ich arbeite an einem MDI-Programm (Basisklasse CFormview), in dem ich mit MoveTo() u. LineTo() diverse Linien gezeichnet habe, die jedoch die Fenstergröße übersteigen. Jetzt habe ich in der CChildFrame-Klasse die Windowstyles WS_HSCROLL u. WS_VSCROLL eingegeben, damit ich Scrollbars habe.
    Dann habe ich mich in der MSDN umgesehen und folgenden Code gefunden:

    void CChildFrame::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
       int minpos;
       int maxpos;
       pScrollBar->GetScrollRange(&minpos, &maxpos); 
    
       maxpos = pScrollBar->GetScrollLimit();
    
       // Get the current position of scroll box.
       int curpos = pScrollBar->GetScrollPos();
    
       // Determine the new position of scroll box.
       switch (nSBCode)
       {
       case SB_LEFT:      // Scroll to far left.
          curpos = minpos;
          break;
    
       case SB_RIGHT:      // Scroll to far right.
          curpos = maxpos;
          break;
    
       case SB_ENDSCROLL:   // End scroll.
          break;
    
       case SB_LINELEFT:      // Scroll left.
          if (curpos > minpos)
             curpos--;
          break;
    
       case SB_LINERIGHT:   // Scroll right.
          if (curpos < maxpos)
             curpos++;
          break;
    
       case SB_PAGELEFT:    // Scroll one page left.
       {
          // Get the page size. 
          SCROLLINFO   info;
          pScrollBar->GetScrollInfo(&info, SIF_ALL);
    
          if (curpos > minpos)
          curpos = max(minpos, curpos - (int) info.nPage);
       }
          break;
    
       case SB_PAGERIGHT:      // Scroll one page right.
       {
          // Get the page size. 
          SCROLLINFO   info;
          pScrollBar->GetScrollInfo(&info, SIF_ALL);
    
          if (curpos < maxpos)
             curpos = min(maxpos, curpos + (int) info.nPage);
       }
          break;
    
       case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
          curpos = nPos;      // of the scroll box at the end of the drag operation.
          break;
    
       case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
          curpos = nPos;     // position that the scroll box has been dragged to.
          break;
       }
    
       // Set the new position of the thumb (scroll box).
       pScrollBar->SetScrollPos(curpos);
    }
    

    Da ich mich bei MDI-Progs noch nicht so auskenne, weiß ich nicht, wo die SetScrollRange()-Funktion hingehört. Wenn ich sie in die OnHScroll oben hineinschreibe, bekomme ich, wenn ich im Programm auf die Scrollbar klicke, einen Error und das Programm schmiert ab.

    Kann mir jemand helfen?



  • CFormView ist dafür gedacht, Dialoge, die im Resourceneditor erstellt wurden, innerhalb eines CView zu implementieren. Und ich habe noch keine Dialogoberfläche gesehen, auf die per MoveTo/LineTo gezeichnet wurde. Da sind nur Statics, Edits und andere Dialogelemente



  • Also ich kann auf meinem Formview-Dialog wunderbar in der Funktion OnPaint zeichnen.
    Dazu verwende ich dc.MoveTo(), dann dc.LineTo()!

    Ich bin jetzt selbst draufgekommen, wie ich mein Fenster zum Scrollen bringe, jedoch ergibt sich jetzt folgendes Problem:
    Nach dem Scrollen wird OnPaint aufgerufen und zeichnet meine Linien wieder genau an die gleiche Stelle, obwohl die Linien ja gescollt werden sollen!

    Also würde ich gerne alle schon gezeichneten Linien bei Aufruf von OnPaint() löschen und danach mit der entsprechenden Verschiebung der x- oder y-Koordinate neu zeichnen!
    Gibt es so einen Löschbefehl?

    greetz
    tompo



  • Neee, Du musst net löschen, Du musst mit dem Offset der Scrollbars zeichnen! Diesen bekommst Du so:

    CPoint ptOffset( GetScrollPos( SB_HORZ), GetScrollPos( SB_VERT));
    


  • Ich muss eben doch löschen, da die alten linien beim erneuten Aufruf von OnPaint() nicht gelöscht werden. Das Resultat: Nach ein paar mal hin-und-her-scrollen entsteht ein Wirr-Warr von Linien!
    Ich schick dir ne Mail mit Screenshots vor bzw. nach dem Scrollen!

    greetz
    tompo



  • Also ich seh da überhaupt keine Dialogelemente drauf!
    Wenn da sowas net drauf soll, nimm doch CScrollView statt CFormView


Anmelden zum Antworten