Вопрос по winapi, savefiledialog, customization, c++, ofnhookproc – Настройка диалога сохранения файла в Win32

1

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

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

Почему неВы просто используете собственный шаблон диалога? MSN

Ваш Ответ

3   ответа
1

вам нужно использовать 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);
1

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

1

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

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

Похожие вопросы