Visual C++ 表单、简单消息框和将文本从文本字段分配给字符串时出错

Posted

技术标签:

【中文标题】Visual C++ 表单、简单消息框和将文本从文本字段分配给字符串时出错【英文标题】:Error on Visual C++ Forms, Simple MessageBox and assign text from textfield to string 【发布时间】:2012-03-28 17:33:50 【问题描述】:
private: System::Void btn_entrar_Click(System::Object^  sender, System::EventArgs^  e) 

string btn_texto = txt_login->Text->ToString();
MessageBox(NULL, "Hello!", btn_texto.c_str(), MB_OK | MB_ICONEXCLAMATION);


我通常在 Visual C++ Studio 2008 Professional 中创建一个 Windows 窗体应用程序,我添加了一个单击功能(通过在设计模式下双击按钮),所以我在它生成的函数中编写了代码。

它产生了 2 个错误:

错误一:

错误 C2440:“正在初始化”:无法从“System::String ^”转换 到 'std::basic_string<_elem>'

错误 2:

error C2872: 'MessageBox' : ambiguous symbol 1> 可能是 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winuser.h(7374) : int MessageBox(HWND,LPCTSTR,LPCTSTR,UINT)' 1> 或 'c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::MessageBox'

我在 Windows 7 的 Visual Studio 2008 Professional 和 .NET Framework 3.5 下的项目中使用 C++ 创建

有人知道我该如何解决这个问题吗?我查遍了它,但找不到解决方案。 我希望我提供了足够的信息。 提前致谢。

@edit 由 Cody Gray 给出的示例

System::String btn_texto = txt_login->Text->ToString();
System::Windows::Forms::MessageBox(NULL, "Hello!", "HI", MB_OK | MB_ICONEXCLAMATION);

遇到的错误

错误 C3149: 'System::String' : 如果没有 ***“^”错误 C2661: 'System::Windows::Forms::MessageBox::MessageBox':没有重载 函数接受 4 个参数

所以我通过在 System::String 之后添加 ^ 解决了第一个错误 像这样:

System::String^ btn_texto = txt_login->Text->ToString();

但是第二个错误没有修复,顺便问一下,我如何在 MessageBox 函数中添加“btn_texto”内容?谢谢!

【问题讨论】:

【参考方案1】:
System::String^ btn_texto = txt_login->Text->ToString();
MessageBox::Show( "Working", "Info",    MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

解决了。 :)

【讨论】:

【参考方案2】:

您到处混用 C++ 字符串类型 (std::string) 和 .NET Framework 字符串类型 (System::String),结果不会很好。或者至少它不会很简单。决定你要使用哪一个并坚持下去。

更具体地说,第一个错误是由这一行错误引起的:

string btn_texto = txt_login->Text->ToString();

    它出错的第一个原因是因为它创建了一个 std::string 类型的对象(假设你的代码文件顶部有一个 using namespace std; 语句),它是 C++ 字符串类型,而不是.NET Framework 字符串类型。 .NET Framework 字符串类型是您可能希望在 .NET WinForms 应用程序中使用的类型。您必须将命名空间完全限定为 System::String

    错误的第二个原因是使用ToString() 方法将String 对象(由Text 属性返回)转换为String 对象是没有意义的。完全关闭最后一个函数调用。

第二个错误是由 Win32 标头提供 MessageBox 函数引起的,.NET Framework 也是如此。编译器需要知道你想调用哪一个。

    要调用the Win32 MessageBox function(就像您现在尝试做的那样),您需要使用全局范围解析运算符:::MessageBox

    但是你会遇到无法从System::String 转换成C 风格字符串的问题。有关如何在 C++/CLI 中可用的各种字符串类型之间进行转换的说明,请参阅 this article。

    更简单的方法可能是调用the .NET version of the MessageBox function,您可以通过完全限定来完成,如下所示:System::Windows::Forms::MessageBox。此版本的优点是您不需要进行任何字符串转换,因为它接受System::String 类型的参数。 .NET MessageBox 包装器支持与 Win32 MessageBox 函数相同的所有选项,但其中一些选项的顺序不同,因此您需要特别注意文档。

【讨论】:

我在问题中添加了一个“@edit Cody Gray”,向您展示我做了什么以及我遇到了什么错误,检查一下,我还询问了如何将 btn_texto 作为一部分添加到 MessageBox的字符串,我还想将“btn_texto”内容与其他文本连接起来,我该怎么做?

以上是关于Visual C++ 表单、简单消息框和将文本从文本字段分配给字符串时出错的主要内容,如果未能解决你的问题,请参考以下文章

C#Visual Studio 2017.单词在文本框和标签中更改了顺序

使用 C++ 从文本行中提取字段和值

如何使用 PHP 从文本区域解析文本中的 \n 符号

HTML5如何从文本区域中获取选定的文本

表单提交后怎么样才能不清空文本框和下拉框的值呢?

Jquery学习笔记:操作form表单元素之一(文本框和下拉框)