Попытка захватить текст из поля редактирования при нажатии кнопки, а затем отобразить его в другом поле редактирования

Я очень новичок в кодировании графического интерфейса Win32, и у меня было довольно много трудностей с захватом пользовательского ввода.

По сути, я пытаюсь сделать так, чтобы пользователь ввел некоторый текст в текстовое поле (назовите его текстовым полем A), нажмите кнопку, а затем скопируйте этот текст в другое текстовое поле (назовите его текстовым полем B). Я пытаюсь использовать функцию GetWindowsText(), чтобы скопировать текст из текстового поля A в буфер, а затем при нажатии кнопки отправить сообщение в текстовое поле B, установив текст равным содержимому буфера. Простой не так ли? ... Код моего обратного вызова:

    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
        case IDC_MAIN_BUTTON:
        {
            GetWindowText(hwnd_path, buffer, 5);
            SendMessage(hEdit,WM_SETTEXT,NULL,(LPARAM)buffer);
            MessageBox(NULL, buffer, TEXT("Edit Text"), MB_OK);
        }
        break;
    }
    break;

hwnd_path — это дескриптор текстового поля A, hEdit — дескриптор текстового поля B, а буфер был объявлен как: TCHAR buffer[6] — эти переменные были объявлены глобально, поэтому все они должны находиться в области действия функции обратного вызова. Я добавил окно сообщений только для того, чтобы дважды проверить значение буфера.

Проблема в том, что при нажатии кнопки ничего не появляется ни в текстовом поле B, ни в окне сообщений - кажется, что буфер остается пустым после команды GetWindowText(hwnd_path, buffer, 5).

Если кто-то может дать какой-либо совет, я был бы очень признателен.

Джек


person JWizzle    schedule 02.12.2013    source источник
comment
Вы его отладили? А лучше используйте SetWindowText и принудительно перерисуйте позже.   -  person icbytes    schedule 02.12.2013
comment
Что возвращает GetWindowText? Если он возвращает 0, вызовите GetLastError и посмотрите код ошибки.   -  person ScottMcP-MVP    schedule 02.12.2013
comment
Привет, спасибо за предложения. При отладке кажется, что значение буфера начинается со значения \000\000\000\000\000 (это я нахожу тревожным само по себе, так как кажется, что в нем больше элементов, чем то, с чем оно было инициализировано:/) и не изменяется вызовом GetWindowText()... Я пытаюсь придерживаться функции GetWindowText(), так как моя реальная цель - иметь возможность вводить пользовательский ввод из текстового поля, сохранять его в переменной, а затем обрабатывать с использованием некоторого кода, который у меня уже есть написано. Любые другие идеи будут хорошо приняты :)   -  person JWizzle    schedule 02.12.2013
comment
'\000' равно '\0' равно 0. Прислушайтесь к совету ScottMcP-MVP.   -  person alk    schedule 02.12.2013
comment
Ах, хорошо, спасибо Алк - даже тогда буфер должен иметь 6 элементов, не так ли (в конце концов, он был объявлен TCHAR buffer[6]). Если \000 представляет собой один элемент, то у него всего пять, верно? ... Также я должен упомянуть, что ошибки нет - программа работает, она просто не работает, как я надеюсь (т.е. текст в текстовом поле A не копируется в буфер по какой-либо причине)   -  person JWizzle    schedule 02.12.2013
comment
Какое значение возвращает GetWindowText? Какое значение возвращает GetLastError(), когда GetWindowText возвращает 0?   -  person manuell    schedule 02.12.2013
comment
Прочтите документацию по GetWindowText(): если функция завершается успешно, возвращаемое значение представляет собой длину скопированной строки в символах, не включая завершающий нулевой символ. Если в окне нет строки заголовка или текста, если строка заголовка пуста или если окно или дескриптор элемента управления недействительны, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.   -  person Remy Lebeau    schedule 03.12.2013


Ответы (1)


Используйте SetWindowText вместо вызова SendMessage.

Я подозреваю, что ваши дескрипторы hEdit и/или hwnd_path не такие, как вы думаете. Убедитесь, что эти переменные HWND действительно ссылаются на ваши дескрипторы редактирования и управления текстом, когда вы их создавали.

Не ожидайте, что диалоговое окно мгновенно обновится после вызова «MessageBox». Для фактического завершения работы API SetWindowText может потребоваться несколько сообщений внутреннего сообщения. MessageBox качает сообщения внутри себя, так что это, вероятно, нормально.

Вот пример кода, который действительно работает. Он был написан внутри диалогового окна wndproc. Если вы находитесь в диалоговом окне, замените два вызова GetDlgItem назначением дескриптора окна, возвращенного при создании поля редактирования и текста.

    case WM_COMMAND:
    {
        switch LOWORD(wParam)
        {
            case IDC_BUTTON1:
            {
                wchar_t szEditText[300] = {0};

                // If you aren't using DialogBox(), then replace these apis by assigneing hEdit and hText with the HANDLES of your created controls.
                HWND hEdit = GetDlgItem(hwnd, IDC_EDIT1);
                HWND hText = GetDlgItem(hwnd, IDC_TEXT1);

                GetWindowText(hEdit, szEditText, ARRAYSIZE(szEditText));
                SetWindowText(hText, szEditText);

                // If this Window was created with DialogBox, then return TRUE
                // Otherwise, return 0.
                return TRUE;
            }
person selbie    schedule 03.12.2013