www.mikrocontroller.net

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


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso... Natürlich für Windows!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M.Bubestinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Witzbold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hintergund Farbe transparent

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

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Pascal [...] OK, aber C tu ich mich schwer.

Pascal ist ja verwandt mit Algol, also:
#define IF      if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI      ;}

#define BEGIN   {
#define END     }
#define SWITCH  switch(
#define IN      ){
#define ENDSW   }
#define FOR     for(
#define WHILE   while(
#define DO      ){
#define OD      ;}
#define REP     do{
#define PER     }while(
#define DONE    );
#define LOOP    for(;;){
#define POOL    }

Courtesy of Steve Bourne ;-)

SCNR,
Andreas

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: winapihacker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
HDC toplevelHdc = GetGC(0);
Rectangle(toplevelHdc, 50,50, 100,100);
ReleaseDC(toplevelHdc);

Autor: NeuerGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Weyhrauch (thomas100)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: NeuerGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: winapihacker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Thomas Weyhrauch (thomas100)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Witzbold (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.