witch doctor Geschrieben 25. November 2004 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.
Bubble Geschrieben 28. November 2004 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.
toosten Geschrieben 30. November 2004 Geschrieben 30. November 2004 Entwickle je ein eignes Control für die Tabelle, Spalten- und Zeilenbezeichnung. Basisklasse CWnd
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden