Text auf Desktop schreiben
-
Hallo,
ich habe gerade das hier ausprobiert:
http://www.c-plusplus.net/forum/viewtopic.php?t=39044Funktioniert, aber ich muss diese 2 Dinge anders machen:
1. Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.
2. Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.Jemand eine Idee, wie ich das mache?
mfg
trequ
-
trequ schrieb:
Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.
Das geht so
pDC.SetBkMode(TRANSPARENT); pDC.TextOut(rec.Height()/2,rec.Width()/2," Test ");
trequ schrieb:
Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.
Jemand eine Idee, wie ich das mache?
Der Text wird auf dem Desktop geschrieben und kann nicht "überlappt" werden,
da du ja den DC des Desktops holst.Gruß
:: NoName ::
-
Hallo,
:: NoName :: schrieb:
trequ schrieb:
Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.
Das geht so
pDC.SetBkMode(TRANSPARENT); pDC.TextOut(rec.Height()/2,rec.Width()/2," Test ");
Danke! Das funktioniert schon mal wunderbar. Sogar die Farbe kann ich setzen.
Irgend eine Idee, wie man die Textfarbe abhängig von der Hintergrundfarbe macht?
Hintergrund = Weiß -> Text = Schwarz
Hintergrund = Schwarz -> Text = Weiß
usw...?:: NoName :: schrieb:
trequ schrieb:
Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.
Jemand eine Idee, wie ich das mache?
Der Text wird auf dem Desktop geschrieben und kann nicht "überlappt" werden,
da du ja den DC des Desktops holst.Gruß
:: NoName ::Ich glaube du hast mich falsch verstanden.
Wenn ich das Programm Outlook starte und anschließend mein Programm anweise, jetzt etwas auf den Desktop zu schreiben, wird es über Outlook geschrieben.
Es soll aber "hinter" Outlook erscheinen, damit outlook nicht verdeckt wird.mein Code sieht so aus:
void CMyTestDlg::OnButton() { CWnd *pWnd; // Zeiger auf ein CWnd Objekt CRect rec; // CRect objekt pWnd = GetDesktopWindow(); // ich hole mir das Dektopfenster pWnd->GetWindowRect(rec); // hole mir die Aktuelle Auflösung CDC pDC; // Gerätekontext pDC.m_hDC = ::GetDC(NULL); // API Aufruf mit dem ich mir das // Desktop Handle hole. pDC.SetBkMode(TRANSPARENT); pDC.SetTextColor(RGB(255,255,0)); pDC.TextOut(2,5," Test 1"); pDC.SetTextColor(RGB(255,100,255)); pDC.TextOut(50,12," Test 2"); pDC.SetTextColor(RGB(150,2,80)); pDC.TextOut(90,3," Test 3"); }
-
Hallo,
mir fällt gerade was anderes auf:
Kann man nicht auch ein Fenster "Transparent" machen?
Das Endergebniss soll etwa so aussehen, wie die Wetter-Info auf diesem Foto:
http://images.mandrakesoft.com/img/screenshots/mdk100-scr1.jpg
(Ich weiß, Linux und Windows ist ein Unterschied...)mfg
trequ
-
Hi @all!
Das ist das erste mal, das ich Code von diesem Forum ausprobiere.
Bin fortgeschrittener Anfänger, vielleicht kann mir pls jemand helfen.Bei obenstehen Code (Text auf Desktop)
erhalte ich beim kompilieren folgenden Error:
*error C2440: '=' : 'HWND' kann nicht in 'CWnd ' konvertiert werdendas bezieht sich auf folgende Zeile:
pWnd = GetDesktopWindow(); // ich hole mir das Dektopfenster
Kann ich das irgendwie typcasten, oder anders beheben?
Danke
lg
Mike
-
Konnte es selber finden
Lösung:
pWnd = CWnd::GetDesktopWindow();
-
soweit so gut, das ganze funktioniert ABER:
1. Der Text bleibt nicht stehen! (wenn man ein Fenster darüber schiebt und dann wieder minimiert ist er wieder weg).
2. Es dauert eine Zeitlang bis der Text am Desktop steht.
3. Wie oben schon erwähnt, wird der Text auch über offene Fenster geschrieben (wenn eines offen ist)
Jemand eine Idee wie man die 3 Probleme lösen könnte?
Danke
lg
Mike
-
trequ schrieb:
Danke! Das funktioniert schon mal wunderbar. Sogar die Farbe kann ich setzen.
Irgend eine Idee, wie man die Textfarbe abhängig von der Hintergrundfarbe macht?
Hintergrund = Weiß -> Text = Schwarz
Hintergrund = Schwarz -> Text = Weiß
usw...?Ich würde spontan sagen, du musst eine inverse Brush für die Textfüllung setzen. Schau mal in die MSDN.
-
SunB schrieb:
1. Der Text bleibt nicht stehen! (wenn man ein Fenster darüber schiebt und dann wieder minimiert ist er wieder weg).
Das liegt daran, dass du den Text immer wieder neu Zeichnen musst...
Such mal im Board nach Hinweisen.SunB schrieb:
2. Es dauert eine Zeitlang bis der Text am Desktop steht.
Hmm, hab den Code getestet und bei mir geht es blitzschnell...
Gruß
:: NoName ::
-
ad 1. ich werd noch mal suchen ,) (irgendwelche hinweise nach was ich genau suche *ggg* ?)
ad 2.
Ich hab eine Konsolenanwendung mit MFC, es dauert ein wenig bis der Text erscheint, keine Ahnung an was das genau liegt.thx 4 answer
Mike
-
Zu 1: Hmm, da du ja eine Konsolenanwendung benutzt, wird es ein wenig
schwieriger alles immer neu zu zeichnen. Mit neu zeichnen meine ich das
du den Code, zum schreiben auf dem Desktop, zum Bsp.: jede Sekunde
aufrufst, damit der Text immer wieder neu geschrieben wird...Gruß
:: NoName ::
-
Hallo,
ich will im Prinzip nur eine Nachricht auf den Desktop schreiben, wie es z.B. die Logitech Software macht, wenn man auf einen Sonder-Knopf der Tastatur drückt.
Wie ich den Text transparent auf den Desktop kriege, habe ich bereits rausgefunden.
Wie ich die Schriftfarbe setze auch.Aber wie kriege ich nach x Sekunden den Text wieder weg?
Mit Leerzeichen überschreiben funktioniert nicht...Danke für die Info.
mfg
trequ
-
trequ schrieb:
Aber wie kriege ich nach x Sekunden den Text wieder weg?
Vielleicht könntest du einfach mit UpdateWindow() oder Invalidate() etc. Das window wo der Text ist aktualisieren. Dann verschwindet der Text, da er ja nicht neu gezeichnet wird...
Gruß
:: NoName ::
-
ok, das neu schreiben ist mir klar, kann man ja zum Test in einer Schleife machen. Leider steht der Text dann immer am aktuellen Fenster und nicht direkt auf dem Desktop (hintergrund).
(jemand dafür noch eine IDee?)danke
lg
Mike
-
SunB schrieb:
ok, das neu schreiben ist mir klar, kann man ja zum Test in einer Schleife machen
In eine Schleife würde ich das nicht machen, es wäre möglich das der Text anfängt zu 'flimmern' ...
Gruß
:: NoName ::
-
wenn nicht in einer Schleife, wie dann? (sorry bin anfänger)
-
Hmm, evtl: so
Du schreibst dir eine eigene Funktion
int WriteText() { CWnd *pWnd; // Zeiger auf ein CWnd Objekt CRect rec; // CRect objekt pWnd = CWnd::GetDesktopWindow(); // ich hole mir das Dektopfenster pWnd->GetWindowRect(rec); // hole mir die Aktuelle Auflösung CDC pDC; // Gerätekontext pDC.m_hDC = ::GetDC(NULL); // API Aufruf mit dem ich mir das // Desktop Handle hole. pDC.TextOut(rec.Height()/2,rec.Width()/2,"hallo Chris"); // und schließlich schreibe ich den Text mit dem Dc return WriteText(); }
Und später natürlich aufrufen
Gruß
:: NoName ::
-
Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?
Mike
-
SunB schrieb:
Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?
Ja ...
Gruß
:: NoName ::
-
:: NoName :: schrieb:
SunB schrieb:
Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?
Ja ...
Gruß
:: NoName ::Danke
lg
Mike