Диалоговое окно сохранения WINAPI открывается дважды при нажатии на элемент управления EDIT
У меня Win32 EDIT
управление с присвоенным идентификатором (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(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
ofn.lpstrDefExt = TEXT("txt");
if (GetSaveFileName(&ofn))
{
}
break;
}
}
}
break;
Когда я нажимаю на EDIT
управления, открывается диалоговое окно, но когда я закрываю его (Отмена, Сохранить или X), оно появляется снова. Только на этот раз, когда я закрываю его снова, он остается закрытым. Если я удалю SetFocus(hWnd);
частично, он просто продолжает открываться, пока я не закрою все приложение. Мне нужно знать, как сделать EDIT
потерять фокус, как только откроется диалоговое окно, или, может быть, я должен сделать это с другим сообщением, чем WM_COMMAND
1 ответ
EDIT
родительский элемент управления отправлен WM_COMMAND
для множества разных событий. Это задокументировано здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/bb775458(v=vs.85).aspx. Посмотрите, сколько различных событий уведомляется таким образом.
Вы обрабатываете все такие уведомления одинаково. Вместо этого вам нужно различать код уведомления, который передается в старшем слове wParam
, Вам необходимо проверить этот код уведомления и отвечать только на конкретное событие или события, представляющие интерес. Таким образом, недостаточно обнаружить уведомление о событии для этого элемента управления, вы также должны определить, какое это событие.