Hi, ich möchte ein Programm schreiben, dass ähnlich XOSD unter Linux in der Lage ist, einen beliebigen Text als Overlay au den Bildschirm zu schreiben. Geht das in C überhaupt?
Darf es auch C++ sein? http://www.codeproject.com/KB/GDI-plus/DesktopLyrics.aspx http://www.codeproject.com/KB/static/BigClock.aspx
naja, c++ ist gar nicht mein Fall, ich hab schon mit C schon so Probleme... Basic, Pascal Assembler OK, aber C tu ich mich schwer. MMhh naja dann muss wohl weiter googlen
Was meinst Du mit overlay??? Ent weder Du hast eine Windowsanwendung, und dann hast Du schon ein Fenster, oder du hast eine Konsolenanwendung, dann hast Du printf(...); Alternativ gibt es noch Windows Funktionen für Pop up Message Boxen.
Tipp: Ein normales Fenster aufmachen, Hintergund Farbe transparent und das Fenster selbst "undecorated" machen... Vl kommst du damit weiter..in C kann ich dir nicht helfen :(
>Hintergund Farbe transparent
geile Idee! Und wie ist der RGB-Wert für transparent?
Basti schrieb: > Pascal [...] OK, aber C tu ich mich schwer. Pascal ist ja verwandt mit Algol, also:
1 | #define IF if(
|
2 | #define THEN ){
|
3 | #define ELSE } else {
|
4 | #define ELIF } else if (
|
5 | #define FI ;}
|
6 | |
7 | #define BEGIN {
|
8 | #define END }
|
9 | #define SWITCH switch(
|
10 | #define IN ){
|
11 | #define ENDSW }
|
12 | #define FOR for(
|
13 | #define WHILE while(
|
14 | #define DO ){
|
15 | #define OD ;}
|
16 | #define REP do{
|
17 | #define PER }while(
|
18 | #define DONE );
|
19 | #define LOOP for(;;){
|
20 | #define POOL }
|
Courtesy of Steve Bourne ;-) SCNR, Andreas
Schau dir mal die Beispiele an, die Stefan B. gepostet hat. Da musst du kein C++ können, um die zu verstehen. Du solltest dich allerdings gut mir der Windows-API auskennen! Es gibt grundsätzlich drei Möglichkeiten, so was zu machen. Alle drei habe gemeinsam ein Fenster, da kommst du nicht drum herum. - Du setzt die Fensterregion mit "SetWindowRgn()". Was das einfachste ist und unter allen Windowsversionen (zumindest seit Win95) läuft. - Du setzt den Fensterstil "WS_EX_LAYERED" und setzt mit "SetLayeredWindowAttributes" einen Colorkey (Beispiel 2, sollte ab Windows 2000 laufen) - Du machst es wie im Beispiel 1 mit "UpdateLayeredWindow". Das ist die leistungsfähigste Version. Mit ihr kannst du auch Teiltransparente Bereiche erzeugen. Allerdings auch die aufwändigste. GDI+ brauchst du dazu nicht zwingend. Das ganze sollte ab Windows 2000 gehen. Es gibt noch eine vierte Möglichkeit. Du zeichnest direkt auf den Desktop. Allerdings zeichnest du da nicht auf den Hintergrund, sondern über alles hinweg. Egal, welches Fenster gerade dargestellt wird. Viel Spaß und vor allem viel Gedult! Thomas
naja die einfachste Variante wäre einfach den DC des Desktops zu benutzen. Das wäre aber nur geeignet für kurze debugdrawings, da sobald windows meint, die entsprechende Region müsse neu gezeichnet werden, die malereinen wieder überschrieben werden. Andererseits bekommt niemand mit, das da was draufgemalt wurde, wenn man nicht explizit was sagt, kann es sein, dass das eigene gekritzel ewig die übermalten Bereiche verunstaltet.
1 | HDC toplevelHdc = GetGC(0); |
2 | Rectangle(toplevelHdc, 50,50, 100,100); |
3 | ReleaseDC(toplevelHdc); |
@winapihacker : Genau das hat Thomas100 doch geschrieben: > Es gibt noch eine vierte Möglichkeit. Du zeichnest direkt auf den > > Desktop. Allerdings zeichnest du da nicht auf den Hintergrund, sondern > > über alles hinweg. Egal, welches Fenster gerade dargestellt wird.
Das wäre genau das wonach ich suche, ich will einfach 2-3 Sekunden lang anzeigen, dass ein Anruf eingeht. Da müsste ich einfach für die Zeit oft genug den Text an die Stelle schreiben.
Basti schrieb: > Das wäre genau das wonach ich suche, ich will einfach 2-3 Sekunden lang > anzeigen, dass ein Anruf eingeht. Da müsste ich einfach für die Zeit oft > genug den Text an die Stelle schreiben. Grundsätzlich ja. Aber dieser Text wird nie verschwinden, außer irgend ein Fenster zeichnet sich, bzw. den Desktop neu. Selbst wenn sich der Text ändert, wirst du schon Probleme bekommen. Ich hab dir mal das Programm, das winapihacker gezeigt hat, dran gehängt. Probier selbst mal, was passiert und ob du damit leben kannst. Grundsätzlich solltest du NIE auf ein fremdes Fenster zeichnen (der Desktop ist auch ein Fenster)!! Gruß Thomas
Ha, ich verstehe. Danke. Da ist natürlich reichlich ungünstig. Gibt es eine Möglichkeit, evtl so einen gelben Popup (wie Windows das immer macht) über die API zu erzeugen, oder muss das Programm das zeichnen (Bild+text)?
Das geht. Sogar ziemlich einfach mit "Shell_NotifyIcon". Damit setzt du ein Icon in den Traybereich und kannst deinen Balloon anzeigen lassen. Danach das Icon wieder löschen. Fertig.
Thomas Weyhrauch schrieb: > Grundsätzlich ja. Aber dieser Text wird nie verschwinden, außer irgend > ein Fenster zeichnet sich, bzw. den Desktop neu. > Selbst wenn sich der Text ändert, wirst du schon Probleme bekommen. Naja, man kann natürlich auch ein redraw der ensprechenden Region erzwingen. RECT rect = {45,45, 105, 105}; InvalidateRect(0, &rect, TRUE);
@winapihacker: Ja, das stimmt schon. Aber dann flackern alle Fenster kurz auf. Und wenn er dann das zig mal macht, weil er den Text dauernt überschreiben will, hast du nur noch ein flackern. Das macht aber alles keinen Sinn und er macht sich mehr Arbeit und Ärger, als wenn er ein Fenster erzeugt und dann mit o.g. Methoden das ganze darstellt. Im Anhang das Beispielprogramm um das Invalidate erweitert. Es wird das Rechteck gezeichnet, 200ms gewartet und dann wieder Invalidiert. Und das ganze 20 mal. Wenn ein Programm meine gesamte Fensterwelt so zum wackeln bringen würde, nur um einen Anruf anzuzeigen, würde ich das Programm in die Tonne treten. Grüße Thomas
Witzbold schrieb: > geile Idee! Und wie ist der RGB-Wert für transparent? Tja, übel wenn man noch nie selbst programmiert hat, oder? Natürlich gibt es die Möglichkeit, als Hintergrundfarbe "Transparent" zu wählen. Den Rest machen die Libraryfunktionen dann automatisch.
@ Frank: oh, ich glaub nicht, dass du beurteilen kannst, ob ich programmieren kann oder nicht. Aber wenn du es so toll kannst, dann sag mir mal den Wert? Und vor allem die Libraryfunktionen würden mich brennend interessieren? Ich warte....
Witzbold schrieb: > @ Frank: > oh, ich glaub nicht, dass du beurteilen kannst, ob ich programmieren > kann oder nicht. > Aber wenn du es so toll kannst, dann sag mir mal den Wert? > Und vor allem die Libraryfunktionen würden mich brennend interessieren? > Ich warte.... schau selbst in die API?
Witzbold schrieb: > Aber wenn du es so toll kannst, dann sag mir mal den Wert? Du sollst nicht jedes Wort auf die Goldwaage legen. technisch ist die Formulierung "Hintergrund Farbe transparent" nicht korrekt, weil es sich um ein Attribut beim Fenster handelt, welches dafür sorgt, dass es keinen Hintergrund hat. Soweit hats du schon recht. Trotzdem müsste der Tip für den Fragesteller ausreichen um ihm den richtigen Weg zu weisen. Und ja: Ein Programm welches mir ungefragt auf dem Desktop rummalt, würde ich genauso wie Thomas aber sowas von schnell runterlöschen.
@Karl Heinz Buchegger Mich würde die Funktion aber auch mal interessieren, die das automatisch machen soll. Da hätte ich mir viel Arbeit gespart. Selbst die GDI+ kann sowas nicht. Manche Controls kennen den Windows-Style "WS_EX_TRANSPARENT", was aber kein transparentes Fenster erzeugt, sondern nur dafür sorgt, dass das Control keine WM_PAINT-Nachricht bekommt. Also auch nicht das, was der Fragesteller haben will. Grüße Thomas
Thomas Weyhrauch schrieb: > Manche Controls kennen den Windows-Style "WS_EX_TRANSPARENT", was aber > kein transparentes Fenster erzeugt, sondern nur dafür sorgt, dass das > Control keine WM_PAINT-Nachricht bekommt. http://www.codeproject.com/KB/winsdk/QDWndTransparency.aspx Vollkommen transparent hab ich nie gebraucht. Ich kenn das nur so (und das hat für meine Fälle genügt), dass man sich die WM_ERASEBKGND krallt und dort einfach nichts macht. Aber frag mich nicht um die Details. Ist schon zu lange her.
@Karl heinz Buchegger: So machst du das ganze Fenster transparent. Inkl. Controls und Schrift. Die Möglichkeit mit "SetLayeredWindowAttributes" hab ich weiter oben ja schon vorgestellt. Hier gings darum, den Hintergrund Transparent zu machen. Und sonst nichts. Und das macht Windows leider nicht freiwillig. Die "WM_ERASEBKGND" zu ignorieren kann aber leider auch schief gehen. Nämlich dann, wenn du ein Fenster drüber schiebst. Dann kann, muss aber nicht, das verschobene Fenster noch sichtbar bleiben, da ja auf diesen Bereich nicht neu gezeichnet wird. Es gibt aber vielleicht noch eine Möglichkeit. Du könntest dir mit WM_PRINT den Inhalt der drunterliegenden Fenster in deinen DC (Device Context)) malen lassen. Dann auf diesen DC schreiben und diesen DC dann in dein eigenes Fenster kopieren. Könnte gehen. Muss aber nicht. Gruß Thomas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.