Scrollen eines Rechtecks



  • Guten Abend,

    folgendes Problem.
    Ich zeichne eine großes Feld bestehend aus mehreren Rechtecken.

    int i1,i2;
             for(i2=10;i2<=1800;i2=i2+45)
             {
             for(i1=10;i1<=1800;i1=i1+45)
             {
             Rectangle(hDC, 10+i1,10+i2,50+i1,50+i2);
             }
             }
    

    Die Rechtecke werden auch gezeichnet, zumindest die, die auf dem Bildschirm, sichtbar sind. Selbstverständlich sind es zu viele für 1280x800, in der Größe.
    Daher muss ich das Fenster scrollen können. Die Frage ist wie.
    Der vertikale Scrollbalken funktioniert auch und nach mehreren Tage oder auch Wochen nach Suchen einer Lösung, ist die auch erstmal nur von einer Seite kopiert, damit ich wenigstens eine funktionierende Leiste habe.
    Lege ich nun einen einfachen Text mit DrawText darüber funktioniert das Scrollen des Textes. Es scheint allerdings als wären die Rechtecke als fester Hintergrund. Die DrawText Funktion hat ja als 4. Parameter ein Pointer zur Rectstruktur. Deshalb nehme ich an die Rechtecke müssen auch einen Bezug zu der Struktur haben.
    Also hab ich mal nach einer anderen Funktion zum Zeichnen von Rechtecken gesucht und bin dabei auf SetRect gestoßen, die als 1. Parameter einen Pointer zur Rectstruktur braucht. Füge ich den Pointer da ein, werden weder Rechtecke, noch der Text (mit DrawText) gezeichnet. (Frage nebenbei: SetRect bestimmt nur den Bereich, in den die Rectstructur zeichnen kann, oder?)
    Dann habe ich mal versucht erstmal die for-Schleifen auszukommentieren.

    Rectangle(hDC, 10/*+i1*/,10/*+i2*/,50/*+i1*/,50/*+i2*/);
    

    Es passiert allerdings auch schon bei einem Rechteck nichts. Wobei da ja immernoch kein Pointer zu Rectstruktur drin ist.
    Hier im Forum hab ich dazu nichts gefunden. Wie kann ich das Problem lösen? Gibt es nicht eine einfache Scrollfunktion zum Scrollen des gesamten Fensterinhaltes?

    Mit freundlichen Grüßen
    Moadeh



  • dann lies dir doch mal ganz genau die MSDN einträge durch und sieh nach, wozu denn der jeweilige LPRECT parameter ist 😉

    du suchst, glaub ich, eher nach FillRect bzw. FrameRect 😉



  • Erstmal Danke.

    Ich habe jetzt mit Framerect die Rechtecke gezeichnet allerdings weiß ich nicht wie ich dann feste Werte der Rectstruktur für das Scrollen festlegen kann.
    Ich hab das so eingebaut:

    for(i2=1;i2<=1800;i2=i2+45)
             {
             for(i1=1;i1<=1800;i1=i1+45)
             { 
                rect.left    = 10+i1;
                rect.top     = 10+i2;
                rect.right   = 50+i1;
                rect.bottom  = 50+i2;     
                FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
             }
             }
    

    Dadurch habe ich dann aber zich verschiedene Werte für rect.left etc. . Aber entweder hab ich bezüglich des Scrollens rein gar nichts verstanden, oder diese Rectstruktur setzt auch wesentlichen Daten fest. Bei dem Beispielcode den ich habe kommt die Rectstruktur in WM_SIZE vor.

    case WM_SIZE:
          {
             HDC      hDC;
             RECT     TextRect;
             rect.left    = iRand;
             rect.top     = 0;
             rect.right   = LOWORD(lParam) - iRand;
             rect.bottom  = HIWORD(lParam);
    
             TextRect     = rect;
             hDC = GetDC(hWnd);
             {
                DrawText(hDC, szText, lstrlen(szText), &TextRect, DT_WORDBREAK | DT_CALCRECT);
             }
             ReleaseDC(hWnd, hDC);
             if (TextRect.bottom > rect.bottom)
             {
                iScrollRange = (TextRect.bottom - rect.bottom) / iZeichenhoehe + 1;
                iScrollPos   = (iScrollRange < iScrollPos) ? iScrollRange : iScrollPos;
                SetScrollPos(hWnd, SB_VERT, iScrollPos, TRUE);
    
                rect.top     = -iScrollPos * iZeichenhoehe;
             }
             else
             {
                iScrollRange = 0;
                rect.top     = 0;
             }
             SetScrollRange(hWnd, SB_VERT, 0, iScrollRange, TRUE);
    
             return 0;
          }
    

    Das ist soweit auch verständlich. Die tatsächlichen Fensterwerte(rect.left etc.?) werden festgesetzt, dann wird geprüft, ob die Textausgabe zu groß für das Fenster (hier 400x300) ist, dann wird die Bildlaufleiste angepasst wenn nötig. Aber wie krieg ich jetzt meine Rechtecke da rein, ohne durch die "Lösung" oben? Die ist ja schon mehr als unlogisch. Denn auch der Fehler liegt in diesen for-Schleifen. Durch Auskommentieren, funktioniert die Bildlaufleiste wieder und scrollt auch den Text.

    Mit freundlichen Grüßen
    Moadeh



  • Hmm Schade, hat keiner im Moment die Zeit mir zu helfen, oder stell ich mich so unglaublich blöd an, dass jedem jegliche Lust vergangen ist mir zu helfen?

    Ich hoffe, es findet sich doch noch einer..

    Mit freundlichen Grüßen
    Moadeh


Anmelden zum Antworten