4

cout構文を使用してWindowsメッセージボックスを表示できますか?

コマンドプロンプトウィンドウを抑制/非表示にする必要もあります。

メッセージボックス関数を呼び出してテキストを表示する方法はいくつかありますが、ここでの主な制約は、cout 構文を使用する必要があることです。

cout <<  "message";

cout 出力で VB msgbox コマンドを呼び出すことを考えていましたが、機能するものが見つかりませんでした。

何か案は?

4

7 に答える 7

11

C++ ストリームは、コンソールまたはファイル ストリームで動作します。Windows は多かれ少なかれ完全に異なるパラダイムで動作するため、cout コンテキストはこれを扱うのに適したものではありません。おそらく、多かれ少なかれ機能し、この構文に多かれ少なかれ似ているものを完全にマッシュアップすることもできますが、次のことができる場合、それは本当に価値がありません。

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

詳細については、 MessageBoxの完全なドキュメントを参照してください。

于 2009-11-13T16:48:39.390 に答える
6

過去にこれに直面したとき、私は使用中stringstreamの現在の内容を表示するマニピュレータと一緒にstringstream使用しました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;
}

これを使用するための構文は、を使用するのとかなり似ていますが、 。coutMessageBox置き換えstd::endlます。例えば:

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

編集:主にfnieto用。この場合、ダウンキャストが本当に必要です。理由はかなり単純です。一般的なインサーターは、ostreamへの参照を受信して​​返します。

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

これにより、元のstringstreamオブジェクトが取得され、サイレントに(そして安全に)単純なostreamにキャストされます。それ自体は問題なく、ほとんどのインサーターとマニピュレーターはostreamインターフェイス自体とのみ対話するため、問題なく機能します。

ただし、このマニピュレータは少し異なります。str()メンバーを使用しますが、これostreamはまったく定義されていません。解決してコンパイルするための呼び出しstr()では、をに変換する必要がありますostream &ostringstream &これにより、コンパイラは、作業しているオブジェクトに実際にstr()メンバーが含まれることを認識します。

ダウンキャストを排除するには、実際には1つの選択肢しかありません。パラメータを。にしますostringstream &。演算子を連鎖させない限り、これは機能します。

my_stream << x;
my_stream << MessageBox;

しかし、それらを連鎖させようとすると失敗します:

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

さらに悪いことに、コンパイラのエラーメッセージは、おそらくユーザーに何かを伝えようとしますがstd::basic_ostream<char>::str()、これはユーザーのコードにはまったく記載されていません。さらに悪いことに、ほとんどの人は連鎖したり、同じ結果が得られなかったりすることに十分慣れているため、コードが正常に機能する理由や、コンパイルに失敗して完全に判読できないエラーメッセージが表示される理由を理解するのにしばらく時間がかかる可能性があります。

于 2009-11-13T18:43:23.097 に答える
6

を含めることで、iostream ライブラリを使用してメッセージを使用および構築sstreamできます。std::ostringstreamその後、 を呼び出し.str().c_str()て取得し、char *MessageBox に渡すことができます。

于 2009-11-13T17:11:18.800 に答える
3

とにかく簡単な方法はありません。

cout の c は console の略なので、おそらく運が悪いでしょう。

コピーしようとしているのが構文だけである場合は、フードの下にメッセージ ボックスを作成して表示する独自のストリーム クラスを作成できます。

于 2009-11-13T16:49:34.710 に答える
3

これをチェックしてみてください: How can I redirect stdout to some visible display in a Windows Application?

于 2009-11-13T16:50:40.730 に答える
1

cout構文を使用してWindowsメッセージボックスを表示できますか?

ではできませんstd::cout。 Windows ではワイド文字に問題はありませんが、std::coutUnicode/ワイド文字の処理を約束していません (「参考文献」を参照) 。std::wcoutcout

同じ構文で簡単に実行できます。つまり、オーバーロードoperator<<してダイアログ ボックスを表示するライブラリを簡単に作成できます。ただし、すべての情報をそのようにダイアログ ボックスに渡そうとするのは非常に困難です (どのボタンを表示するか、それらのボタンが押されたときの動作、それらのボタンの位置、サイズと位置など)窓自体?)

ncursesのようなものを見たいと思うかもしれません。構文は異なりますが、同僚が探しているものだと感じています。

于 2009-11-13T18:13:31.223 に答える