Диалоговое окно сохранения WINAPI открывается дважды при нажатии на элемент управления РЕДАКТИРОВАНИЕМ

#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 .