Visual C ++窗体,简单MessageBox上的错误,并将文本从textfield分配给字符串

时间:2012-03-28 17:33:51

标签: c++ .net visual-studio-2008 visual-c++

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个错误:

错误1:

  

错误C2440:'初始化':无法从'System :: String ^'转换   到'std :: basic_string< _Elem,_Traits,_Ax>'

错误2:

  

错误C2872:'MessageBox':模糊符号1>可能   'C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ include \ winuser.h(7374)   :int MessageBox(HWND,LPCTSTR,LPCTSTR,UINT)'1>或
  “C:\ WINDOWS \ microsoft.net \框架\ 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”内容?谢谢!

2 个答案:

答案 0 :(得分:1)

System::String^ btn_texto = txt_login->Text->ToString();
MessageBox::Show( "Working", "Info",    MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

解决了它。 :)

答案 1 :(得分:0)

您将C ++字符串类型(std::string)和.NET Framework字符串类型(System::String)混合在一起,并且这样做不会很好。或者至少它不会很简单。决定你要使用哪一个并坚持下去。

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

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

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

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

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

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

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