Я очень новичок в графическом кодировании 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)
команда.
Если бы кто-нибудь мог предложить какой-либо совет, я был бы очень благодарен.
Джек
Используйте 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;
}
Других решений пока нет …