Настройка вида папки в CFileDialog (MFC) - PullRequest
1 голос
/ 12 августа 2011

Существует ли стандартный способ установки вида папки в CFileDialog (включен стиль Vista)?Я пытаюсь заставить его отображать подробный вид и некоторые пользовательские столбцы.

Я реализовал обработчик столбцов Windows 7, который отображает информацию о приложении для файлов, созданных моим приложением.Однако, чтобы просмотреть эти пользовательские столбцы в окне проводника или обычном диалоговом окне файла, мне нужно вручную установить для представления папки значение «Подробности», а затем выбрать нужные столбцы.

Это прекрасно работает, но цель состоит в том, чтобы средство выбора файлов в приложении автоматически показывало эти столбцы в представлении сведений, если только пользователь не изменит стиль представления.

Я исследовалразличные способы сделать это и не нашли работоспособного решения.Кажется, что в пакетах свойств оболочки хранятся типы и ширины столбцов, а также стиль представления, но большая их часть является двоичной и явно не документирована.Если я скопирую свойства мешка, я могу изменить настройки просмотра, но это кажется хрупким.

Буду очень признателен за любые указатели или другую помощь.

1 Ответ

2 голосов
/ 12 августа 2011

Я не думаю, что Explorer загружает обработчики столбцов в Vista / Windows 7.

Чтобы изменить настройки просмотра в диалоговом окне файла Vista:

Check OS version (needs Vista or higher)    
Not sure which event is raised on startup, OnFolderChange maybe?
assuming OnFolderChange is raised, override CFileDialog::OnFolderChange:
call GetIFileSaveDialog/GetIFileOpenDialog to get IFileDialog
//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_SFolderView with IID_IFolderView2
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces

В качестве альтернативы вы можете попробовать недокументированный метод #2

//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_STopLevelBrowser with IID_IShellBrowser
call IShellBrowser::QueryActiveShellView to get IShellView
QI IFolderView2 from IShellView
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces
...