Диалоговое окно сохранения 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, Вам необходимо проверить этот код уведомления и отвечать только на конкретное событие или события, представляющие интерес. Таким образом, недостаточно обнаружить уведомление о событии для этого элемента управления, вы также должны определить, какое это событие.

Другие вопросы по тегам