我还需要命令提示符窗口被隐藏/隐藏。
有一些方法可以调用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::cout
。 std::cout
甚至不承诺处理Unicode /宽字符(见std::wcout
),虽然Windows的cout
没有宽字符的问题。
你可以很容易地用相同的语法来做到这一点。 也就是说,您可以轻松地编写一个重载operator<<
以显示对话框的库。 试图以这种方式将所有信息传递给对话框将是非常困难的(虽然(你怎么说,哪些按钮显示,这些按钮应该做什么,当按下,这些按钮应该,以及大小和位置的窗口本身?)。
你可能想看看像ncurses 。 语法是不同的,但我有一种感觉,这是你的同事正在寻找。