在“窗口”对话框中使用“cout”显示消息 – C ++

可以使用cout语法显示一个Windows消息框

我还需要命令提示符窗口被隐藏/隐藏。

有一些方法可以调用messagebox函数并通过其用法显示文本,但是这里的主要约束是必须使用cout语法。

cout << "message"; 

我想在cout输出调用VB msgbox命令,但找不到任何工作。

有任何想法吗?

你应该考虑的第一件事是MessageBox停止线程,直到你关闭窗口。 如果这是你想要的行为,那么继续。

你可以创建一个自定义的streambuf并将其设置为std::cout

 #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 } 

只要std :: cout流被刷新,就会弹出一个窗口。

C ++流与控制台或文件流一起工作。 Windows在一个或多或少完全不同的范例工作,所以cout上下文是不是一个很好的工作与此。 你可能会完全混杂一些最终会或多或少工作的东西,并且看起来或多或少类似于这种语法,但是当你可以这样做的时候,它并不是真的值得:

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

有关详细信息,请参阅MessageBox的完整文档。

通过包含sstream ,您可以使用std::ostringstream并使用iostream库构建消息。 然后可以调用.str().c_str()并获取一个char *传递给MessageBox。

在过去遇到过这种情况时,我使用了一个stringstream以及一个使用MessageBox显示stringstream流的当前内容的操纵器:

 #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()成员。

为了消除沮丧,我们真的只有一个选择:使其参数ostringstream & 。 只要我们永远不要链接运营商,那就行得通了:

 my_stream << x; my_stream << MessageBox; 

但试图链接将失败:

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

更糟糕的是,编译器的错误信息可能会尝试告诉用户std::basic_ostream<char>::str() ,这在用户代码中根本没有提到。 更糟糕的是,大多数人习惯于链接或不给出相同的结果,甚至可能需要一段时间才能弄清楚为什么代码有时可以正常工作,而其他时间则无法编译,并带有无法解读的错误信息。

反正没有简单的方法。

cout中的c代表控制台,所以你可能不太好运。

如果它只是你想要复制的语法,那么你可以编写自己的流类,在底层创建一个消息框并显示它。

您可能需要检查: 如何将stdout重定向到Windows应用程序中的某个可见显示?

可以使用cout语法显示一个Windows消息框?

你不能用std::coutstd::cout甚至不承诺处理Unicode /宽字符(见std::wcout ),虽然Windows的cout没有宽字符的问题。

你可以很容易地用相同的语法来做到这一点。 也就是说,您可以轻松地编写一个重载operator<<以显示对话框的库。 试图以这种方式将所有信息传递给对话框将是非常困难的(虽然(你怎么说,哪些按钮显示,这些按钮应该做什么,当按下,这些按钮应该,以及大小和位置的窗口本身?)。

你可能想看看像ncurses 。 语法是不同的,但我有一种感觉,这是你的同事正在寻找。