Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

MFC: Graphik beschneiden

Empfohlene Antworten

Veröffentlicht

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:

tabelle.gif

Scrollen kann man in der Tabelle auch und das klappt auch.

tabelle2.gif

Ich bekomme jedoch Probleme, wenn das Fenster durch ein anderes verdeckt wird und dann sieht das ganze folgendermaßen aus:

tabelle3.gif

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.

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.

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.