Forum: PC-Programmierung Linux C Beispiel: Punkt auf Bildschirm zeichnen?


von Markus (Gast)


Lesenswert?

Kennt jemand ein einfaches Beispiel dazu?

: Verschoben durch User
von Ei der Daus (Gast)


Lesenswert?

SW?

von Martin H. (mahi)


Lesenswert?

Da ist die große Frage: was meinst Du mit Linux?

Im einfachsten Fall:
1
printf(".");
 Dann ist ein Punkt in Deiner Konsole.
Aber Du willst wahrscheinlich Pixel malen, oder?

Dann ist die Frage: Ein embedded Linux mit einem Framebuffer oder doch 
mit einem Windowmanager (aka Xorg oder Wayland/Weston) oder...

von Der Andere (Gast)


Lesenswert?

Martin H. schrieb:
> Im einfachsten Fall:printf(".");

Du kennst seine verwendete Programmiersprache? Wo hast du deine 
Glaskugel gekauft, so eine will ich auch :-)

von Der Andere (Gast)


Lesenswert?

Mist vergiss es, in der Überschrift steht es ja groß, sorry.

von Martin H. (mahi)


Lesenswert?

Ohne C wäre es halt: echo .


Wenn mal vom (Noch-)Standard ausgeht, könnte man hier 
https://en.wikipedia.org/wiki/Xlib anfangen zu lesen und sich dann hier 
https://de.wikipedia.org/wiki/Liste_von_GUI-Bibliotheken#C was 
aussuchen.

von Markus (Gast)


Lesenswert?

>Im einfachsten Fall:
>printf(".");

Ich hätte gerne ein Beispiel in C. Der Punkt soll farbig sein und an 
jede beliebige Stelle des Bildschirms innerhalb eines Fenster gezeichnet 
werden.

von Markus (Gast)


Lesenswert?

Ich habe ein Beispiel gefunden:
http://slist.lilotux.net/linux/xlib/color-drawing.c

http://slist.lilotux.net/linux/xlib/color-drawing.c

Es zeichnet etwas mehr als einen Punkt.
Es hat allerdings ein Problem: Von etwas 10 Startversuchen bleibt das 
Fenster bei gefühlten 9 Versuchen leer. Woran könnte das liegen?

von Markus (Gast)


Lesenswert?

compilieren mit:
 gcc -o toolkit1 toolkit1.c -L/usr/X11R6/lib -lX11

von HDA (Gast)


Lesenswert?

Welche Farbe soll es denn sein (Rot, Grün, ...)?
Meinst Du mit Fenster die Konsole bzw. ein Terminal oder eine richtige 
GUI-Anwendung?

von Markus (Gast)


Lesenswert?

egal

von Markus (Gast)


Lesenswert?

Marin H. schrieb
>Wenn mal vom (Noch-)Standard ausgeht, könnte man hier
>https://en.wikipedia.org/wiki/Xlib anfangen zu lesen und sich dann hier

Danke.
Ich will nicht lesen.
Ich will ein Beispiel C-File und das passende Kommando zum compilieren 
damit ich das ganze innerhalb von 3 Minuten testen kann.

von StarLord (Gast)


Lesenswert?

Ich denke wir sollten den Thread hier abbrechen.

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Markus schrieb:
> Danke.
> Ich will nicht lesen.
> Ich will ein Beispiel C-File

Das sind die besten Voraussetzungen etwas neues zu erlernen. ggg

von HDA (Gast)


Lesenswert?

Also in der einer Konsole geht es am schnellsten mit Escapesequenzen.

Beispiel um Cursor an Stelle X,Y platzieren:

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}

Farbig kannst Du es so machen:
https://stackoverflow.com/questions/3219393/stdlib-and-colored-output-in-c

von R. M. (n_a_n)


Lesenswert?

SDL ist einfach zu erlernen und erlaubt z.B.
1
  DrawPixel(screen,x,y,r,g,b);

von Linux-Frickler (Gast)


Lesenswert?

StarLord schrieb:
> Ich denke wir sollten den Thread hier abbrechen.

Wenn ein Problem nicht zu lösen ist, sollte man es auf jemand anderen 
abwälzen.

@Markus:

Vergiss Linux, damit geht das nicht. Und die ganzen Linux-Fanbois hier 
wollen das nur nicht wahrhaben und erzählen Müll.

Nimm Windows und stell deine Frage bei support.microsoft.de, da werden 
Sie geholfen.

von R. M. (n_a_n)


Lesenswert?

R. M. schrieb:
> DrawPixel(screen,x,y,r,g,b);

Das ist doch genau was der TO wollte,
ein C Beispiel um einen Punkt(Pixel) auf den Bildschirm zu 'zeichnen'.
Warum die negative Beurteilung ?

von Markus (Gast)


Lesenswert?

Autor: HDA (Gast)
schrieb:
> ..

Danke für die Antwort.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdint.h>
4
5
void gotoxy(int x,int y)
6
{
7
    printf("%c[%d;%df",0x1B,y,x);
8
}
9
10
int main(void) 
11
{
12
  puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
13
  gotoxy(10,10);
14
  printf("..............."); 
15
16
  return EXIT_SUCCESS;
17
}

Es entspricht aber nicht ganz meinen Anforderungen:
>Ich hätte gerne ein Beispiel in C. Der Punkt soll farbig sein und an
>jede beliebige Stelle des Bildschirms innerhalb eines Fenster gezeichnet
>werden.

von StarLord (Gast)


Lesenswert?

Markus schrieb:

> Es entspricht aber nicht ganz meinen Anforderungen:
>>Ich hätte gerne ein Beispiel in C. Der Punkt soll farbig sein und an
>>jede beliebige Stelle des Bildschirms innerhalb eines Fenster gezeichnet
>>werden.

Dann sende uns bitte ein vollständiges Lastenheft zu.

von Markus (Gast)


Lesenswert?

>R. M. schrieb:
>> DrawPixel(screen,x,y,r,g,b);

>Das ist doch genau was der TO wollte,

Nicht ganz:
>Ich will ein Beispiel C-File und das passende Kommando zum compilieren
>damit ich das ganze innerhalb von 3 Minuten testen kann.

von Markus (Gast)


Lesenswert?

StarLord schrieb
>Dann sende uns bitte ein vollständiges Lastenheft zu.

Bitteschön:
1. Ich hätte gerne ein Beispiel in C. Der Punkt soll farbig sein und an
jede beliebige Stelle des Bildschirms innerhalb eines Fenster gezeichnet
werden.
2. Ich will ein Beispiel C-File und das passende Kommando zum 
compilieren
damit ich das ganze innerhalb von 3 Minuten testen kann.

von StarLord (Gast)


Lesenswert?

Markus schrieb:
> StarLord schrieb
>>Dann sende uns bitte ein vollständiges Lastenheft zu.
>
> Bitteschön:
> 1. Ich hätte gerne ein Beispiel in C. Der Punkt soll farbig sein und an
> jede beliebige Stelle des Bildschirms innerhalb eines Fenster gezeichnet
> werden.
> 2. Ich will ein Beispiel C-File und das passende Kommando zum
> compilieren
> damit ich das ganze innerhalb von 3 Minuten testen kann.

Welches Linux?
Wie groß soll der Punkt sein?
Welche Entwicklungsumgebung?
Soll es in exakt 3 Minuten zu testen sein oder geht es auch schneller?
Wie soll das Fenster aussehen? Konsole? GUI Container?
Welche Hardware ist vorhanden?
Welcher Compiler?
Wie dürfen die Ressourcen ausgeschöpft werden?
Soll der Punkt an einer festen Stelle bleiben oder vielleicht sogar mit 
einem Cursor bewegt werden?
Welche Farben möchtest du alle haben?
...

Ach und wenn wir hier gerade dabei sind Wünsche zu äußern, dann will ich 
nen Ferrari und ne Frau mit dicken Hupen.

von TestX (Gast)


Lesenswert?

Du willst...

Mal im Ernst...die Leute wollen dir hier helfen und du kommst nicht mit 
infos rüber...kurz eine suchmaschine zu verwenden ist wohl auch zu 
viel...

Aber zu deiner frage...unter linux nutzt man dazu blibliotheken. Es ist 
auch ein unterschied ob du im vollbildmodus etwas zeichen willst oder in 
einem fenster deines window-managers...und ab da wird es kompliziert da 
es unter linux mehr als einen gibt.

Das einfachste wäre QT zu verwenden und sich da ein tutorial 
durchzulesen. Da hier bibliotheken gelinkt werden müssen und wiederrum 
von deinem linux abhängen solltest du bei deinem jetzigen Kenntnisstand 
eine vollintegrierte IDE für QT verwenden (findest du auf deren 
Webseite).

Letztendlich klickst du dann auf einen "play button" und dein fenster 
wird geöffnet.

von bastler (Gast)


Lesenswert?

Auf der Seite http://www.bo8h.de kannst du ein
Emulationsprogramm für einen 8-bit-Computer
herunterladen, welches Grafik enthält. Das
Compilieren ist in der Datei Emul im Verzeichnis
info beschrieben. Du müsstest das Programm für
deine Zwecke allerdings gewaltig zusammenstreichen.
Aber du kannst es als Ausgangspunkt verwenden.

von HDA (Gast)


Lesenswert?

Markus schrieb:
> Es entspricht aber nicht ganz meinen Anforderungen:

Den Beispielcode, wie man Zeichen auf der Konsole einfärbt, findest Du 
unter meinem geposteten Link.

von Gogo (Gast)


Lesenswert?

Ich will zum Mond fliegen. Zu den Kenntnissen des TO ist auch nix 
bekannt.

Schade um die Manpower die hier verblasen wird. Und ich mach mir noch 
die Mühe deinen Sch...zu lesen. So ein Mist.

von Georg A. (georga)


Lesenswert?

Markus schrieb:
> Es hat allerdings ein Problem: Von etwas 10 Startversuchen bleibt das
> Fenster bei gefühlten 9 Versuchen leer. Woran könnte das liegen?

Weil der Ersteller des Programms die Eigenschaften von X auch nur halb 
kapiert hat. Das Problem/der Vorteil ist, dass X ziemlich asynchron ist. 
Insbesondere das Auftauchen des Fensters kann durch den Fenstermanager 
ziemlich verzögert sein, sodass das Zeichnen in ein noch nicht 
vorhandenes Fenster geht. Ohne Redraw-Event bleibts dann leer. Das hat 
der Autor zwar durch das wahllose Verstreuen von XFlush bzw. XSync 
versucht zu kompensieren, aber XFLush ist völlig überflüssig und XSync 
hilft gerade beim Fenstermanager nix.

Bau mal um das XMapWindow herum folgendes ein:
1
XSelectInput (display, win, ExposureMask);
2
XMapWindow (display, win);
3
for (;;)  {               
4
      XEvent event;
5
      XNextEvent(display, &event);
6
      if (event.type == Expose) 
7
            break;
8
}

von Martin H. (mahi)


Lesenswert?

Markus schrieb:
> Marin H. schrieb
>>Wenn mal vom (Noch-)Standard ausgeht, könnte man hier
>>https://en.wikipedia.org/wiki/Xlib anfangen zu lesen und sich dann hier
>
> Danke.
> Ich will nicht lesen.
> Ich will ein Beispiel C-File und das passende Kommando zum compilieren
> damit ich das ganze innerhalb von 3 Minuten testen kann.

Tja, wenn Du das denn mal gemacht hättest. Hinter dem Link "versteckt" 
sich nämlich genau das - ein Beispiel-C-File mit dem passenden Kommando 
zum kompilieren. Im Gegensatz zu Deinem selbst gefundenen Beispiel 
kümmert sich dieses auch um Events und ist zudem deutlich kleiner...

: Bearbeitet durch User
von R. M. (n_a_n)


Lesenswert?

R. M. schrieb:
> SDL ist einfach zu erlernen und erlaubt z.B.
> DrawPixel(screen,x,y,r,g,b);

Und hättest du nach SDL geg**gelt, dann wärst du sicher auf diesen Link
gestoßen:
https://www.libsdl.org/

Auch hier gibt es jede Menge Beispielcode.

Aber du bist nicht nur zum lesen zu faul, sondern auch zum Suchen.
Aber das machen sicher immer andere für dich.

von guest (Gast)


Lesenswert?

StarLord schrieb:
> Ach und wenn wir hier gerade dabei sind Wünsche zu äußern, dann will ich
> nen Ferrari und ne Frau mit dicken Hupen.

Du bist ja voll 80er ;-)

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Autor: Georg A. (georga) schrieb

>Bau mal um das XMapWindow herum folgendes ein:

Danke Georg, das war die Lösung :-)
Jetzt funktioniert das Demo.

Ich habe es mal angehängt.

Hier passende die Kommandozeile:

> gcc -o punkt  punkt.c -L/usr/X11R6/lib -lX11
> ./punkt

Danke auch den Leuten, die passende Links gepostet haben.

Ansonsten:
Es erstaunt mich immer wieder, wie groß die Klappe einiger und wie 
gering die Kompetenzen dieser Leute sind.
Erstaunlich auch, wie schwer es den Leuten fällt, einfach auf den 
"Punkt" zu kommen.

Und dann die Lehrer Typen:

>Das sind die besten Voraussetzungen etwas neues zu erlernen. ggg

graußig.

von Georg A. (georga)


Lesenswert?

Markus schrieb:
> Jetzt funktioniert das Demo.

Wobei diese Art der Nutzung aber nicht mehr so ganz der Stand der 
Technik ist. X11 ist zwar eigentlich recht trivial und kann für sein 
Alter (~1988, wie stands da gerade grafisch bei Microsoft...) verdammt 
viel (google "window shape extension"...). Aber es ist halt schon eine 
Art Grafikassembler, das ganze Eventhandling ist grosses Gefummel und 
kann ziemlich ausarten. Und die damals vorhandenen Toolkits (Xt/Athena 
Widgets oder Motif) waren und sind immer noch PITA.

So zum Verständnis ist rohe Xlib-Programmierung also ganz nett, aber mit 
neuen Toolkits (SDL, GTK und insb. Qt) hat man deutlich mehr Freude und 
heutige Systeme stören die paar MB an Libs auch nicht mehr...

von Markus (Gast)


Lesenswert?

Schon klar, dass das Ganze etwas veraltet ist. Ich brauche es aber für 
einen bestimmten Zweck:
Da ich gerade für kleine Mikrocontroller eine TFT Lib entwickle, möchte 
ich Screen-Shots machen. Mit der Kamera gibt es immer Spiegelungen.
Da ist es einfacher ich binde die Lib an X11 über das simplifizierte 
Punkt-Interface.
Was natürlich eventuell auch noch nett wäre: den Zugriff auf die 
Mauskoordinaten und deren Tasten.

von Georg A. (georga)


Lesenswert?

Markus schrieb:
> Was natürlich eventuell auch noch nett wäre: den Zugriff auf die
> Mauskoordinaten und deren Tasten.

Ohne Events: XQueryPointer

https://linux.die.net/man/3/xquerypointer

von Markus (Gast)


Lesenswert?

Danke, das mit der Maus funktioniert. Nur die Tasten muss man sich aus 
der Mask noch "rausfitzeln":
1
  if(XQueryPointer(display, win, &ret_root, &ret_child, &root_x, &root_y,
2
           &win_x, &win_y, &mask))
3
4
  {
5
    // This returns in -geometry format
6
    // I added \n so it actually shows something so people who test it know it works.
7
    //printf("+%d+%d\n", root_x, root_y);
8
    printf("%d %d , %x\n", win_x, win_y, mask);
9
    if(mask&0x100)printf("left button pressed\n");
10
    if(mask&0x400)printf("right button pressed\n");
11
    if(mask&0x200)printf("center button pressed\n");
12
  }
13
  else
14
  {
15
    // your script will break with this output, send it to stderr and let the script
16
    // return something sensible like +10+10
17
    printf("hmmmm, where is that sneaky pointer?\n");
18
  }

von P. Ixel-Putzer (Gast)


Lesenswert?


von C. (Gast)


Angehängte Dateien:

Lesenswert?

Zu spät, die Adafruit_GFX Library läuft schon mit X11.

von W.S. (Gast)


Lesenswert?

Markus schrieb:
> Da ich gerade für kleine Mikrocontroller eine TFT Lib entwickle, möchte
> ich Screen-Shots machen. Mit der Kamera gibt es immer Spiegelungen.

Huch?

Also normalerweise benutzt man für sowas doch keine Kamera, sondern mach 
das Ganze völlig anders:

1. Version: Du schreibst dir eine Programm für den PC, das in einem 
Fenster den Bildbereich deines TFT nachbildet. Deine 
Bibliotheksprogramme arbeiten dann beim Ausprobieren der Algorithmen auf 
den Clientbereich eben dieses Fensters und später dann im µC auf den 
Bildwiederholspeicher für das TFT.

Nun kannst du dir in deinem PC-Programm doch ganz einfach den Inhalt 
eben dieses Fensters als Grafik abspeichern, BMP oder JPG oder was dein 
System halt so hergibt. Bei blankem Linux, also Screen=Konsole sehe ich 
da keine Chance, aber wenn du irgend ein Linux mit grafischer Oberfläche 
benutzt, dann sollte für diese doch etwas benutzbar sein - oder? Unter 
Windows hätte ich dir Delphi vorgeschlagen, für Linux dann eher Lazarus. 
Dort gibt es Elemente, die einen skalierbaren Canvas beinhalten, wo man 
nach Herzenslust drauf herummalen kann und man kann selbigen auch als 
Grafik abspeichern. Das ist allemal besser als ein Bildschirmfoto.

2. Version: Du läßt das Ganze auf deinem µC laufen und verbindst ihn per 
USB-CDC mit deinem PC und dort benutzt du das Terminalprogramm deiner 
Wahl. Dann richtest du dir ein einfaches Kommandoprogramm auf deinem µC 
ein, mit dem du den Bildschirm-Inhalt als Dump herunterladen kannst und 
ann auf dem PC nach Belieben weiterverarbeiten kannst.

W.S.

von Georg A. (georga)


Lesenswert?

So wie ich das verstehe, will er statt dem Abfotografieren des TFT das 
Ergebnis der Lib in einem X-Fenster simulieren. Dann macht er ja genau 
Punkt 1...

> Unter Windows hätte ich dir Delphi vorgeschlagen, für Linux dann
> eher Lazarus.

Jetzt lass doch endlich mal das blöde Lazarus sterben. Er macht 
offensichtlich alles in C und hat wohl auch keine Probleme damit, da 
braucht er nicht noch eine zweite Sprache... Die XLib-Programmierung 
geht in dem Fall schon (gibt halt Probleme mit den Redraws). Wenn mal 
Zeit ist, wäre aber Qt eine Alternative.

von trolljäger (Gast)


Lesenswert?

Es ist immer wieder interessant zu sehen, dass viele einen sehr 
schlechten Trollerkennsinn haben. Einige haben es ja bemerkt, aber 
leider sehr viele nicht.
Es ist doch eindeutig, dass Markus zur Spezies der Trolle gehört.
Spätestens als er schrieb: "Ich will nicht lesen.
Ich will ein Beispiel C-File und das passende Kommando zum compilieren
damit ich das ganze innerhalb von 3 Minuten testen kann."

von Markus (Gast)


Lesenswert?

>Ich will nicht lesen.
>Ich will ein Beispiel C-File und das passende Kommando zum compilieren
>damit ich das ganze innerhalb von 3 Minuten testen kann.

Total erstaunlich: Manche Leute können sich nicht vorstellen, dass man 
etwas in 3 Minuten compilieren und ausprobieren kann und dass es eine 
durchaus vernünftige Sache ist, eine solches Beispiel für alle zur 
Verfügung zu stellen.

Was ich ja im Laufe des Threads auch schließlich gemacht habe.

Mal ehrlich: Wie bescheuert muss man sein?

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.