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

Я очень новичок в графическом кодировании 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) команда.

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

Джек

1

Решение

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

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

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

Вот пример кода, который работает. Это было написано в DialogBox 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]