-1

我是新来的,希望能从一个很棒的社区学到很多东西。

我开始学习一些 GUI C++ 编程,但只是基础知识。在使用 mingw 并创建自己的资源和头文件之前,我已经制作了一个 win32 GUI 应用程序。此时我需要程序做的就是从文本框中获取文本。

使用 mingw,我会使用这样的回调函数,当单击某个按钮时,使用 GetDigItem() 从文本框中获取用户输入。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_LBUTTONDOWN:
         {
              char szFileName[MAX_PATH];
              HINSTANCE hInstance = GetModuleHandle(NULL);
              GetModuleFileName(hInstance, szFileName, MAX_PATH);
              MessageBox(hwnd, szFileName, "This program is:", MB_OK | MB_ICONINFORMATION);


         }
    break;

    case WM_CLOSE:
        DestroyWindow(hwnd);
    break;

    case WM_DESTROY:
        PostQuitMessage(0);
    break;

    case WM_COMMAND:
         switch(LOWORD(wParam))
             {
                 case ID_FILE_EXIT:
                      DestroyWindow(hwnd);
                      break;
                 case ID_STUFF_GO:
                      break;


                 case REG_BUTTON:
                 char NameInput[MAX_PATH];


                 // Gets inputted info from text boxes

                 // this is what I want to do in vc++
                 GetWindowText(GetDlgItem(hwnd, NAME_BOX), NameInput, MAX_PATH);

                 break;

    case WM_CREATE:
    {    

         CreateWindow (TEXT("EDIT"), TEXT("Name Here"), WS_VISIBLE | WS_CHILD | WS_BORDER, 10, 10, 230, 20, hwnd, (HMENU) NAME_BOX, NULL, NULL);
         CreateWindow (TEXT("EDIT"), TEXT("Number Here"), WS_VISIBLE | WS_CHILD | WS_BORDER, 10, 35, 230, 20, hwnd, (HMENU) SERIAL_BOX, NULL, NULL);
         CreateWindow (TEXT(button), TEXT(button1), WS_VISIBLE | WS_CHILD, 75, 60, 90, 20, hwnd, (HMENU) REG_BUTTON, NULL, NULL);

我注意到 VC++ 中的代码有点不同。我从 Windows 窗体设计器创建了一个按钮和文本框。我已经设法操纵输入的信息,并将其显示在文本框中,但我需要获取输入的信息并将其作为 char、std::string 等返回。这是我有问题的代码,它不按原样编译。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
     {
         // Storage buffer for serial and name

          std::string test;

                      // Upon button click, this will transfer inputted text to the label next to it
                      label1->Text = textBox1->Text;

          // this does not compile            
                      test = textBox1->Text;

                      // Gets inputted info from text boxes
                      // This does not compile either
                      //GetWindowText(GetDlgItem(NULL, textBox1), NameInput, MAX_PATH);
                      //GetWindowText(GetDlgItem(NULL, textBox2), SerialInput, MAX_PATH);

有没有人知道如何在文本框中获取输入的信息以作为 char、char*、(std::)string 或其他类型返回以进行进一步操作?谢谢。

编辑-

我想出了在 mingw 中我可以使用 GetDigItem() 来返回用户输入的位置,我在 VC++ 中通过使用 System::String^ 来执行此操作,如下面的代码所示。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
     {

                        label1->Text = textBox1->Text;

            //char SerialInput[MAX_PATH];
                        //test -> textBox1->Text

                        // The following compiles and works to retrieve input
                        // as a System::String^
                System::String^ userinput;
            textBox1->Text = userinput;

                        // However this yields 2 compiler error
                        // error C2065: 'marshal_as' : undeclared identifier
                        // error C2275: 'std::string' : illegal use of this type as an expression
                        std::string stdString = marshal_as<std::string>(newer);

                        // Forgive any spacing errors, this 4 space indent to repr code
                        // isn't working with my long expressions

现在的问题似乎是让 System::String^ 成为我可以使用的东西。我尝试将其转换为 std::string 并没有像我展示的那样工作,我还包含在我的 stdafx.h 中。一个字符或任何东西都会很棒。有任何想法吗?

编辑2:

我需要将 SYStem::String^ 转换为我可以转换的任何其他内容(最好是 std::string 或 char)。这是我尝试过的,并且收到了编译器错误。

System::String^ userinput;
userinput = textBox1->Text;


// method 1
const __wchar_t __pin * str1 = PtrToStringChars(userinput);

// error recieved
error C4980: '__pin' : use of this keyword requires /clr:oldSyntax command line option

// method 2
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);

// error recieved
error C2653: 'Marshal' : is not a class or namespace name
error C3861: 'StringToHGlobalAnsi': identifier not found

// method 3
// #include <atlstr.h>
// CString str3(userinput); 

// error recieved
fatal error C1083: Cannot open include file: 'atlstr.h': No such file or directory
// Where can I get this header file from?

我觉得有一些明显的事情我没有做......

PS - 微软称它为 Visual C++ 非常误导,因为这不是 C++!

PSS - 对于任何阅读本文的 C++ 编码人员,VC++ 都有自己的标准和语言,与传统的 C++ 甚至 win api 完全不同。这是最好的复杂性 - 帮自己和您的客户一个忙,坚持使用 QT 来赢得胜利!

4

1 回答 1

0

您应该指出您正在使用哪个框架(例如,MFC 或 WTL),并给出具体的编译器错误,而不是简单地说它不能编译。没有更多信息,我猜这是问题所在:

std::string test;
test = textBox1->Text;

文本字段可能是一个宽字符串。(Windows 内部使用 UTF-16,所以 - 在 Windows 上 - std::wstring 是一个 16 位字符值的字符串。大多数 Windows 函数处理访问 BMP 之外的字符的代理项。在其他操作系统上,std:: wstring 通常是一个 32 位字符值的字符串。)

您不能在没有转换的情况下将宽字符串分配给 a std::string。您的选择是使用宽字符串(例如,std::wstring)或应用转换。

对于转换,Windows 具有WideCharToMultibyte您可以使用的功能。C++ 有std::codecvt.

于 2013-02-04T19:25:07.407 回答