GDI+ Drawing über Fenster legen

MyersGer

Mitglied
Hi,

ich habe folgendes vor:
In einem Spiel sollen diverse Nachrichten und Informationen in Schrift dargestellt werden. Dazu will ich ganz simpel die Graphics.DrawString() Methode verwenden.
Bisher habe ich versucht in eine Region zu zeichnen, schlug fehl. Dann habe ich versucht direkt in das Fenster des Spiels zu schreiben. Geht auch soweit, nur hat das Spiel natürlich so viele Refreshes, dass mein Drawing gleich wieder verschwindet.
Mein Denkansatz ist nun, irgendwie mein Drawing in eine Region oder so zu zeichnen und dieses element dann immer OnTop haben will.

Hat da jemand schon mal Erfahrung mit gemacht?
Oder hat jemand einen besseren Ansatz?


Danke.
 
Hi.

Speichere den Text in eine Variable, und zusätzlich Speichere noch die Uhrzeit zu der du die Nachricht ausgegeben hast.
In der Paint-Methode überprüfst du dann wie lange schon der Text ausgegeben wurde, wenn dann die Zeit erreicht ist, die es eingeblendet sein sollte, zeichne es nicht mehr.

MfG,
Alex
 
Mein Problem ist ja nicht die Ausgabe selber, sondern, dass das Spiel mein Drawing durch sein Paintereignis wieder löscht.



Zur Veranschaulichung:

Code:
Graphics g; 
Process[] pr = Process.GetProcessesByName(strProcessname);
g = Graphics.FromHwnd(pr[0].MainWindowHandle);
g.DrawString("Hallo, dies ist eine Nachricht", new Font("Arial", 22), new SolidBrush(Color.SteelBlue), 0,0);


Wenn nun der das Window neu gemalt wird, ist meine Schrift weg. Bei Spielen passiert das ja nun mal alle paar Millisekunden o.ä.. Folge: man sieht die Schrift nicht.
 
Zuletzt bearbeitet:
Code:
public class Game : Form
{

	private string message;
	private DateTime showTime;
	private bool showMessage = false;
	
	private void ShowMessage(string msg)
	{
		message = msg;
		showTime = DateTime.Now;
		showMessage = true;
	}
	
	protected override void OnPaint(object sender, PaintEventArgs pea)
	{
		Graphics gfx = pea.Graphics;
		CheckMessageState();
		if (showMessage)
		{
			gfx.DrawString(..);
		}
	}
	
	private void CheckMessageState()
	{
		if (showtime != null)
		{
			TimeSpan ts = DateTime.Now.Subtract(showtime);
			if (ts.TotalSeconds > 30)
			{
				showMessage = false;
				message = "";
				showtime = null;
			}
		else
			showMessage false;
	}
}

Wo ist das Problem?

Da du ja schon erwähnt hast, das dein Programm viele Refreshs hat wird es dann eh kein Problem sein das die Paint-Methode aufgerufen wird, und der Text nach 30 Sekunden verschwunden ist.

Alternativ kannst noch einen Thread mitlaufen haben, den du Pausierst, und der alle paar Sekunden noch refresht oder so.

MfG,
Alex

// Edit:

Herrje du oller Editierer ;) *les was er schrieb*
 
Zuletzt bearbeitet:
Ok.

Habs zuerst so verstanden das du eh in dein eigenes Programm zeichnest, dabei machst es ja in einem Fremden.

Das was du brauchst ist eine benachrichtigung wann das andere Fenster neu gezeichnet wird. Das geht wohl mittels etwas namens "Windows Hooks". Tutorials dazu gibts u.a. bei codeproject.com, musst nur rausfinden wie du benachrichtigt wirst, dass das Fenster neu gezeichnet wird.
Hab jetzt mal bisserl herumgesucht, hab aber keine Zeit mehr, muss noch anderes erledigen.
 
Zurück