Forum: PC-Programmierung In C: Text auf den Bildschirm schreiben, ohne Fenster?


von Basti (Gast)


Lesenswert?

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?

von Basti (Gast)


Lesenswert?

Achso... Natürlich für Windows!

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Basti (Gast)


Lesenswert?

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

von U.R. Schmitt (Gast)


Lesenswert?

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.

von M.Bubestinger (Gast)


Lesenswert?

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 :(

von Witzbold (Gast)


Lesenswert?

>Hintergund Farbe transparent

geile Idee! Und wie ist der RGB-Wert für transparent?

von Andreas F. (aferber)


Lesenswert?

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

von Thomas W. (thomas100)


Lesenswert?

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

von winapihacker (Gast)


Lesenswert?

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);

von NeuerGast (Gast)


Lesenswert?

@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.

von Basti (Gast)


Lesenswert?

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.

von Thomas W. (thomas100)


Angehängte Dateien:

Lesenswert?

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

von Basti (Gast)


Lesenswert?

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)?

von NeuerGast (Gast)


Lesenswert?

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.

von winapihacker (Gast)


Lesenswert?

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);

von Thomas W. (thomas100)


Angehängte Dateien:

Lesenswert?

@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

von Frank (Gast)


Lesenswert?

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.

von Witzbold (Gast)


Lesenswert?

@ 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....

von D. I. (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas W. (thomas100)


Lesenswert?

@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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas W. (thomas100)


Lesenswert?

@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
Noch kein Account? Hier anmelden.