使用"cout" - C++在Windows对话框中显示消息

Che*_*eso 4 c++ windows cout messagebox

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

我还需要压缩/隐藏命令提示符窗口.

有一些方法可以调用消息框功能并通过其用法显示文本,但这里的主要约束是必须使用cout语法.

cout <<  "message";
Run Code Online (Sandbox Code Playgroud)

我想在cout输出中调用VB msgbox命令,但找不到任何有用的东西.

有任何想法吗?

Rus*_*ist 10

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

MessageBox( NULL, message, "", MB_OK );
Run Code Online (Sandbox Code Playgroud)

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


fni*_*eto 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
}
Run Code Online (Sandbox Code Playgroud)

只要刷新std :: cout流,就会显示一个弹出窗口.


Ste*_*ell 6

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


Jer*_*fin 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;
}
Run Code Online (Sandbox Code Playgroud)

要使用它,语法看起来很像使用cout,但MessageBox更换std::endl.例如:

std::ostringstream stm;
stm  << " blah blah blah. Value: " << 1213.1231 << MessageBox;
Run Code Online (Sandbox Code Playgroud)

编辑:主要是为fnieto.在这种情况下,垂头丧气真的必要的.原因很简单:典型的插入器接收并返回对ostream的引用:

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

这将获取原始的stringstream对象并静默(并安全地)将其转换为简单的ostream.这本身就很好,并且适用于大多数插入器和操纵器,因为它们只与ostream接口本身交互.

然而,这个操纵器有点不同 - 它使用的str()成员ostream根本没有定义.对于我们要求str()解析和编译的调用,我们必须将其转换ostream &为a ostringstream &,因此编译器知道我们正在使用的对象确实会有一个str()成员.

为了消除向下倾斜,我们实际上只有一个选择:使其参数成为一个ostringstream &.只要我们从不链接运营商,这将有效:

my_stream << x;
my_stream << MessageBox;
Run Code Online (Sandbox Code Playgroud)

但试图连锁那些会失败:

// should be equivalent:
my_stream << x << MessageBox;
Run Code Online (Sandbox Code Playgroud)

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