|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Konst_One, вот этот пример, что вы привели: GetOpenFileName: Set an Open/Save Dialog\'s Initial Listview View http://vbnet.mvps.org/code/hooks/fileopensavedlghooklvview.htm в этой теме /topic/735867&hl= Он замечательный. Код: plaintext
Хотя бесполезный для Висты, ибо там вид каждой папки запоминается итак системно, и данный код ничего кроме бардака не даст. Но для XP очень так ничего. Собственно вопрос в чем. Юзер может выбирать вид Listview: иконки,таблица,report из системного тулбар в диалоге. Т.е. как спросить у Диалога (у Listview) напр. перед закрытием диалога: а в каком состоянии ты сейчас находишься (миниатюры, иконки, report)? Чтобы запомнить это значение и отображать в след. раз в том же виде? Чтоб не лепить в программе лишних настроек, но эту возможность использовать неявно. Я попробовал покопать в сторону LVM_GETVIEW Message и LVM_SETVIEW Message Код: plaintext
но это совсем не то, нужно именно в рамках той модели что в указанном примере т.е. как получить Sendmessage (hwnd(ID_LIST), Get(SHVIEW_) ) =SHVIEW_THUMBNAIL? SHVIEW_REPORT ?SHVIEW_LIST... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2010, 19:57 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Собственно, вышеуказанный пример т.е. строчка по типу Код: plaintext
Надо по сути вот что: http://www.codeproject.com/KB/winsdk/Win32TipsAndTricks.aspx?msg=2516578 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Только фиг с этим разберешься в переложении на VB. SHELLBROWSER это как бы VB-объект Internet Explorer (и там кстати все эти FVM_THUMBNAIL есть в свойствах), только как это увязать... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2010, 00:15 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
IShellBrowser --> IFolderView я не осилил. Но решил следующим образом: hwnd (Common Control Dialog) которая передается в OFNHookProc имеет родителя hWndParent = GetParent(hwnd) У hWndParent есть Child - окно класса "SHELLDLL_DefView" (которое и управляет "видами"), а сам ListView является является child-ом для "SHELLDLL_DefView" Код: vbnet 1. 2.
hwndLv ("SHELLDLL_DefView") получает сообщения вида Код: vbnet 1. 2. 3. 4. 5. 6.
Эти сообщения можно слать "ручками" Вот этот пример: GetOpenFileName: Set an Open/Save Dialog's Initial Listview View Но переключатель в Common Control Dialog (который Вид->Иконки, Эскизы, Таблица) делает абсолютно то же самое. Т.е. если отловить WM_COMMAND и прочесть wParam, то это и будет "Current Listview View". 1. При запуске Common Dialog вычисляем hwndLv ("SHELLDLL_DefView") и сабклассим его: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
2. А дальше просто ловим WM_COMMAND и читаем wParam, естественно "левые" значения wParam игнорируем: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Т.е. "Folder View" всегда устанавливается из меню диалога (по человечески), и программа помнит его для следующих запусков. Ну это для XP конечно. На Висте это не нужно и вредно. Там совершенно другой набор команд и понятий (иконки не очень большие, очень большие и т.д.). И Виста всегда сама запоминает индивидуальный вид для каждой папки. ======================================================== Можно конечно добраться до самого Listview: hwndLVIEW("SysListView32", Common Controls) И это даст какую-то информацию. Но она будет не полной, т.к. LV_VIEW_ICON не делает различий между Icon large и Thumbnails (на Висте соотв. между "большими" и "не очень большими" иконками). Как-то так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
============================= Т.е. второй вариант не (совсем) правильный. Если интересно, я допилил и приложил упомянутый проект (не с нуля ж этот тест делать). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 01:28 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Поясню на всякий случай суть сделанного: ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 01:32 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Дмитрий77, если до ViewMode можно добраться через IFolderView, то не так-то сложно это сделать. Нужна всего-то соответствующая библиотека типов. И она есть, olelib.tlb . Если подключить её в пример http://vbnet.mvps.org/code/hooks/fileopensavedlghooklvview.htm , то получим: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Теперь о более грустном, о размере иконок в Вистах и т. д. Через IFolderView его не получишь, нужен интерфейс IFolderView2 и его метод GetViewModeAndIconSize. IFolderView2 в olelib не описан. Если поступать цивилизованно, то надо либо добавить его в olelib (заодно расширив под текущие реалии FOLDERVIEWMODE), либо написать свою (это не страшно, она маленькая получится) библиотеку типов. Если поступать нецивилизованно (ввиду отсутствия в VB цивилизованных способов вызова функции по адресу), то можно получить ссылку на IFolderView2 и обойтись вызовом метода IFolderView2::GetViewModeAndIconSize() по адресу в vtbl. Кодом сейчас помочь не смогу. Да и форум читаю редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 14:21 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Бенедикт, Да думал я об этих tlb. Только постоянно натыкался на ISHF_Ex.tlb а там нужного интерфейса нет. В принципе (с твоей подачи) я все сделал чуть по-другому правда. Проект прилагаю. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
БенедиктТеперь о более грустном, о размере иконок в Вистах и т. д. Через IFolderView его не получишь, нужен интерфейс IFolderView2... А что грустить-то. Thumbnales этот метод от Icons отличает, т.е.на XP он дает исчерпывающий ответ. А что касается вистообразных, там эти махинации как я писал вообще не нужны, она итак все сама помнит. Но если очень нужно, можно использовать мой метод: сабклассить "SHELLDLL_DefView" окно. На висте wParam для больших и не очень больших видов будет выдавать РАЗНЫЕ значения -в районе 28750+/- (можете глянуть через Debug в приложенном проекте). На XP сообщения другие - те константы типа 28717+/- что приведены выше. Если использовать IMetods, то есть вопрос. Я запрашиваю "View" по команде. И я честно не знаю в каком месте (т.е. в последний момент перед закрытием диалога) в хуке Open/Save это запросить (чтоб сохранить для будущего использования). Т.е. есть CDN_OK (а если Cancel?) но не вижу CDN_CLOSE. Посему мой метод мне кажется лучше, он при смене вида генерирует событие (в сабклассинге) и результат сохраняется автоматом. Но я другой глюк счас обнаружил в своем методе. Если пользователь ушел в другую папку , то мой механизм работать перестает. Так понимаю, "SHELLDLL_DefView" меняется и сабклассинг загибается. Видимо надо переинициализировать сабклассинг всякий раз по событию CDN_ (Folder Changed). Посмотрю что можно сделать. И еще, я не понимаю где и как этот сабклассинг снять. По хорошему опять же нужен "CDN_CLOSE". Или можно не снимать? БенедиктЕсли поступать цивилизованно, то надо либо добавить его в olelib ... Если поступать нецивилизованно (ввиду отсутствия в VB цивилизованных способов вызова функции по адресу), то можно получить ссылку ...и обойтись вызовом метода ...по адресу в vtbl. А нецивилизованно это как? Как я с Win7 Audio сделал? Типа PInvoke и пробуем циферки методом тыка? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:32 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Так, вот эту olelib.tlb я в проект вложить не смог, пишет файл велик. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:34 |
|
А как узнать текущий Open/Save Dialog's Listview (THUMBNAIL,REPORT)?
|
|||
---|---|---|---|
#18+
Дмитрий77Но я другой глюк счас обнаружил в своем методе. Если пользователь ушел в другую папку , то мой механизм работать перестает. Так понимаю, "SHELLDLL_DefView" меняется и сабклассинг загибается. Видимо надо переинициализировать сабклассинг всякий раз по событию CDN_ (Folder Changed). Посмотрю что можно сделать. И еще, я не понимаю где и как этот сабклассинг снять. По хорошему опять же нужен "CDN_CLOSE". Или можно не снимать? Ну, так и сделал. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Если не снимать сабклассинг перед его "перезапуском", то прога схлопывается. А вот "крайний" сабклассинг как снять (и надо ли) не знаю. Не буду снимать. Вроде все работает. Приложил исправленный проект (без IMetods). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 18:10 |
|
|
start [/forum/topic.php?fid=60&gotonew=1&tid=2156939]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 374ms |
0 / 0 |