So zeichnet ihr in die Konsole
-
Hallo Community,
es gibt bereits das selbe Thema in den FAQ's, dazu aber leider unzureichende Antworten, und einen nicht kompilierbaren Assemblercode.
Hier möchte ich euch trotzdem kurz zeigen, wie ihr Linien und Muster in das Konsolenfenster zeichnet, aber ohne etwas garantieren zu können!
Ich bin in Sachen Grafik noch ein Anfänger, weswegen Kritik sehr erwünscht ist!
Als erstes erzeugen wir mal eine simple Linie, die wir dann mit der Improved Console ggf. färben können. Die einfachste Methode ist, ASCII - Zeichen auszugeben, die dann als Linie erscheinen. Hier ein paar Codes, die ihr dann in einer Schleife nacheinander anzeigen lassen könnt, sodass eine zusammenhängende Linie (Zeichenkette) ausgegeben wird:
char (179) //Senkrechte Einzellinie. char (196) //Waagrechte Einzellinie. char (186) //Senkrechte Doppellinie. char (205) //Waagrechte Doppellinie. char (187) //Rechtes, oberes Doppellinieneck. char (188) //Rechtes, unteres Doppellinieneck. char (200) //Linkes, unteres Doppellinieneck. char (201) //Linkes, oberes Doppellinieneck.
Somit könnt ihr mithilfe ein paar for - Schleifen in geschickter Anordnung ein schönes Rechteck zeichnen
(Für jede Seite eine Schleife). Und nach Wunsch auch noch den Cursor per 'gotoxy' auf die gewünschte Position setzten, und den passenden Text ausgeben!
Eine wesentlich professionellere Alternative hierfür ist die 'SetPixel' Funktion. Damit könnt ihr alles beliebige zeichnen. Sogar auf den Desktop, wenn man kein, bzw. ein ungültiges Handle auf's Fenster übergibt ...
Kurz zur Beschreibung:
Wie man es erahnen kann, setzt 'SetPixel' auf beliebiger Position ein Pixel (Punkt). Hier muss man auch nur ein paar for - Schleifen kombinieren, um ein Rechteck bzw. eine Grafik zu erzeugen. Wichtig ist aber, dass die Funktion auch weis, wohin sie den Pixel setzten soll, also in welches Fenster. In unserem Beispiel die Konsole. Näher möchte ich darauf nicht eingehen, weil ich auch nicht mehr weis ... :p
Im folgenden Beispiel seht ihr die Funktion, der die Position des Rechtecks, Breite und Höhe übergeben wird.Wiegesagt, als ersten ein Handle 'erzeugen':
void DrawRectangle (int x, int y, int width, int height) { HWND hWnd = FindWindow(NULL, "Console"); //"Console" muss dem Fenstertitel entsprechen !! HDC hdc = GetDC(hWnd); //Nun können wir die ersten Pixel setzen: int xx; int yy; for (xx=x;xx<width;xx++) { SetPixel (hdc,xx,y,RGB(255,255,255)); //Obere Linie } xx=x; for (yy=y;yy<height;yy++) { SetPixel (hdc,xx,yy,RGB(255,255,255)); } yy=height; for (xx=x;xx<width;xx++) { SetPixel (hdc,xx,yy,RGB(255,255,255)); } xx=width; yy=y; for (;yy<height;yy++) { SetPixel (hdc,xx,yy,RGB(255,255,255)); } ReleaseDC(hWnd, hdc); DeleteDC(hdc); }
Ich weis, es ist nicht wirklich eine Musterlösung, aber ich kann das auch erst seit gestern. Ihr solltet es lediglich als einen 'Denkanstoß' ansehen
(Naja, was auch immer)
Zu guter Letzt noch ein recht amüsantes Codebeispiel:
void DrawPixel () { int x = 0; int y = 0; HWND hWnd = FindWindow(NULL, "xxxXXX"); HDC hdc = GetDC(hWnd); while (true) { SetPixel (hdc,rand ()%1280,rand ()%1024,RGB (0,0,0)); } }
Öffnet euch zur Sicherheit schonmal den Taskmanager ^^ Alternativ könnt ihr euch als Abbruchbedingung ja auch ein !kbhit () setzen, das macht die Sache etwas unkomplizierter, dafür aber auch viel langsamer.
So. Jetzt fehlen nur noch, wiegesagt, die Muster. Ihr wollt ja auch sicherlich schöne Leisten, etc. haben. Dafür nehmen wir auch wieder simple ASCII - Codes.
Kompiliert folgenden Code, und notiert euch die gewünschte ASCII - Nummer. Danach könnt ihr die Zeichen wie gewohnt in eine Schleife setzen, und sie z.B als Bildleiste anzeigen lassen.#include <iostream> #include <windows.h> #include <conio.h> using std::cout; using std::endl; void pause () { FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); getch(); } int main () { int i = 0; while (true) { for(;i<255 && !kbhit ();i++) { cout<<i<<" "<<char (i)<<endl; Sleep (500); if(i == 255) { i = 0; continue; } } pause (); } return 0; }
Ich hoffe, es ist einigermaßen verständlich geschrieben, wiegesagt, wenn ich etwas nicht korrekt gemacht habe, dann habt bitte etwas Verständnis dafür, ich bin noch ein Anfänger.
Bis zum nächsten mal,
MfG Mikey.
-
nichts für ungut, aber ich frage mich immer wieder was an der doofen windows-console so faszinierend ist, dass sich leute sowas ausdenken
:xmas2:
-
jo ganz meiner meinung, ich bin der Ansicht das die Consolen-Anwendungen nur fuers Lernen, also um sich die Grundthemen bei zubringen( Arrays, Pointer ... ) und um einzelne teilabschnitte von OOP-Programmen zu testen. mehr nicht :xmas1:
Gruß Tobi :xmas2:
-
Hehe, Recht hast du zweifelslos
Aber versetz dich doch mal in meine Lage (sicherlich auch die von vielen anderen):Ich träume noch von Windowsprogrammierung, Fenster sind für mich ein 'Fremdwort'. Ich programmiere erst seit ca. 6 Monaten, und das noch über die Konsole (was bestimmt kein Verbrechen ist).
Vor ein paar Wochen hatte ich mir ein größeres Projekt vorgenommen, und zwar einen Terminmanager als Konsolenanwendung (andere Mittel stehen mir z.Zt. ja nicht zur Verfügung!). Gesagt, getan, heute bin ich immer noch am programmieren. Und wenn man sich dann sowas derartiges aufgebaut hat (Ein Projekt mit mehr als 1000 Programmzeilen), ist man doch stolz, wenn man hier und da mal eine Linie setzen kann, um die Optik einbisschen aufzubessern. Zudem lernt man auch dazu, ich bin der Meinung, jeder sollte sowas mal ausprobiert haben.
In naher Zukunft werde ich mich evtl. natürlich der Windowsprogrammierung widmen. Bis dahin möchte ich aber die Konsole fest in der Hand haben
Und Grafikprogrammierung macht Spass!
Siehe dieses Projekt, da sieht man mal, was wirklich möglich ist:
http://www.planet-source-code.com/vb/scripts/ShowCodeAsText.asp?txtCodeId=10861&lngWId=3
-
mikey schrieb:
Ich träume noch von Windowsprogrammierung, Fenster sind für mich ein 'Fremdwort'. Ich programmiere erst seit ca. 6 Monaten, und das noch über die Konsole (was bestimmt kein Verbrechen ist).
wenn du einfache grafik machen willst, ohne dich mit winapi herumzuquälen, dann nimm z.b. sowas: http://www.garret.ru/~knizhnik/winbgi.zip
oder (etwas anspruchsvoller) das: http://libcaca.zoy.org/
-
Danke dir für die Hilfe, die Lib hab ich schonmal gesehen ... Nur mir geht es darum, dass ich hier nicht einfach mal zum Spass nen Kreis auf die Glotze zeichnen möchte, sondern es soll schon Sinn machen, also z.B ein Konsolenprogramm mit einer sinnvollen Funktion (in dem Fall der Terminmanager) und dazu evtl. mal kleine Grafiken, nicht mehr als eine Linie
-
mikey schrieb:
Danke dir für die Hilfe, die Lib hab ich schonmal gesehen ... Nur mir geht es darum, dass ich hier nicht einfach mal zum Spass nen Kreis auf die Glotze zeichnen möchte, sondern es soll schon Sinn machen...
Ganz genau. Ich werke (noch) mit der Konsole herum, weil die In- und Output wesentlicher leichter ist als mit einer GUI. Ein einfaches std::cout << "info an user" ist eben um einiges leichter zu bewerkstelligen als mit einer GUI und - vor allem als Anfänger - aus wesentlich sinnvoller weil die Eigenkreationen ja bei weitem nicht so komplex sind. Noch nicht.
Und abgesehen davon: Ich mag die Konsole einfach. Ist irgendwie so herrlich nostalgisch.
-
Infinite Loop schrieb:
Und abgesehen davon: Ich mag die Konsole einfach. Ist irgendwie so herrlich nostalgisch.
benutzt du sie dann wenigstens immer im vollbildmodus?
:xmas2:
-
benutzt du sie dann wenigstens immer im vollbildmodus?
Da gibt's aber ein kleines Problem:
Wenn ich mithilfe von 'SetPixel' Grafiken zeichnen möchte, werden diese im Vollbildmodus nicht angezeigt
Ich erstelle mal nen extra Thread deswegen, hier kommen nur noch weitere Anregungen zu meinem Code rein..
MfG Mikey.
-
mikey schrieb:
Wenn ich mithilfe von 'SetPixel' Grafiken zeichnen möchte, werden diese im Vollbildmodus nicht angezeigt
kein wunder. SetPixel ist auch nicht für consolen grafik gedacht. auch im fenstermodus ist SetPixel äusserst ungeil, weil du nix refreshen kannst wenn das fenster überdeckt, minimiert, etc. wird.
-
Achso ^^
Dann hat sich meine Frage im API - Forum glaub ich auch schon erübrigt !
-
ten schrieb:
Infinite Loop schrieb:
Und abgesehen davon: Ich mag die Konsole einfach. Ist irgendwie so herrlich nostalgisch.
benutzt du sie dann wenigstens immer im vollbildmodus?
:xmas2:Du fragst da noch?!? Sicher!!!
EDIT: Die einzige Ausnahme ist während der Benutzung von MPlayer. Funktioniert nicht so richtig mit der Konsole im Vollbildmodus.