最初我不得不说我对WinAPI一无所知。我正在学习相当古老的教程,这似乎有点过时了。我正在尝试创建一个对话框,用户可以在其中键入下一个窗口的大小。我是在Visual Studio中使用资源编辑器(或其他任何名称)创建的。我正在尝试从编辑控件中检索数据,但GetWindowText无法正常工作。
所以我创建了名为SizeX和SizeY的全局LPTSTR(我知道我可以将它们设置为本地,然后将它们传递给创建第二个窗口的函数,但是我遇到了hInstance的问题......没关系)。
BOOL CALLBACK SettingsProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_INITDIALOG:
{
SetWindowTextA(GetDlgItem(hwnd, IDC_EDIT1), "20"); //I'm setting default input in case the user doesn't want to write anything
SetWindowTextA(GetDlgItem(hwnd, IDC_EDIT2), "20");
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
{
GetWindowText(GetDlgItem(hwnd, IDC_EDIT1), sizeX, GetWindowTextLength(GetDlgItem(hwnd, IDC_EDIT1)) + 1);
if (sizeX == NULL)
break; //breaks every time
GetWindowText(GetDlgItem(hwnd, IDC_EDIT2), sizeY, 10);
EndDialog(hwnd, IDC_BUTTON1);
}
break;
}
}
break;
default: return FALSE;
}
return TRUE;
}
我确信这段代码中有很多基本错误,所以请不要怪我:P 我不知道如何使它工作。我使用的精彩教程没有提供任何关于编辑控件的信息,它甚至有一个信息,它可能太旧了。不幸的是,这是我用我的语言找到的唯一一个WinAPI教程,如果你对英语中的任何一个很好,我会很高兴。
答案 0 :(得分:1)
您应该直接使用GetDlgItemInt
来检索sizeX
和sizeY
,否则您应该将文本作为字符串然后将其转换为int:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
{
BOOL bCheck = FALSE;
sizeX = GetDlgItemInt(hwnd, IDC_EDIT1, &bCheck, false);
sizeY = GetDlgItemInt(hwnd, IDC_EDIT2, &bCheck, false);
// or text then convert:
int textLengthX = SendDlgItemMessage(hwnd, IDC_EDIT1, WM_GETTEXTLENGTH, 0, 0);
int textLengthY = SendDlgItemMessage(hwnd, IDC_EDIT2, WM_GETTEXTLENGTH, 0, 0);
LPSTR lpTextX = (LPSTR)GlobalAlloc(GPTR, textLengthX + 1);
LPSTR lpTextY = (LPSTR)GlobalAlloc(GPTR, textLengthY + 1);
SendDlgItemMessage(hwnd, IDC_EDIT1, WM_GETTEXT, (WPARAM)textLengthX + 1, (LPARAM)lpTextX);
SendDlgItemMessage(hwnd, IDC_EDIT1, WM_GETTEXT, (WPARAM)textLengthY + 1, (LPARAM)lpTextY);
// now you have sizeX and sizeY as strings so convert them to int:
int sizeX = atoi(lpTextX);
int sizeY = atoi(lpTextY);
GlobalFree(lpTextX);
GlobalFree(lpTextY);
}
break;
}
break;
}