我是新来的,希望能从一个很棒的社区学到很多东西。
我开始学习一些 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 来赢得胜利!