消息框检测YesNoCancel按钮

5

我正在使用C++ Builder中的VCL表单应用程序。 请帮我编写一些代码,以显示具有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 是一个整数,如何在消息框中显示它?

我遇到了以下错误: 无效的指针加法。

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

4个回答

17

请注意,您需要在调用 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 的文档。


我已经更新了我的回答。请尽量不要在一个帖子中问超过一个问题。 - Mark Ingram
好的,抱歉。关于CString,我已经添加了以下内容,但没有成功:#include <atlstr.h>。我需要做什么才能让CString正常工作? - user1690531
我不确定,你是否尝试添加 <cstringt.h>?这是文档 - http://msdn.microsoft.com/en-us/library/5bzxfsea.aspx - Mark Ingram
我已经尝试了cstringt.h和atlstr.h,但都没有成功。我正在使用C++ Builder。您是否知道在C++ Builder中有没有等效的代码可以工作? - user1690531
CString是微软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(), ...); - Remy Lebeau

4
我没有使用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*)字符串(请参见项目选项中的“_TCHAR maps to”部分)
要了解更多详情,请查看此处

谢谢。检测是按下了“是”、“否”还是“取消”按钮的最佳方法是什么?我是否应该将Messagebox结果放入变量中,然后使用if语句来检测按钮,或者使用其他方法? - user1690531
如果您需要对所有3种情况进行不同处理,那么是的,您应该将其存储在变量中,并使用ifswitch-case语句做出相应的反应。否则,您的代码就可以了,但问题是为什么不只使用MB_YESNO呢? - Zdeslav Vojkovic
我只是在考虑其他情况,可能需要超过两个消息按钮。我应该将消息框中的变量返回到int中,还是有特定类型的消息框返回? - user1690531
按下 F1 将显示文档 :). 正如我所说,我不使用 C++ Builder,所以我也在 Google 上查找了所有这些内容。 - Zdeslav Vojkovic

1

我不确定如何在C++构建中完成这个任务,但是你需要启用类似于多位字符的某些功能,但是你需要查阅编译器文档以确认。


0

以上所述可能对于VS 2015已经过时。在我的情况下

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

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

函数调用中参数过多。

如果我写成:

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;
}

它会工作的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接