 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.06.2005, 12:04 Titel: das <conio.h> debakel. eine kleine Lösung |
|
|
Hi,
oft ließt man im Forum ja "clrscr() geht nicht" oder sonstige Dinge die mit der conio.h zu tun haben. Problem ist das die conio.h nicht dem Standard untersteht, denn der Standard sieht vor das C++ keine Bildschrime, Dateien, Tastaturen und co. kennt.
Viele greifen für die Consolenprogrammierung nun mal auf die "praktische" conio.h zurück. Auf dem Borland Compilern kein Problem, aber auf dem VC++ siehts schlecht aus, da es keinen Standard für diese Datei gibt.
Im Internet gibt es dafür die sog. "conioex.h" doch die ist recht buggy und 2. dirty style
Ich hab deshalb mal selbst was für euch zusammen gebastelt für den VC++.
Hier die 3 Dateien (conioex.cpp, conioex.h, main.cpp)
CPP: | // ###########################################################################
// Datei: conioex.h
// ###########################################################################
// Autor: Patrick Ullmann
// Erstellt: 27.06.2005
// Änderungen: 27.06.2005 (Patrick) Datei erstellt
// ###########################################################################
// Beschreibung: Portierung der <conio.h> für den VC++
#if (_MSC_VER > 1000)
#pragma once
#endif // VC++ Include Guard
#if !defined(__conioex_h__)
#define __conioex_h__
// I N C L U D E S ###########################################################
// Allgemeine conio includieren
#include <conio.h>
// D E F I N I T I O N E N ###################################################
// Nur für Non-Borland Compiler benötigen wir folgende Implementierung
#if !defined(__BORLANDC__)
// Nur Win32-Konsolen werden unterstützt
#if !defined(_WIN32) || (defined(_MSC_VER) && !defined(_CONSOLE))
#error Only Win32-Console-Targets supported
#endif
// Farben definieren wenn nötig
#if !defined(__COLORS)
#define __COLORS
// Die Farben
enum COLORS
{
// Dunkle Farben
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
// Helle Farben
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#endif
// Cursortypen für _setcursortype()
const unsigned long _NOCURSOR = 0;
const unsigned long _SOLIDCURSOR = 1;
const unsigned long _NORMALCURSOR = 2;
// Makro für die Erstellung von Textattributen
#if !defined(BUILD_TEXTATTR)
#define BUILD_TEXTATTR(f, b) static_cast<int>((((b) & 15) << 4) | ((f) & 15))
#endif
// Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1
void __cdecl clrscr (void);
// Leert die Aktuelle Zeile, Cursor wird nicht verschoben
void __cdecl clreol (void);
// Setzt den Cursor an die Position X und Y
void __cdecl gotoxy (int x, int y);
// Gibt die aktuelle X-Position des Cursors wieder
int __cdecl wherex (void);
// Gibt die aktuelle Y-Position des Cursors wieder
int __cdecl wherey (void);
// Fügt eine neue Zeile hinzu.
void __cdecl insline (void);
// Löscht eine Zeile
void __cdecl delline (void);
// Setzt eine Textfarbe
void __cdecl textcolor (int color);
// Setzt eine Hintergrundfarbe für den Text
void __cdecl textbackground (int color);
// Setzt ein Attribut für den Text
void __cdecl textattr (int attr);
// Aktiviert helle Farben
void __cdecl highvideo (void);
// Deaktiviert helle Farben
void __cdecl lowvideo (void);
// Verändert den Cursortyp
void __cdecl _setcursortype (unsigned long cur_t);
#endif
#endif
|
CPP: | // ###########################################################################
// Datei: conioex.cpp
// ###########################################################################
// Autor: Patrick Ullmann
// Erstellt: 27.06.2005
// Änderungen: 27.06.2005 (Patrick) Datei erstellt
// ###########################################################################
// Beschreibung: Portierung der <conio.h> für den VC++
// I N C L U D E S ###########################################################
// Nur für Nun-Borland Compiler gillt diese Implementierung
#if !defined(__BORLANDC__)
#include <windows.h>
#include "conioex.h"
// F U N K T I O N E N #######################################################
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1
// ///////////////////////////////////////////////////////////////////////////
void __cdecl clrscr (void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
unsigned long written;
COORD coord;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Cursor verschieben
coord.X = 0;
coord.Y = 0;
// Konsole manipulieren
::FillConsoleOutputAttribute (out, info.wAttributes,
info.dwSize.X*info.dwSize.Y,
coord,
&written);
::FillConsoleOutputCharacter (out, TEXT(' '),
info.dwSize.X*info.dwSize.Y,
coord,
&written);
// Cursorposition setzen
::SetConsoleCursorPosition (out, coord);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Leert die Aktuelle Zeile, Cursor wird nicht verschoben
// ///////////////////////////////////////////////////////////////////////////
void __cdecl clreol (void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
unsigned long written;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::FillConsoleOutputAttribute (out, info.wAttributes,
(info.dwSize.X - info.dwCursorPosition.X),
info.dwCursorPosition,
&written);
::FillConsoleOutputCharacter (out, TEXT(' '),
(info.dwSize.X - info.dwCursorPosition.X),
info.dwCursorPosition,
&written);
// Cursor setzen
::SetConsoleCursorPosition (out, info.dwCursorPosition);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzt den Cursor an die Position X und Y
// ///////////////////////////////////////////////////////////////////////////
void __cdecl gotoxy(int x, int y)
{
// Sicherheitsabfrage
if(HIWORD(x) || HIWORD(y))
return;
// Hilfsstruktur
COORD coord;
// Cursor verschieben
coord.X = LOWORD(x - 1);
coord.Y = LOWORD(y - 1);
// Cursor setzen
::SetConsoleCursorPosition (::GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Gibt die aktuelle X-Position des Cursors wieder
// ///////////////////////////////////////////////////////////////////////////
int __cdecl wherex(void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
// Informationen holen
if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info))
return 0;
// Position zurück geben
return (info.dwCursorPosition.X + 1);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Gibt die aktuelle Y-Position des Cursors wieder
// ///////////////////////////////////////////////////////////////////////////
int __cdecl wherey(void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
// Informationen holen
if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info))
return 0;
// Position zurück geben
return (info.dwCursorPosition.Y + 1);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Fügt eine neue Zeile hinzu.
// ///////////////////////////////////////////////////////////////////////////
void __cdecl insline(void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
SMALL_RECT rect;
CHAR_INFO char_info;
HANDLE out;
COORD coord;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Unicode oder nicht?
#if defined(UNICODE)
char_info.Char.UnicodeChar = L' ';
#else
char_info.Char.AsciiChar = ' ';
#endif
// Attribute sichern
char_info.Attributes = info.wAttributes;
// Rechteck ausrechnen
rect.Left = 0;
rect.Top = LOWORD(info.dwCursorPosition.Y);
rect.Right = LOWORD(info.dwSize.X - 1);
rect.Bottom = LOWORD(info.dwSize.Y - 1);
// Position setzen
coord.X = 0;
coord.Y = LOWORD(info.dwCursorPosition.Y + 1);
// Konsole manipulieren
::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Löscht eine Zeile
// ///////////////////////////////////////////////////////////////////////////
void __cdecl delline(void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
SMALL_RECT rect;
CHAR_INFO char_info;
HANDLE out;
COORD coord;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Unicode oder nicht?
#if defined(UNICODE)
char_info.Char.UnicodeChar = L' ';
#else
char_info.Char.AsciiChar = ' ';
#endif
// Attribute sichern
char_info.Attributes = info.wAttributes;
// Rechteck ausrechnen
rect.Left = 0;
rect.Top = LOWORD(info.dwCursorPosition.Y + 1);
rect.Right = LOWORD(info.dwSize.X - 1);
rect.Bottom = LOWORD(info.dwSize.Y - 1);
// Position setzen
coord.X = 0;
coord.Y = LOWORD(info.dwCursorPosition.Y);
// Konsole manipulieren
::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info);
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzt eine Textfarbe
// ///////////////////////////////////////////////////////////////////////////
void __cdecl textcolor (int color)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::SetConsoleTextAttribute (out,
static_cast<unsigned short>((info.wAttributes & ~0x0F) |
static_cast<unsigned short>(color & 0x0F)));
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzt eine Hintergrundfarbe für den Text
// ///////////////////////////////////////////////////////////////////////////
void __cdecl textbackground (int color)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::SetConsoleTextAttribute (out,
static_cast<unsigned short>((info.wAttributes & ~0xF0) |
static_cast<unsigned short>((color & 0x0F) << 4)));
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzt ein Attribut für den Text
// ///////////////////////////////////////////////////////////////////////////
void __cdecl textattr (int attr)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::SetConsoleTextAttribute (out,
static_cast<unsigned short>((info.wAttributes & ~0xFF) |
static_cast<unsigned short>(attr & 0xFF)));
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Aktiviert helle Farben
// ///////////////////////////////////////////////////////////////////////////
void __cdecl highvideo (void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::SetConsoleTextAttribute (out,
static_cast<unsigned short>(info.wAttributes | FOREGROUND_INTENSITY));
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Deaktiviert helle Farben
// ///////////////////////////////////////////////////////////////////////////
void __cdecl lowvideo (void)
{
// Hilfsvariablen /- strukturen
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE out;
// Informationen holen
if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
return;
if (!::GetConsoleScreenBufferInfo(out, &info))
return;
// Konsole manipulieren
::SetConsoleTextAttribute (out,
static_cast<unsigned short>(info.wAttributes | ~FOREGROUND_INTENSITY));
}
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Verändert den Cursortyp
// ///////////////////////////////////////////////////////////////////////////
void __cdecl _setcursortype (unsigned long type)
{
// Hilfsstruktur
CONSOLE_CURSOR_INFO info;
// Größe verändern
if ((type == _NOCURSOR) || (type == _NORMALCURSOR))
info.dwSize = 25;
else if (type == _SOLIDCURSOR)
info.dwSize = 100;
else
return;
// Cursor sichtbar?
info.bVisible = (type == _NOCURSOR) ? false : true;
// Konsole manipulieren
::SetConsoleCursorInfo (::GetStdHandle(STD_OUTPUT_HANDLE), &info);
}
#endif |
CPP: | // ###########################################################################
// Datei: main.cpp
// ###########################################################################
// Autor: Patrick Ullmann
// Erstellt: 27.06.2005
// Änderungen: 27.06.2005 (Patrick) Datei erstellt
// ###########################################################################
// Beschreibung: Hauptdatei
// I N C L U D E S ###########################################################
#include <iostream>
#include "conioex.h"
// F U N K T I O N E N #######################################################
void header (void)
{
// Bildschirm löschen
clrscr ();
// Textfarbe und Hintergrund setzen
textcolor (WHITE);
textbackground (LIGHTBLUE);
// Zeile hinzufügen
insline();
// Titelzeile
std::cout << "Testprogramm fuer <conioex.h>";
// Version soll ganz rechts stehen
gotoxy (79, 1);
std::cout << "v1";
// Textfarbe und Hintergrund setzen
textcolor (WHITE);
textbackground (BLACK);
}
void footer (void)
{
// Ganz nach unten
gotoxy (1, 25);
// Textfarbe und Hintergrund setzen
textcolor (WHITE);
textbackground (LIGHTBLUE);
// Zeile hinzu fügen
insline();
// Bissel Blabla
std::cout << "Yeah es geht!";
// Textfarbe und Hintergrund setzen
textcolor (WHITE);
textbackground (BLACK);
}
int main (void)
{
// Header malen
header ();
// Die 1. 16 Zellen der ASCII-Tabelle ausgeben
for (unsigned long i=0; i<16; ++i)
{
gotoxy (5, i+4);
std::cout << i << ": " << static_cast<char>(i);
}
// Text ausgeben
gotoxy (20, 4);
std::cout << "Ein kleiner Teil einer ASCII-Tabelle";
// Footer malen
footer ();
gotoxy (25, 20);
return 0;
}
|
Ja ist leider recht "viel", hätte es auch lieber gezippt aber auf der Arbeit haben wir kein WinACE oder sonstige schönen dinge
Sagt mir was ihr davon haltet
- Patrick, der trotzdem beim Standard bleibt  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.06.2005, 12:14 Titel: |
|
|
Sehr schön, gibs zu das hast du nur gemacht weil dich der Tannenbaumwettbewerb in den Konsolenrausch brachte  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 27.06.2005, 15:55 Titel: |
|
|
Wenn ich mal ein Problem mit der conio.h haben sollte, werde ich darauf zurückgreifen ;)
(Visual Studio 2003)
mfg |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 27.06.2005, 18:01 Titel: |
|
|
Gehört das nicht in die FAQ?
Patrick:
Du hast auch zuviel Zeit, oder? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.06.2005, 18:32 Titel: |
|
|
Patrick hat Folgendes geschrieben: |
Kommt noch in die FAQ, wollte aber erst mal Meinungen hören  |
Du hörst auf uns?  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.06.2005, 18:33 Titel: |
|
|
FallenAngel84
Tja, jetzt wo man ja Mod ist sollte man auch mal auf die anderen hören Also legt mal los
Wollt ihr diesen Topic in der FAQ haben? *auf gegröhle warte*  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.06.2005, 18:38 Titel: |
|
|
Packs lieber auf deine Seite oder zu anderen Seiten die spezielle bereiche für Codeschnippel oder ähnliches haben. Ins FAQ passt es meiner meinung nach nicht. Aber nen Thread mit nem Link zum Tut sowie nen kleinen Problemlösungsansatz falls sich jemand selber damit auseinander setzen möchte, das hätte dann mehr Lehrgehalt als fast purer Code. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.06.2005, 19:36 Titel: |
|
|
gut, ich habe die Diskussion getrennt, weil das schon sehr weit abschweifte. Die Forendiskussion ist jetzt bei "Fragen Antworten und Kritik" _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.07.2005, 12:24 Titel: |
|
|
Patrick hat Folgendes geschrieben: | FallenAngel84
Joah a bissel Aber da ging es ja um Standard
Apropos... die Bäume poste ich heut abend mal  |
Hm, heute Abend müsste vorbei sein, also wo finden wir die Bäume? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|