-1

私はここに来たばかりで、素晴らしいコミュニティから多くのことを学びたいと思っています。

私はいくつかの GUI C++ プログラミングを学び始めていますが、基本のみです。mingw を使用して独自のリソースとヘッダー ファイルを作成する前に、1 つの 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、またはその他の操作用の型として返す方法について、誰かアイデアはありますか? ありがとう。

編集-

GetDigItem() を使用してユーザー入力を返すことができる mingw の場所を見つけました。以下のコードに示すように、System::String^ を使用して VC++ でそれを行います。

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 - これは C++ ではないため、Microsoft がこれを Visual 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 を超えた文字にアクセスします。他の OS では、std:: wstring は多くの場合、32 ビット文字値の文字列です。)

std::string変換せずにワイド文字列を a に代入することはできません。ワイド文字列 (例: std::wstring) を使用するか、変換を適用するかを選択します。

変換の場合、Windows にはWideCharToMultibyte使用できる機能があります。C++ にはstd::codecvt.

于 2013-02-04T19:25:07.407 に答える