cout構文を使用してWindowsメッセージボックスを表示できますか?
コマンドプロンプトウィンドウを抑制/非表示にする必要もあります。
メッセージボックス関数を呼び出してテキストを表示する方法はいくつかありますが、ここでの主な制約は、cout 構文を使用する必要があることです。
cout << "message";
cout 出力で VB msgbox コマンドを呼び出すことを考えていましたが、機能するものが見つかりませんでした。
何か案は?
cout構文を使用してWindowsメッセージボックスを表示できますか?
コマンドプロンプトウィンドウを抑制/非表示にする必要もあります。
メッセージボックス関数を呼び出してテキストを表示する方法はいくつかありますが、ここでの主な制約は、cout 構文を使用する必要があることです。
cout << "message";
cout 出力で VB msgbox コマンドを呼び出すことを考えていましたが、機能するものが見つかりませんでした。
何か案は?
C++ ストリームは、コンソールまたはファイル ストリームで動作します。Windows は多かれ少なかれ完全に異なるパラダイムで動作するため、cout コンテキストはこれを扱うのに適したものではありません。おそらく、多かれ少なかれ機能し、この構文に多かれ少なかれ似ているものを完全にマッシュアップすることもできますが、次のことができる場合、それは本当に価値がありません。
MessageBox( NULL, message, "", MB_OK );
詳細については、 MessageBoxの完全なドキュメントを参照してください。
過去にこれに直面したとき、私は使用中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;
}
これを使用するための構文は、を使用するのとかなり似ていますが、 。cout
をMessageBox
置き換え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()
、これはユーザーのコードにはまったく記載されていません。さらに悪いことに、ほとんどの人は連鎖したり、同じ結果が得られなかったりすることに十分慣れているため、コードが正常に機能する理由や、コンパイルに失敗して完全に判読できないエラーメッセージが表示される理由を理解するのにしばらく時間がかかる可能性があります。
を含めることで、iostream ライブラリを使用してメッセージを使用および構築sstream
できます。std::ostringstream
その後、 を呼び出し.str().c_str()
て取得し、char *
MessageBox に渡すことができます。
とにかく簡単な方法はありません。
cout の c は console の略なので、おそらく運が悪いでしょう。
コピーしようとしているのが構文だけである場合は、フードの下にメッセージ ボックスを作成して表示する独自のストリーム クラスを作成できます。
cout構文を使用してWindowsメッセージボックスを表示できますか?
ではできませんstd::cout
。 Windows ではワイド文字に問題はありませんが、std::cout
Unicode/ワイド文字の処理を約束していません (「参考文献」を参照) 。std::wcout
cout
同じ構文で簡単に実行できます。つまり、オーバーロードoperator<<
してダイアログ ボックスを表示するライブラリを簡単に作成できます。ただし、すべての情報をそのようにダイアログ ボックスに渡そうとするのは非常に困難です (どのボタンを表示するか、それらのボタンが押されたときの動作、それらのボタンの位置、サイズと位置など)窓自体?)
ncursesのようなものを見たいと思うかもしれません。構文は異なりますが、同僚が探しているものだと感じています。