#c #winapi #editcontrol #save-dialog
#c #winapi #editcontrol #сохранить-диалоговое окно
Вопрос:
У меня есть EDIT
элемент управления Win32 с назначенным идентификатором ( IDC_FILE_NAME_INPUT
), и я хочу, чтобы диалоговое окно сохранения открывалось при нажатии на этот элемент управления. Я обрабатываю это в WM_COMMAND
сообщении оконного процессора:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_FILE_NAME_INPUT:
{
SetFocus(hWnd); // If I remove this the dialog opens every time it's closed
OPENFILENAME ofn;
wchar_t szFileName[MAX_PATH] = TEXT("");
ZeroMemory(amp;ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text Files (*.txt)*.txtAll Files (*.*)*.*");
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
ofn.lpstrDefExt = TEXT("txt");
if (GetSaveFileName(amp;ofn))
{
}
break;
}
}
}
break;
Когда я нажимаю на элемент EDIT
управления, открывается диалоговое окно, но когда я его закрываю (отмена, сохранение или X), оно появляется снова. Только на этот раз, когда я снова закрываю его, он остается закрытым. Если я удаляю SetFocus(hWnd);
часть, она просто продолжает открываться, пока я не закрою все приложение. Мне нужно знать, как заставить EDIT
потерять фокус, как только откроется диалоговое окно, или, может быть, я должен сделать это с другим сообщением, чем WM_COMMAND
Комментарии:
1. «IDC_FILE_NAME_INPUT» каким-то образом отправляется при закрытии?
2. @DavidHeffernan, я пытаюсь имитировать поведение ввода HTML-файла, когда при нажатии на него открывается диалоговое окно.
3. Довольно странно, что нажатие на элемент управления редактированием делает что-то другое, кроме активации элемента управления редактированием. Обычный интерфейс будет иметь соответствующую кнопку «Обзор», которая открывает диалоговое окно файла.
4. » Я хочу, чтобы диалоговое окно сохранения открывалось при нажатии на этот элемент управления «. — тогда почему вы
WM_COMMAND
вообще используете, а не что-то более похожееWM_LBUTTONDOWN/UP
вместо этого?5. Это приведет к наихудшему пользовательскому интерфейсу. Это настолько преступно нестандартно и непоследовательно, что трудно понять, какой мыслительный процесс привел к этому дизайнерскому решению. Пользователи не ожидают, что щелчок внутри элемента управления редактированием вызовет команду. И если бы они это сделали, они ожидали бы, что навигация с клавиатуры будет иметь тот же эффект. Пожалуйста, прекратите делать то, что вы пытаетесь сделать, пока не стало слишком поздно.
Ответ №1:
Родительский элемент EDIT
управления отправляется WM_COMMAND
для множества различных событий. Это задокументировано здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/bb775458 (v= против 85).aspx. Посмотрите, сколько разных событий уведомляется таким образом.
Вы обрабатываете все такие уведомления одинаково. Вместо этого вам нужно различать код уведомления, который передается в верхнем слове wParam
. Вам необходимо протестировать этот код уведомления и реагировать только на конкретное событие или события, представляющие интерес. Таким образом, недостаточно обнаружить уведомление о событии для этого элемента управления, вы также должны определить, что это за событие.
Комментарии:
1. Не
LOWORD(wPARAM)
содержит идентификатор?2. Извините, верно, младшее слово — это идентификатор, а старшее слово — код уведомления
3. Итак, я думаю
WM_COMMAND
, отправляется, когда установлен фокус, и проблема в том, что при закрытии диалогового окна он возвращает фокус на элементEDIT
управления, снова открывая диалоговое окно. Полагаю, мне нужен способ избежать этого4. Вам просто нужно делать то, что я говорю. Я не думаю, что вы уже поняли мой ответ.
5. Игнорируйте сообщение, когда
HIWORD(wParam) == EN_SETFOCUS
.