Frage

Kann ein Fenster Meldungsfeld sein Display der cout Syntax?

Ich brauche auch die Eingabeaufforderung unterdrückt / ausgeblendet werden.

Es gibt Möglichkeiten, die messagebox Funktion und Anzeigetext durch seine Verwendung zu nennen, aber die wichtigste Einschränkung ist hier, dass cout Syntax verwendet werden muss.

cout <<  "message";

Ich dachte an die VB msgbox Befehl in der cout Ausgabe Aufruf, konnte aber nichts finden, die funktioniert.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Das erste, was Sie berücksichtigen sollten, ist, dass MessageBox den Faden hält, bis Sie das Fenster schließen. Wenn das das Verhalten Sie sich wünschen, gehen Sie vor.

Sie können eine benutzerdefinierte streambuf erstellen und auf std::cout gesetzt:

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

namespace {
    class mb_streambuf : public std::stringbuf {
        virtual ~mb_streambuf() { if (str().size() > 0) sync(); }
        virtual int sync() {
            MessageBoxA(0, str().c_str(), "", MB_OK);
            str("");
            return 0;
        }
    } mb_buf;

    struct static_initializer {
        static_initializer() { 
            std::cout.rdbuf(&mb_buf); 
        }
    } cout_buffer_switch;
}

int main()
{
    std::cout << "Hello \nworld!"; // Will show a popup
}

Es wird ein Popup angezeigt, wenn std :: cout Strom gespült wird.

Andere Tipps

C ++ Streams Arbeit mit Konsole oder Datei-Streams. Windows-Arbeit an einem mehr oder weniger völlig anderen Paradigma, so dass der cout Kontext für die Arbeit mit nicht wirklich gut ist. Sie könnten wahrscheinlich Maische völlig etwas, das mehr oder weniger würde am Ende zu arbeiten, und mehr oder weniger ähnlich wie diese Syntax suchen, aber es ist nicht wirklich lohnt sich, wenn Sie gerade tun:

MessageBox( NULL, message, "", MB_OK );

Die gesamte docs auf MessageBox für weitere Informationen.

Durch die Einbeziehung sstream, können Sie std::ostringstream verwenden und eine Nachrichtenbibliothek mit dem Iostream bauen. Sie können dann .str().c_str() anrufen und eine char * zu MessageBox passieren bekommen.

Wenn Sie mit diesem in der Vergangenheit konfrontiert, habe ich ein stringstream zusammen mit einem Manipulator, dass Sie die aktuellen Inhalte des stringstream mit MessageBox:

#include <windows.h>
#include <sstream>
#include <ostream>

std::ostream &MessageBox(std::ostream &s) {
    std::ostringstream *st = dynamic_cast<std::ostringstream *>(&s);
    if (NULL != st)
        ::MessageBox(NULL, st->str().c_str(), "", MB_OK);
    return s;
}

Um dies zu verwenden, sieht die Syntax einen fairen Betrag wie cout verwenden, aber mit MessageBox ersetzt std::endl. Zum Beispiel:

std::ostringstream stm;
stm  << " blah blah blah. Value: " << 1213.1231 << MessageBox;

Edit: meist für fnieto. In diesem Fall wird die niedergeschlagenen wirklich ist notwendig. Der Grund dafür ist recht einfach: ein typischer Inserter empfängt und gibt einen Verweis auf eine ostream:

std::ostream &operator<<(std::ostream &os, T const &t) { 
    // code here to insert t into os, then return os;
}

Dies ist das ursprüngliche Objekt string und leise (und sicher) wirft es auf eine einfache Ostream auf. Das ist in Ordnung in sich selbst, und funktioniert gut für die meisten Kuvertiermaschinen und Manipulatoren, weil sie nur interact mit der ostream Schnittstelle selbst.

Dieser Manipulator ist jedoch ein bisschen anders - es verwendet das str() Mitglied, das ostream überhaupt nicht definieren. Für unseren Aufruf an str() zu lösen und Kompilierung, haben wir die ostream & zu einem ostringstream & konvertieren, so dass der Compiler bewusst ist, dass das Objekt wir mit wirklich arbeiten wird ein str() Mitglied hat.

, um die niedergeschlagenen zu beseitigen, würden wir wirklich nur eine Wahl haben: machen seine Parameter ein ostringstream &. Das würde funktionieren, solange wir Betreiber nie gekettet:

my_stream << x;
my_stream << MessageBox;

aber an die Kette versuchen diejenigen scheitern würde:

// should be equivalent:
my_stream << x << MessageBox;

Schlimmer noch, die Fehlermeldung des Compilers wird wahrscheinlich versuchen, den Benutzer etwas über std::basic_ostream<char>::str() zu erzählen, die nicht in der Benutzer-Code genannt wird. Noch schlimmer sind, sind die meisten Menschen zu verketten oder nicht identische Ergebnisse gibt ausreichend daran gewöhnt, dass es wahrscheinlich eine Weile, bis auch herausfinden, warum der Code manchmal funktionierte gut, und andere Zeiten versäumt zu kompilieren, mit einer völlig unverständlichen Fehlermeldung nehmen würde.

Keine einfache Weise sowieso.

Die c in cout für Konsole steht, so sind Sie wahrscheinlich kein Glück.

Wenn es nur die Syntax Sie zu kopieren suchen, dann können Sie Ihre eigene Stream-Klasse schreiben, die eine Message-Box unter der Haube erzeugt und zeigt es.

  

Kann ein Fenster Meldungsfeld sein Display der cout Syntax?

Sie können es mit std::cout nicht tun. std::cout verspricht nicht sogar Unicode / Wide-Zeichen zu handhaben (siehe std::wcout), obwohl Windows-die cout keine Probleme mit großen Zeichen.

Sie können diese leicht mit der gleichen tun Syntax ; das heißt, könnte man leicht eine Bibliothek schreiben, dass Überlastungen Dialogfelder anzuzeigen operator<<. Der Versuch, alle Informationen in das Dialogfeld passieren auf diese Weise sehr schwierig sein würde, obwohl (wie würden Sie Ihnen sagen, welche Tasten zu zeigen, was diese Tasten tun sollten, wenn sie gedrückt wird, wo sollten diese Tasten, und die Größe und die Position der Fenster selbst?).

Sie können auf etwas aussehen wollen wie ncurses . Die Syntax ist anders, aber ich habe ein Gefühl, es ist das, was Ihre Mitarbeiter suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top