Вопрос

Я пытаюсь сохранить файл с помощью GetSaveFileName и хочу добавить пару дополнительных всплывающих окон внизу диалогового окна сохранения файла, чтобы пользователь мог указать дополнительные параметры. Я пытаюсь следовать документации MSDN (в частности, настройка стиля проводника ) на эту тему, но, кажется, не могу отобразить мой пользовательский элемент. Я считаю, что правильно настроил структуру OPENFILENAME , так как я получаю вызовы в свой OFNHookProc . Насколько я знаю, именно во время сообщения WM_INITDIALOG я должен создавать свои субконтроли, что я и делаю:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      dialog, // the window parameter from the OFNHookProc
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

if (settings_popup)
{
    HWND parent = ::GetParent(settings_popup); // for verification
    ::ShowWindow(settings_popup, SW_SHOW);
    ::EnableWindow(settings_popup, true);
}

Я также возвращаю 1 из моего OFNHookProc для сообщения WM_INITDIALOG и 0 для всего остального.

Во всех моих попытках отобразить комбинированный список в диалоговом окне, он не появляется. Чего мне не хватает в моем коде, чтобы сделать выпадающий список частью моей настройки диалога сохранения файла?

Это было полезно?

Решение

При вызове CreateWindowEx () для создания дочернего окна вам нужно использовать GetParent (), чтобы получить родительское окно диалога, а затем использовать этот HWND в качестве родительского окна. Не используйте сам диалог в качестве родителя. Другими словами:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      ::GetParent(dialog),
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

Другие советы

Обычно, когда вы добавляете элементы управления в общий диалог, эти новые элементы управления находятся в шаблоне диалога (как ресурс или в памяти). Таким образом, окна заботятся о положении.

Если вы по-прежнему хотите создавать свои элементы управления во время выполнения, я полагаю, что вам также нужно изменить размер и поместить своего родителя в WM_INITDIALOG или CDN_INITDONE (ваш родительский пустое диалоговое окно внутри основного диалогового окна). Используйте такой инструмент, как WinSpy ++ для " отладки " диалог во время выполнения

Передайте элементы управления в отдельный шаблон ресурсов диалогового окна в параметре lpTemplateName структуры OPENFILENAME. Это работает очень просто и надежно. Это описано в ссылке, на которую вы ссылались,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top