Настройка диалога сохранения файла в Win32 - PullRequest
1 голос
/ 15 сентября 2009

Я пытаюсь сохранить файл с помощью 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 для всего остального.

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

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

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

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

1 голос
/ 16 сентября 2009

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

1 голос
/ 16 сентября 2009

При вызове 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);
...