powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Нестандартные элементы в стандартных Save и Open dialogs
13 сообщений из 13, страница 1 из 1
Нестандартные элементы в стандартных Save и Open dialogs
    #36473152
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, предпочитаю сейчас эти окна выводить через API, в духе как здесь.
/topic/730702&hl=

Вопрос в чем...
Многие программы выводят в этих окнах какие-либо нестандартные элементы.
Ну скажем предпросмотр картинки или проигрывание wav-файла.

С одной стороны элементы эти явно субъективные для разных программ, а с другой не похоже что авторы прог вручную рисуют эти "почти стандартные" Open и Save.

Пример простой задачи, которую вижу: при сохранении картинки SaveAs.. в формате jpg (JPEG) дать возможность пользователю выбрать уровень компрессии JPEG (от 1 до 100) поместив на это дело ползунок.

Как это вообще делается и решаемо ли?
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473190
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473293
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или я туплю, или вы меня не поняли. В вашем примере приведен стандартный модуль + упор на то, что можно показывать иконки/эскизы/таблицу и т.п. согласно СТАНДАРТНЫМ настройкам проводника, т.е. в белом поле.
Я же спрашиваю о том как разместить ползунок на сером фоне внизу, или скажем ту же картинку или кнопки "play/stop" (не суть) на сером фоне справа, т.е. не как управлять разными стандартными видами окна, а как добавить нестандартный элемент.
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473424
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> а как добавить нестандартный элемент.

сабклассинг+добавлять нужный контрол на диалог, Parent'ом для которого указывать hWnd диалога

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473439
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пример где-нибудь есть похожий, именно с Dialog?
Пока не очень понятно по каким словам искать...
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473463
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> А пример где-нибудь есть похожий, именно с Dialog?
> Пока не очень понятно по каким словам искать...


Например

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36473934
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот достойный пример нашел...
http://www.vbaccelerator.com/home/VB/Code/Libraries/Common_Dialogs/Using_Templates_with_Common_Dialogs/article.asp
Но это... надо разбираться, улавливать суть и отбрасывать лишнее. Для одной галки там многовато будет.
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36475715
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Ваш например пример как бы проще для понимания.
Slider вставить (и подвигать по диалогу) удалось.
Но все это дюже сложно как бы. Да и слайдер (в частности) там как-то не смотрится...
Каждый элемент размещать, потом отрабатывать, наверно ну его.

Помозговав и пошарив по инету, показалась хорошей след.идея.
Использовать штатную кнопку Help, переименованную в Options, кот. будет выводить диалоговую форму с подстройками, или разные формы, это проще, универсальнее и даже красивше, но....

В любом случае мне нужно два флага.
Or OFNexplorer Or OFNEnableHook
Если добавлять OFNEnableHook (кот.мне необходим), то
красивое диалоговое окно с вертикальной панелью слева (в стиле OS)
однозначно заменяется на стандартное в стиле win98.

Уберите в Private Sub InitOFN() в вашем примере в классе OFNEnableHook
и поймете о чем я (не про сам hook а про стиль окна).

Как быть?
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36476338
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>однозначно заменяется на стандартное в стиле win98.
>Как быть?

Эге, просто не хватает
pvReserved As Long
dwReserved As Long
flagsEx As Long
End Type
в Public Type OPENFILENAME
в коде приведенном Konst_One это есть, выводить/не выводить упомянутую панель - одна из фишек того примера.
видимо код, приведенный Игорем писался до xp/2000 (как и многие другие найденные мной примеры).
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36476465
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну хорошо, оприходовал кнопку help...
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Public Function OFNHookProc(ByVal hwnd As Long, _
                            ByVal uMsg As Long, _
                            ByVal wParam As Long, _
                            ByVal lParam As Long) As Long

   Dim hWndParent As Long
   Dim hwndLv As Long
   Static bLvSetupDone As Boolean
   '----------------
   Dim tNMH As NMHDR
   Dim tOFNs As OFNOTIFYshort
   Dim tOF As OPENFILENAME
   
   Select Case uMsg
      Case WM_INITDIALOG
....
        hWndParent = GetParent(hwnd)
        Call SendMessage(hWndParent, CDM_SETCONTROLTEXT, ID_HELP, ByVal "Settings")
      Case WM_NOTIFY
            CopyMemory tNMH, ByVal lParam, Len(tNMH)
            Select Case tNMH.code
                Case CDN_HELP
                    MsgBox "help"
                    ' Help clicked (that is settings)
                Case CDN_TYPECHANGE
                    ' The OFNOTIFY struct is passed in the lParam of this message.
                    Call CopyMemory(tOFNs, ByVal lParam, Len(tOFNs))
                    ' A pointer to an OPENFILENAME structure is passed in OFNOTIFY.
                    Call CopyMemory(tOF, ByVal tOFNs.lpOFN, Len(tOF))
                    If tOF.nFilterIndex =  4  Then
                        hWndParent = GetParent(hwnd)
                        'если 4, то скрываем ее
                        Call SendMessage(hWndParent, CDM_HIDECONTROL, ID_HELP, ByVal  0 &)
                    Else
                        'А как ее отобразить снова?'
                 End If
            End Select
      Case Else
         
   End Select

End Function

Т.е. как СКРЫТЬ кнопку а-ля"HELP" я разобрался.
А как ее снова ОТОБРАЗИТЬ?

А лучше Enable/Disable...
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36476498
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А лучше Enable/Disable...

Так почему-то работает только в одну сторону (disable)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
               Case CDN_TYPECHANGE
                    ' The OFNOTIFY struct is passed in the lParam of this message.
                    Call CopyMemory(tOFNs, ByVal lParam, Len(tOFNs))
                    ' A pointer to an OPENFILENAME structure is passed in OFNOTIFY.
                    Call CopyMemory(tOF, ByVal tOFNs.lpOFN, Len(tOF))
                    hWndParent = GetParent(hWnd)
                    hItem = GetDlgItem(hWndParent, ID_HELP)
                    SetWindowLong hItem, GWL_STYLE, GetWindowLong(hItem, GWL_STYLE) Or WS_DISABLED
                    If tOF.nFilterIndex =  4  Then
                        Call SendMessage(hItem, WM_ENABLE, True,  0 &)
                    Else
                        Call SendMessage(hItem, WM_ENABLE, False,  0 &)
                    End If
            End Select

Зато по-другому получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                Case CDN_TYPECHANGE
                    ' The OFNOTIFY struct is passed in the lParam of this message.
                    Call CopyMemory(tOFNs, ByVal lParam, Len(tOFNs))
                    ' A pointer to an OPENFILENAME structure is passed in OFNOTIFY.
                    Call CopyMemory(tOF, ByVal tOFNs.lpOFN, Len(tOF))
                    hWndParent = GetParent(hWnd)
                    hItem = GetDlgItem(hWndParent, ID_HELP)
                    If tOF.nFilterIndex =  4  Then
                        If Not (IsWindowEnabled(hItem)) Then Call EnableWindow(hItem,  1 )
                    Else
                        If IsWindowEnabled(hItem) Then Call EnableWindow(hItem,  0 )
                    End If
             End Select
Бардак..
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36476501
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А самое паршивое что тестовый exe-шник после щелканья по фильтру(nFilterIndex) с последним "рабочим" вариантом где EnableWindow, вылетает после 3-4 итераций.
...
Рейтинг: 0 / 0
Нестандартные элементы в стандартных Save и Open dialogs
    #36477043
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>вылетает после 3-4 итераций.
Это из-за Call CopyMemory(tOF, ByVal tOFNs.lpOFN, Len(tOF))
и глючности-таки VB на предмет CopyMemory.(прочитал про это)
Пошел "простым" путем:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Public Function OFNHookProc(ByVal hWnd As Long, _
                            ByVal uMsg As Long, _
                            ByVal wParam As Long, _
                            ByVal lParam As Long) As Long
   Dim hWndParent As Long
   Dim hItem As Long
   Dim tNMH As NMHDR
   Dim Index As Integer
   Select Case uMsg
      Case WM_INITDIALOG
        hWndParent = GetParent(hWnd)
        Call SendMessage(hWndParent, CDM_SETCONTROLTEXT, ID_HELP, ByVal "Settings")
        hItem = GetDlgItem(hWndParent, ID_HELP)
        If IsWindowEnabled(hItem) Then Call EnableWindow(hItem,  0 )
      Case WM_NOTIFY
        CopyMemory tNMH, ByVal lParam, Len(tNMH)
        Select Case tNMH.code
            Case CDN_HELP
                MsgBox "help"
                ' Help clicked (that is settings)
            Case CDN_TYPECHANGE
                hWndParent = GetParent(hWnd)
                hItem = GetDlgItem(hWndParent, ID_FILETYPE)
                Index = SendMessage(hItem, CB_GETCURSEL, ByVal  0 &, ByVal  0 &) +  1 
                hItem = GetDlgItem(hWndParent, ID_HELP)
                If Index =  4  Then
                    If Not (IsWindowEnabled(hItem)) Then Call EnableWindow(hItem,  1 )
                Else
                    If IsWindowEnabled(hItem) Then Call EnableWindow(hItem,  0 )
                End If
            Case Else
        End Select
      Case Else
   End Select
End Function
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Нестандартные элементы в стандартных Save и Open dialogs
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]