Veröffentlicht 25. November 200420 j 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.
28. November 200420 j 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.
30. November 200420 j Entwickle je ein eignes Control für die Tabelle, Spalten- und Zeilenbezeichnung. Basisklasse CWnd
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.