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++ 表单、简单消息框和将文本从文本字段分配给字符串时出错的主要内容,如果未能解决你的问题,请参考以下文章