2009-12-20 16 views
6

Was ist die beste Möglichkeit, Dinge im Konsolenfenster auf der Win32-Plattform mit C++ zu zeichnen?Zeichnen in einer Win32-Konsole in C++?

Ich weiß, dass Sie einfache Kunst mit Symbolen zeichnen können, aber gibt es eine Möglichkeit, etwas Komplexeres wie Kreise oder sogar Bitmaps zu tun?

+4

Nein, gibt es nicht. –

+0

Neil: Unterstützt die Windows-Konsole keine old-skool VGA-Grafikprogrammierung? Früher hatte man das in den 9x-Tagen, um alte DOS-Grafikprogramme laufen zu lassen ... aber vielleicht haben sie es schließlich aufgegeben, sie zu unterstützen? – itowlson

+0

heh, ich erinnere mich, Programme in Turbo Pascal zu schreiben. Sie mussten einen Fahrer holen, um Grafiken zu zeigen. Ich habe sogar versucht, ein eigenes Fenstersystem zu schreiben. leider habe ich gescheitert :( –

Antwort

10

Nein, Sie können das nicht tun, weil die Win32-Konsole diese Methoden nicht unterstützt. Sie können jedoch GDI verwenden, um auf dem Konsolenfenster zu zeichnen.

Dies ist ein großartiges Beispiel eine Bitmap auf einer Konsole der Zeichnung durch ein untergeordnetes Fenster auf es zu schaffen: http://www.daniweb.com/code/snippet216431.html

Und das sagt Ihnen, wie Linien und Kreise zeichnen:
http://www.daniweb.com/code/snippet216430.html

Dies ist jedoch nicht wirklich in der Konsole zeichnen. Dies ist eine Art "über" die Konsole zu zeichnen, aber es funktioniert immer noch ziemlich gut.

0

Nicht ohne ASCII-Art. In den Tagen von DOS war es "ziemlich" einfach, die Zeichen-Bitmaps neu zu gestalten. Es ist möglicherweise nur in Windows möglich, indem Sie Ihre eigene Schriftart erstellen, aber ich bin mir nicht sicher, ob das möglich ist.

+0

dann, wie haben sie diese alten DOS-Spiele in der Konsole gemacht? –

+1

Das ist nicht die "Konsole". Es gibt einen Wechsel vom Textmodus zum Grafikmodus ... – Goz

+0

Die Konsole war damals nicht dieselbe Konsole wie sie jetzt ist. –

2

Vielleicht sprechen Sie über DOS-Programme mit VGA mode. Eine schnelle Google-Suche zeigt eine C tutorial.

+0

ist das mit VC++ möglich ? Ich möchte mich nicht an eine neue IDE gewöhnen. –

2

Wie Nick Brooks darauf hingewiesen hat, können Sie GDI-Aufrufe in Konsolenanwendungen verwenden, aber die Grafiken können nicht im selben Fenster wie die Textkonsolen-E/A angezeigt werden. Dies spielt keine Rolle, da Sie Textelemente in GDI zeichnen können.

Eine vereinfachte Schnittstelle zu GDI-Anrufen in Konsolenanwendungen wird von WinBGIm bereitgestellt. Es ist ein Klon von Borlands DOS BGI API, aber mit Erweiterungen für größenverstellbare Fenster, Mauseingabe und 24-Bit-Farbmodelle. Da es als Quellcode verfügbar ist, dient es auch als gute Demonstration der Verwendung von GDI auf diese Weise.

Es ist möglich, entweder eine Konsole und das GDI-Fenster zu haben, oder Sie können das Konsolenfenster unterdrücken, indem Sie angeben, dass die Anwendung eine GUI-Anwendung ist (die Linkoption -mwindows in der GNU-Toolchain) App unterdrückt wirklich nur die Konsole, es ist nur wirklich eine GUI-App, wenn es eine Nachrichtenschleife hat. Die Konsole eignet sich gut zum Debuggen, da standardmäßig stdout und stderr ausgegeben werden.

3

Es ist möglich, wenn auch völlig undokumentiert, einen Konsolenbildschirmpuffer zu erstellen, der eine HBITMAP verwendet, die zwischen dem Prozess des Konsolenfensters und dem aufrufenden Prozess freigegeben wird. Dies ist der Ansatz, mit dem NTVDM Grafiken anzeigt, sobald eine DOS-Anwendung in den Grafikmodus wechselt.

See it.

12
#include <windows.h> 
#include <iostream.h> 


int main() 
{ 
    // Get window handle to console, and device context 
    HWND console_handle = GetConsoleWindow(); 
    HDC device_context = GetDC(console_handle); 

    //Here's a 5 pixels wide RED line [from initial 0,0] to 300,300 
    HPEN pen =CreatePen(PS_SOLID,5,RGB(255,0,0)); 
    SelectObject(device_context,pen); 
    LineTo(device_context,300, 300); 


    ReleaseDC(console_handle, device_context); 
    cin.ignore(); 
    return 0; 
} 
+0

Fehler: 'GetConsoleWindow' wurde in diesem Bereich nicht deklariert – Milad