Improved Console 3.4
-
Die Improved Console hat mal wieder ein Update erhalten, trotz einiger größerer Änderungen bleibt sie aber 100% abwärtskompatibel.
Changelog:
- Besserer Fullscreen-Support per SetConsoleDisplayMode()
- Farbkonstanten sind in Enumerationen gewandert
- Für gängige Caret-Größen gibts nun ebenfalls eine Enumeration
- Neue Shorties
- Generalüberholter Quelltext
- Natürlich inklusive Update 1 der IC 3.3Homepage:
Die Homepage wurde generalüberholt. Die beiden Tutorials wuden gründlich überarbeitet.Future:
- Aufbauend auf 3.4 wird es eine echte C-Version geben
- Sobald es die WinAPI nun endlich zulässt (Die Get-Funktionen dazu gibt es bereits -> usus wären die Set-Funktionen im nächstne Update des Platform-SDKs) baue ich Font-Support ein (Heißt: Schriftart, -größe und -gewicht(Fettschrift))MfG SideWinder
-
ich geh mal drüber und mach brainsorming oder sowas.
#ifndef INCLUDE_GUARD_IC_HPP
netter bezeichner////////////////////////////////////////////////////////////////////////////////
fein. 80 zeiche, wie sich das gehört. aber die README.TXT konnte ich nicht so gut lesen.außerdem schreibste .TXT statt .txt, bei .cpp, .hpp und .h stimmt's.
FG_BLACK = 0,
FG_DARKGREY = FOREGROUND_INTENSITY,
FG_DARKRED = FOREGROUND_RED,
FG_RED = FOREGROUND_INTENSITY | FOREGROUND_RED,
FG_DARKGREEN = FOREGROUND_GREEN,
FG_GREEN = FOREGROUND_INTENSITY | FOREGROUND_GREEN,
FG_DARKBLUE = FOREGROUND_BLUE,
FG_BLUE = FOREGROUND_INTENSITY | FOREGROUND_BLUE,
FG_OCHER = FOREGROUND_RED | FOREGROUND_GREEN,
FG_YELLOW = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN,
FG_VIOLET = FOREGROUND_RED | FOREGROUND_BLUE,
FG_PINK = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE,
FG_TURQUOISE = FOREGROUND_GREEN | FOREGROUND_BLUE,
FG_LIGHTBLUE = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE,
FG_GREY = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
FG_WHITE = FOREGROUND_INTENSITY|FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
das mit den tabs und spaces klär mal.meinen lese-geschmack trifft ja eher diese liste
FG_BLACK = 0,
FG_DARKRED = FOREGROUND_RED,
FG_DARKGREEN = FOREGROUND_GREEN,
FG_DARKBLUE = FOREGROUND_BLUE,
FG_OCHER = FOREGROUND_RED | FOREGROUND_GREEN,
FG_TURQUOISE = FOREGROUND_GREEN | FOREGROUND_BLUE,
FG_VIOLET = FOREGROUND_RED | FOREGROUND_BLUE,
FG_GREY = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,FG_DARKGREY = FOREGROUND_INTENSITY | FG_BLACK,
FG_RED = FOREGROUND_INTENSITY | FG_DARKRED,
FG_GREEN = FOREGROUND_INTENSITY | FG_DARKGREEN,
FG_BLUE = FOREGROUND_INTENSITY | FG_DARKBLUE,
FG_YELLOW = FOREGROUND_INTENSITY | FG_OCHER,
FG_LIGHTBLUE = FOREGROUND_INTENSITY | FG_TURQUOISE,
FG_PINK = FOREGROUND_INTENSITY | FG_VIOLET,
FG_WHITE = FOREGROUND_INTENSITY| FG_GRAYBG_BLACK = 0,
BG_DARKGREY = BACKGROUND_INTENSITY,
BG_DARKRED = BACKGROUND_RED,
... auch spaces und tabs und dito.void normal ();
void minimize ();
void maximize ();
müßte wohl der harmonie wegen
void normalize ();
void minimize ();
void maximize ();
heißen.// Get/Set: Caret size
DWORD getCaretSize () const;
void setCaretSize (DWORD size);
ok, aber dann
// Get/Set: Window position
DWORD getPosX () const;
DWORD getPosY () const;
void setPos (DWORD x, DWORD y);
warum nicht
// Get/Set: Window position
DWORD getWindowPosX () const;
DWORD getWindowPosY () const;
void setWindowPos (DWORD x, DWORD y);
?damit ich immer wiß, ob jetzt mein corsor dran ist oder das window.
std::basic_string<TCHAR> getTitle () const;
void setTitle (const TCHAR* title);
das kannste aber nicht machen. beide string oder beide char*.Console::Console ()
: hout(GetStdHandle(STD_OUTPUT_HANDLE))
ungetestet? was passiert, wenn GetStdHanlde mist liefert? oh, alles ist ja ungetestet. ok, wird schon klappen.SetConsoleTextAttribute(hout,static_cast<WORD>(color|getBgColor()));
ah, hierzu war der enum da?cci.dwSize = size > 0 && size < 100 ? size : 100;
hä?
naja, bei so viel code muß auch mal gehackt werden. rest war ja super lesbar.bufSize.X = x < getMaxSizeX() ? x : getMaxSizeX();
du magst ?: und ich mags nicht. nimm doch min und max. oder trauste dich nicht, wegen der min-max-makros in der <windows.h>?uih, HWND Console::getCWND() ist ja beeindruckend getrickst. das geht echt nicht normal?
-
aber die README.TXT konnte ich nicht so gut lesen.
Sollte afaik noch auf 80 Zeichen begrenzt sein, wird aber sowieso mal wieder ein Update erhalten. Was da drin steht ist ja zT nicht mal ordentliches Englisch.
außerdem schreibste .TXT statt .txt, bei .cpp, .hpp und .h stimmt's.
Changed, im nächsten Update passt das. Keine Ahnung warum ich da überhaupt große Dateinamen verwendet habe
meinen lese-geschmack trifft ja eher diese liste
Die Enumeration kann ich ja mal abändern
müßte wohl der harmonie wegen "void normalize ();" heißen"
Hrhr, hab ich auch überlegt. Aber wegen Abwärts-Kompatibilität kann ich wenn überhaupt nur normalize() hinzufügen und aus normal einen deprecated inliner machen der normalize() aufruft - ähnlich setFullscreen/fullscreen. Ob das Sinn macht? Ok, warum nicht.
damit ich immer wiß, ob jetzt mein corsor dran ist oder das window.
Grundsätzlich gilt: Überall wo nichts dabei steht denk dir "Window" hinzu. Sollte ich eventl. dazuschreiben. Ändern kann ich jetzt allerdings am Interface nichts mehr. Da sind wir 0.4 Versionen zu weit
das kannste aber nicht machen. beide string oder beide char*.
Dann wohl beide string.
ungetestet? was passiert, wenn GetStdHanlde mist liefert? oh, alles ist ja ungetestet. ok, wird schon klappen.
Wenn es Mist liefert werden alle Funktionen die darauf beruhen ganz einfach nichs tun. Fehler-Überprüfung gibts in dem Sinn keine. Eventuell sollte ich den User zumindest überprüfen lassen ob das Handle stimmt und überhaupt was funktionieren kann.
Exceptions kommen auf jeden Fall keine, da die Benutzergruppe wohl doch eher blutige Anfänger sind.
naja, bei so viel code muß auch mal gehackt werden. rest war ja super lesbar.
Begrenzt size einfach zwischen 0 und 100, okay werde Kommentar dazupacken.
nimm doch min und max. oder trauste dich nicht, wegen der min-max-makros in der <windows.h>?
Ich mags vor allem nicht weils nicht ordentlich funktioniert. Devcpp glaub ich hat kein min/max oder so. Ich such dir den Thread raus wo die Probleme behandelt wurden, bloß funktioniert die dämlcihe Suchfunktion grade wieder nicht
uih, HWND Console::getCWND() ist ja beeindruckend getrickst. das geht echt nicht normal?
GetConsoleWindow() gibts leider erst ab Win2k/Xp. Vorher muss man das über diesen Dirty-Trick machen (Dafür hat WebFritzi sogar einen Eintrag in die Credits bekommen *g*, er hat das aus einem Sample der WinAPI genommen und nochwas dran rumgebastelt).
Danke auf jeden Fall für das viele Feedback!
MfG SideWinder
-
Ließe sich die GetCWND-Angelegenheit nicht eleganter lösen indem man mit FindWindow nach der Konsolen-Fensterklasse sucht (ConsoleWindowClass unter NT, tty unter 9x!? ) und dann die durch GetWindowThreadProcessId zurückgegebene PID mit der eigenen vergleicht?
-
Jeder Prozess kann seine eigene Konsole aufmachen, dann hab ich plötzlich mehrere Aufrufe zu tätigen und jeweils zu vergleichen.
Außerdem hat die MSDN auch diesen Ansatz gewählt - die wissen meistens warum, auch wenn sie es einem nicht erzählen *g*
MfG SideWinder
-
Dass da möglicherweise mehrere Konsolen verglichen werden müssten ist ja klar, mir erschien es nur trotz des Mehraufwandes eleganter.
Hast du zufällig den Link zu dem entsprechenden Codebeispiel in der MSDN greifbar?
-
Nutzt jemand "Improved Console" überhaupt?
-
SideWinder schrieb:
Ändern kann ich jetzt allerdings am Interface nichts mehr. Da sind wir 0.4 Versionen zu weit
stimmt nicht. kannst locker das interface ändern. am ende noch ne sektion, wo nur inline-einzeiler von alten interfaces stehen. und nach 12 monaten kriegt so ein alt-inloiner __attribute((deprecated)) oder _declspec((deprecated)) dran und weitere 12 monate später wird er gelöscht.
bist also eigrnlich ganz frei. überleg dir nur, was die optimale lösung ist, nicht, warum du sie nicht bauen solltest.
-
deprecated schrieb:
Nutzt jemand "Improved Console" überhaupt?
keine ahnung. aber wir schicken jeden nube hin, der nach farben fragt.
-
masterofx32 schrieb:
Dass da möglicherweise mehrere Konsolen verglichen werden müssten ist ja klar, mir erschien es nur trotz des Mehraufwandes eleganter.
Hast du zufällig den Link zu dem entsprechenden Codebeispiel in der MSDN greifbar?http://support.microsoft.com/default.aspx?scid=kb;en-us;124103
Aber das ist auf jeden Fall ein riesen Hack.
Vor allen Dingen das:
// Ensure window title has been updated. Sleep(40);
-
und sowas findet man in sidewinders code:
std::basic_string<TCHAR> Console::getTitle () const { TCHAR title [512]; GetConsoleTitle(title,512); return title; }
Und wenn der Titel länger ist?
-
Aber das ist auf jeden Fall ein riesen Hack.
Wenn die es in der MSDN anpreisen wird das unter Windows aber sicher funktionieren. Selten, dass die dort über ihre geliebte API Unfug erzählen, und offenbar gehts nicht besser
Stimmt nicht. kannst locker das interface ändern. am ende noch ne sektion, wo nur inline-einzeiler von alten interfaces stehen.
Überredet, werd ich einbauen.
überleg dir nur, was die optimale lösung ist, nicht, warum du sie nicht bauen solltest.
*kritzel*, toller Satz
Nutzt jemand "Improved Console" überhaupt?
Ja, ich denke schon. Immerhin wird seit 4 Jahren hier auf der Seite jedem der irgendwie was mit Farben in der Konsole macht diese angedreht. Die Anzahl wird zwar nicht gerade berauschend sein, aber es kostet mich weniger Zeit eine solche Lib zu schreiben und zu pflegen als hier jeden Tag die selben Antworten auf die selben Fragen zu geben *g*
MfG SideWinder
-
antihack schrieb:
Und wenn der Titel länger ist?
Maximale Größe laut MSDN sind 64KB, ich weiß nicht ob das Sinn macht soviel Speicher für den dämlichen Titel anzufordern?!
Abgesehen davon, dass getTitle() sowieso kaum aufgerufen wird außer intern bei GetConsoleWindow() hat der User eben Pech wenn er es längera ls 512 Zeichen macht.
MfG SideWinder
-
nimm einfach 64-kb und gut is. auf dem stack geht 512 bytes und 64 kb gleich schnell.
-
antihack schrieb:
nimm einfach 64-kb und gut is. auf dem stack geht 512 bytes und 64 kb gleich schnell.
falsch. vor und hinter den 64k sind lebendigar variablen. der speicher wird angefordert. im allgemeinen ist es für den stack viel schneller, ihn beim wachsen dirch page misses immer bis zur obergrenze anzufordern, statt seitenweise. also haben wir gerade 60k speicher gekauft, den wir nicht brauchen. deswegen müssen irgendwo 60k file buffers geschrieben werden. nicht ideal.
aber völlig egal bei bildschirmausgabe, die ist sowas von lahm, da können wir eigentlich machen, was wir wollen.
-
Ich werde die 64K einbauen, dann kann nichts passieren - irgendwer kommt irgendwann bestimmt noch drauf, dass sein Titel länger als 512 Zeichen haben muss
MfG SideWinder
-
Update 1 ist nun zum Download verfügbar:
- changes.txt, license.txt und readme.txt updated
- Enumerationen sortiert
- getTitle() mit 64K
- setTitle mit std::basic_string<TCHAR>
- normalize() - normal() nur noch alias
- Kommentare bei den beiden ?:-UnklarheitenWas ich an Vorschlägen nicht geändert habe (und auch nicht geändert wird) ist der Interface-Change von setXXX() zu setWindowXXX(). Wenn keine Detailangabe gemacht wird ist "Window" implizit gemeint.
Nächster Schritt ist eine C-Version (wenn ich mich dazu aufraffen kann).
Was noch toll wäre
Ich konnte bisher nur mit MSVC 2003 testen, wenn ihr andere Compiler habt wäre es nett wenn ihr mal versucht die Tech-Demo zu compilieren ob da auch alles klappt. Vor allem der DevCpp hat immer Probleme gemacht.MfG SideWinder
-
Warum Kommentare bei den Unklarheiten? Schreib doch den Code so das er nicht mehr unklar ist.
-
Ich würde sagen da gehört eher nen assert hin.
-
Ich lass das sicher bei einem ?: und mach kein:
const DWORD max_size = 100; if(size > max_size) size = max_size;
Hier gehört eigentlich ein min(size,100) hin, aber das kann ich nicht verwenden. Warum möchte ich euch gerne zeigen aber irgendwer hat den Suchindex wieder mal ruiniert.
MfG SideWinder