Text auf Desktop schreiben
-
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
-
sollte es nicht
pDC.m_hDC = ::GetDC(pWnd->m_hWnd);
anstatt pDC.m_hDC = ::GetDC(NULL); heißen?
mit NULL kriegt man doch keinen Handle zurück oder versteh ich da was falsch?
lg
Mike
-
If this value is NULL, GetDC retrieves the DC for the entire screen.
-
achja ... da sollte man das brett vorm Kopf wegnehmen *ggg*
DAnke
Was ich aber noch immer nicht hingekriegt habe, ist das der Text nur auf dem Desktop ist aber unter allen Fenstern.
Jmd. ne Idee?
DAnke
lg
Mike