GetWindowText()不起作用

时间:2016-12-03 23:07:53

标签: c++ winapi visual-studio-2015

最初我不得不说我对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教程,如果你对英语中的任何一个很好,我会很高兴。

1 个答案:

答案 0 :(得分:1)

您应该直接使用GetDlgItemInt来检索sizeXsizeY,否则您应该将文本作为字符串然后将其转换为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;
}