【问题标题】:Messagebox detect YesNoCancel button消息框检测 YesNoCancel 按钮
【发布时间】:2012-09-25 08:03:41
【问题描述】:

我在 C++ Builder 中使用 VCL Forms 应用程序。 能否请我在一些代码中提供一些帮助,以显示带有 YesNoCancel 按钮的消息框,然后检测是否按下了是、否或取消按钮。

这是我的代码:

if(MessageBox(NULL, "Test message", "test title",  MB_YESNOCANCEL) == IDYES)
{

}

我已包含以下内容:

#include <windows.h>

我收到以下错误:

E2034 无法将 'char const[13]' 转换为 'const wchar_t *'

E2342 参数“lpText”中的类型不匹配(需要“const wchar_t *”,得到“const char *”)

更新

这是我的代码:

const int result = MessageBox(NULL, L"You have " + integerNumberOfImportantAppointments + " important appointments. Do you wish to view them?", L"test title",  MB_YESNOCANCEL);

值:integerNumberOfImportantAppointments 是一个整数。如何在消息框中显示它?

我收到以下错误:无效的指针添加。

另外,我可以选择消息框的图标吗?本例中的一个问题。

【问题讨论】:

    标签: c++ messagebox vcl


    【解决方案1】:

    给你。您需要在对MessageBox 的调用中使用宽字符,并且您需要将结果存储在一个变量中,然后再确定下一步该做什么。

    const int result = MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL);
    
    switch (result)
    {
    case IDYES:
        // Do something
        break;
    case IDNO:
        // Do something
        break;
    case IDCANCEL:
        // Do something
        break;
    }
    

    更新,以下问题编辑:

    // Format the message with your appointment count.
    CString message;
    message.Format(L"You have %d important appointments. Do you wish to view them?", integerNumberOfImportantAppointments);
    
    // Show the message box with a question mark icon
    const int result = MessageBox(NULL, message, L"test title",  MB_YESNOCANCEL | MB_ICONQUESTION);
    

    您应该阅读MessageBox 的文档。

    【讨论】:

    • 我已经更新了我的答案。尽量不要在每篇文章中提出多个问题。
    • 好的,抱歉。关于 CString,我添加了以下内容,但没有成功:#include 。我需要做什么才能让 CString 正常工作?
    • 我不确定,你试过添加 吗?这是文档 - msdn.microsoft.com/en-us/library/5bzxfsea.aspx
    • 我已经尝试了 cstringt.h 和 atlstr.h,但没有运气。我正在使用 C++ 生成器。是否有一段可以在 C++ Builder 中工作的等效代码。
    • CString 是 Microsoft MFC 类。对于 C++Builder VCL,请改用WideString(C++Builder 2007 或更早版本)或UnicodeString(C++Builder 2009 或更高版本),例如:WideString s = "You have " + IntToStr(integerNumberOfImportantAppointments) + " important appointments. Do you wish to view them?"; MessageBox(NULL, s.c_bstr(), ...); 或UnicodeString s = "You have " + IntToStr(integerNumberOfImportantAppointments) + " important appointments. Do you wish to view them?"; MessageBox(NULL, s.c_str(), ...);
    【解决方案2】:

    我没有使用 C++ Builder 的经验,但您似乎使用的是 ANSI 字符串,其中需要 UNICODE(实际上是宽字符,但我们暂时忽略细节)字符串。试试这个:

    if(MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL) == IDYES)
    

    更好的是,为了确保您的字符串符合您的应用设置,您可以使用:

    if(MessageBox(NULL, _T("Test message"), _T("test title"),  MB_YESNOCANCEL) == IDYES)
    

    这将导致在 UNICODE 构建中使用宽 (wchar_t*) 字符串,在非 UNICODE 构建中使用窄 (char*) 字符串(请参阅Project Options 中的“_TCHAR 映射到”部分)

    更多详情请见here

    【讨论】:

    • 谢谢。检测是否按下是、否或取消按钮的最佳方法是什么?我是把 Messagebox 结果放到一个变量中,然后使用 if 语句来检测按钮,还是其他方法?
    • 如果您需要以不同的方式处理所有 3 种情况,那么可以,您应该将其存储在一个变量中并使用 if 或 switch-case 语句做出相应的反应。否则,您的代码很好,但问题是为什么不只使用 MB_YESNO。
    • 我只是在想我可能喜欢两个以上消息按钮的其他情况。我是否将消息框中的变量返回到 int 中,还是有特定类型的消息框返回?
    • 按 F1 将显示文档:)。正如我所说,我不使用 C++ Builder,所以我也在 Google 上查找了所有这些。
    【解决方案3】:

    我不确定如何在 C++ Building 中执行此操作,但您需要启用我认为类似多位字符的功能,但您需要使用编译器检查文档。

    【讨论】:

      【解决方案4】:

      上面写的所有内容对于 VS 2015 来说可能已经过时了。就我而言

       MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL);
      

      不起作用,因为第一个参数过多。错误输出是:

      to many arguments in functional call.

      如果我写了:

      const int result = MessageBox( L"Test message", L"test title",  MB_YESNOCANCEL); //Without NULL
      
      switch (result)
      {
      case IDYES:
          // Do something
          break;
      case IDNO:
          // Do something
          break;
      case IDCANCEL:
          // Do something
          break;
      }
      

      会成功的!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        相关资源
        最近更新 更多