2009-09-15 4 views
1

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

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 для всех остальных ,

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

+1

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

ответ

1

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

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

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

1

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

Смежные вопросы