witch doctor Geschrieben 25. November 2004 Teilen Geschrieben 25. November 2004 Hi, ich muss innerhalb meines Studiums ein Programm schreiben, welches Werte einliest und auch ausgibt. Ein Menüpunkt hat beschäftigt sich mit der Darstellung einer Tabelle. Das ist auch nicht weiter ein Problem. Das ganze sieht dann so aus: Scrollen kann man in der Tabelle auch und das klappt auch. Ich bekomme jedoch Probleme, wenn das Fenster durch ein anderes verdeckt wird und dann sieht das ganze folgendermaßen aus: Das ist natürlich nicht gewollt. Wie schaffe ich es, dass er den Bereich für das Neuzeichnen eingrenzt? Meine OnPaint Methode sieht bisher folgendermaßen aus: void Tabelle::OnPaint() { CPaintDC dc(this); // device context for painting int az = DemoData.get_anz_z(); //Anzahl Zeilen int as = DemoData.get_anz_s(); //Anzahl Spalten dc.SetBkMode(TRANSPARENT); /* Namen ausgeben */ CRect namen; CString name; CString sp; sp.Format("Spalte:"); CRect spa; spa.SetRect(8*abstand,abstand,0,0); dc.DrawText(sp,-1,&spa,DT_CALCRECT); dc.DrawText(sp,-1,&spa,DT_CENTER|DT_SINGLELINE|DT_VCENTER); namen.SetRect(abstand,2*abstand+feldhoehe,abstand+namenbreite,2*abstand+2*feldhoehe); void *oldfont; oldfont=dc.SelectObject(stdfont.tinybold); for(int i=0;i<az;i++) { name = DemoData.get_rname(i); dc.Rectangle(namen); //Rechteck zeichnen dc.DrawText(name,-1,&namen,DT_LEFT|DT_SINGLELINE|DT_VCENTER); namen.OffsetRect(0,feldhoehe); //Position an der y-Achse verschieben } /* Wertetabelle zeichnen */ //CRect werte; CRect spaltennummern; for(int z=0;z<az;z++) { for(int s=0;s<as;s++) { int wert = DemoData.get_wert(z,s); if(wert<0) { /* Wenn der Wert negativ ist, wird er in roter Schrift geschrieben, ansonsten in schwarz */ dc.SetTextColor(RGB(255,0,0)); } else { dc.SetTextColor(RGB(0,0,0)); } CString ausgabe; ausgabe.Format("%d", wert); //Ausgabe der Werte /* Die aktuelle Position wird abgezogen, damit man in der Tabelle scrollen kann. Die Koordinaten werden so aktualisiert. */ int xs=scrollrect.left+s*feldbreite-actpos; int ys=scrollrect.top; spaltennummern.SetRect(xs,ys,xs+feldbreite,ys+feldhoehe); dc.Rectangle(spaltennummern); CString spaltennummer; spaltennummer.Format("%i",s+1); dc.DrawText(spaltennummer,-1,&spaltennummern,DT_CENTER|DT_SINGLELINE|DT_VCENTER); int x = scrollrect.left+s*feldbreite-actpos; int y = scrollrect.top+abstand+feldhoehe+z*feldhoehe; werte.SetRect(x,y,x+feldbreite,y+feldhoehe); dc.Rectangle(werte); dc.DrawText(ausgabe,-1,&werte,DT_CENTER|DT_SINGLELINE|DT_VCENTER); } } dc.SelectObject(oldfont); } Unser Prof meinte, das wir das ganze über eine Clipping Region lösen sollten, doch so wirklich weiß ich nicht wie ich das machen soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 28. November 2004 Teilen Geschrieben 28. November 2004 Ohne Deinen Code jetzt im Detail gelesen zu haben: Der einfachste Weg dürfte es sein, die Hinweise auf zu aktualisierende Regionen zu ignorieren und immer das komplette Fenster neu zu zeichnen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
toosten Geschrieben 30. November 2004 Teilen Geschrieben 30. November 2004 Entwickle je ein eignes Control für die Tabelle, Spalten- und Zeilenbezeichnung. Basisklasse CWnd Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.