Hi,
weiß jemand, ob es eine Funktion gibt, welche die Zeilen, die in einer Anwendung mit 'cout' ausgegeben werden, in einem Fenster (z.B. in einem ListBox oder in EditFeld) ausgibt?
Ansi C++ kennt keine Listboxen und ähnliches, bietet dir aber einiges an Handlungsfreiheit, wohin du Stream-Ausgaben schicken willst - in Form von Stream-Buffern. Da mußt du nur einen Stream-Buffer schreiben, der dein Steuerelement als Ziel verwendet (schau dir die vorhandenen basic_streambuf-Kinder an, um auf den Geschmack zu kommen) - und cout mittels rdbuf() auf diesen umbiegen.
_________________ Wo ich bin, herrscht Chaos. Leider kann ich nicht überall sein.
Da die Aufnahme einer neuen Zeile in einem CListBox-Objekt nur ein einfacher AddString ist, ist so ein streambuf für eine CListBox eine einfache Sache - vorausgesetzt, man weis wie das überhaupt geht. Ich habe sowas vor Urzeiten mal gemacht.
// File ListBoxStreambuf.h
#pragma once
// Bem.: erfordert ein #include <stdafx.h> (MFC) vor diesem include
#include <streambuf>
#include <iostream>
#include <string>
#include <vector>
namespace listboxsb_detail
{
// -- hier werden die Zeichen-Typ-Konvertierungen erledigt template< typename E, typename Traits >
int addString( CListBox& box, const std::basic_string< E, Traits >& line, E, std::basic_streambuf< E, Traits >* )
{
// keine Konvertierung E == TCHAR return box.AddString( line.c_str() );
}
// File ListBoxStreambuf.h
#pragma once
// Bem.: erfordert ein #include <stdafx.h> (MFC) vor diesem include
#include <streambuf>
#include <iostream>
#include <string>
#include <vector>
namespace listboxsb_detail
{
// -- hier werden die Zeichen-Typ-Konvertierungen erledigt template< typename E, typename Traits >
int addString( CListBox& box, const std::basic_string< E, Traits >& line, E, std::basic_streambuf< E, Traits >* )
{
// keine Konvertierung E == TCHAR return box.AddString( line.c_str() );
}
// File ListBoxStreambuf.h
#pragma once
// Bem.: erfordert ein #include <stdafx.h> (MFC) vor diesem include
#include <streambuf>
#include <iostream>
#include <string>
#include <vector>
namespace listboxsb_detail
{
// -- hier werden die Zeichen-Typ-Konvertierungen erledigt template< typename E, typename Traits >
int addString( CListBox& box, const std::basic_string< E, Traits >& line, E, std::basic_streambuf< E, Traits >* )
{
// keine Konvertierung E == TCHAR return box.AddString( line.c_str() );
}
das erfordert natürlich den CListBox-Member 'm_listBox' und die includes "ListBoxStreambuf.h" und <iostream>. Anschließend landen alle Ausgaben auf cout in dieser ListBox.
Noch ein Tipp: setze das Sort-Flag der ListBox auf FALSE.
jencas schrieb:
http://www.williamwilling.com/blog/?p=74
Das beschreibt das Umschalten von cout auf eine Konsole, nicht in ein MFC-Element.
Hallo Werner Salomon,
alles, du vorgeschlagen hast, funktioniert gut! Super Danke!
Kannst du evtl. noch was empfehlen:
alle meine vorherige "\t" werden jetzt als Quadrate angezeigt. Kann man das irgendwie vermeiden?
Und noch eine Frage: die horizontale Bildlaufleiste erscheint nicht im ListBox, Einträge werden abgeschnitten.
Übrigens kann man alles auf eine Konsole so ausgeben:
C/C++ Code:
AllocConsole();
freopen("conout$", "w", stdout);
C/C++ Code:
AllocConsole();
freopen("conout$", "w", stdout);
C/C++ Code:
AllocConsole();
freopen("conout$", "w", stdout);
Habe selber probiert.
Zuletzt bearbeitet von Noch_Student am 17:45:30 21.01.2008, insgesamt 1-mal bearbeitet
Kannst du evtl. noch was empfehlen:
alle meine vorherige "\t" werden jetzt als Quadrate angezeigt. Kann man das irgendwie vermeiden?
Ja - das ist ein nicht darstellbares Steuerzeichen. Das kann man aber auch bei den Resources der ListBox einstellen: 'Use Tabstops = TRUE'.
Falls Du Sonderwünsche hast, kann man es auch selber implementieren. Füge dazu in der Klasse basic_ListBoxStreambuf ab der Zeile 59 folgenden oder einen ähnlichen Code ein:
C/C++ Code:
else if( c == E('\t') ) // TAB: Tabulator
{
const unsigned TABSIZE = 8; // oder ein anderer Wert, je nach dem wo der Tabulator hin soll
m_line.append( TABSIZE - m_line.size() % TABSIZE , ' ' );
}
C/C++ Code:
else if( c == E('\t') ) // TAB: Tabulator
{
const unsigned TABSIZE = 8; // oder ein anderer Wert, je nach dem wo der Tabulator hin soll
m_line.append( TABSIZE - m_line.size() % TABSIZE , ' ' );
}
C/C++ Code:
else if( c == E('\t') ) // TAB: Tabulator
{
const unsigned TABSIZE = 8; // oder ein anderer Wert, je nach dem wo der Tabulator hin soll
m_line.append( TABSIZE - m_line.size() % TABSIZE , ' ' );
}
so richtig 'gut' sieht das aber erst aus, wenn Du eine nicht-proportionale Schrift (z.B. Courier) als Font für die ListBox wählst.
Noch_Student schrieb:
Und noch eine Frage: die horizontale Bildlaufleiste erscheint nicht im ListBox, Einträge werden abgeschnitten.
In den Resources der ListBox 'Horizontal Scroll = TRUE' einstellen (funktioniert aber bei mir nicht!? ).
@Edit: Ah - ein MFC-Problem siehe hier. Den dort vorgeschlagenen Aufruf könnte man auch schön in den ListBoxStreambuf aufnehmen.
Gruß
Werner
Zuletzt bearbeitet von Werner Salomon am 13:40:01 22.01.2008, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.