可以使用cout语法显示Windows消息框吗?
我还需要压缩/隐藏命令提示符窗口。
有一些方法可以调用消息框功能并通过其用法显示文本,但这里的主要约束是必须使用cout语法。
cout << "message";
我正在考虑在cout输出中调用VB msgbox命令,但找不到任何有用的东西。
有什么想法吗?
答案 0 :(得分:10)
C ++流使用控制台或文件流。 Windows在一个或多或少完全不同的范例上工作,因此cout上下文对于使用它来说并不是一个好的。你可能会完全混搭一些最终或多或少会起作用的东西,看起来或多或少类似于这种语法,但是当你可以做的时候它并不值得:
MessageBox( NULL, message, "", MB_OK );
有关详细信息,请参阅MessageBox上的完整文档。
答案 1 :(得分:9)
首先要考虑的是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流,就会显示一个弹出窗口。
答案 2 :(得分:6)
通过加入sstream
,您可以使用std::ostringstream
并使用iostream库构建消息。然后,您可以调用.str().c_str()
并获取char *
以传递给MessageBox。
答案 3 :(得分: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;
}
要使用此功能,语法看起来很像使用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 &
,因此编译器知道我们正在使用的对象确实会有{ {1}}成员。
为了消除向下转换,我们实际上只有一个选择:将其参数设为str()
。只要我们从未将运营商链接起来,那就行不通了:
ostringstream &
但是尝试将它们链接起来会失败:
my_stream << x;
my_stream << MessageBox;
更糟糕的是,编译器的错误消息可能会尝试告诉用户有关// should be equivalent:
my_stream << x << MessageBox;
的内容,而用户代码中根本没有提及。更糟糕的是,大多数人已经习惯于链接或不提供相同的结果,甚至可能需要一段时间甚至弄清楚为什么代码有时工作正常,而其他时候无法编译,带有完全难以理解的错误消息。
答案 4 :(得分:3)
无论如何都没有简单的方法。
cout中的c代表控制台,所以你可能运气不好。
如果它只是您要复制的语法,那么您可以编写自己的流类,在引擎盖下创建一个消息框并显示它。
答案 5 :(得分:3)
答案 6 :(得分:1)
可以使用cout语法显示Windows消息框吗?
您无法使用std::cout
执行此操作。 std::cout
甚至不承诺处理Unicode /宽字符(请参阅std::wcout
),尽管Windows cout
对宽字符没有任何问题。
您可以使用相同的语法轻松完成;也就是说,您可以轻松编写一个重载operator<<
的库来显示对话框。试图将所有信息传递到对话框那样是非常困难的(你怎么说你要显示哪些按钮,这些按钮在按下时应该做什么,这些按钮应该在哪里,以及尺寸和位置窗口本身?)。
您可能希望查看ncurses之类的内容。语法不同,但我有一个 感觉这是你的同事正在寻找的东西。