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

时间:2009-11-13 16:43:24

标签: c++ windows messagebox cout

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

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

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

cout <<  "message";

我正在考虑在cout输出中调用VB msgbox命令,但找不到任何有用的东西。

有什么想法吗?

7 个答案:

答案 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之类的内容。语法不同,但我有一个 感觉这是你的同事正在寻找的东西。