powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / [VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
21 сообщений из 46, страница 2 из 2
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36955802
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСамый первый вариант контрола поддерживал нажатия на кнопки.
ну та же беда
после нажатия на кнопку DD по потере фокуса не закрывается
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36955805
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyСамый первый вариант контрола поддерживал нажатия на кнопки.
ну та же беда
после нажатия на кнопку DD по потере фокуса не закрывается
ну и умирает нафиг.
я пытаюсь в примере по ссылке развернуть фрейм с кнопкой вместо дерева
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36955810
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если читать ниже, около окончательного примера комментарий автора:
AntonariyНе рекомендуется на дропдаун класть CommandButton - если фокус на кнопке, дропдаун не прячется
как я понимаю, не только кнопки, но и текстовые поля и т.п., что имеет фокус ввода
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36956292
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyСамый первый вариант контрола поддерживал нажатия на кнопки.
ну та же беда
после нажатия на кнопку DD по потере фокуса не закрываетсяОшибся, последний файл в той теме.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36956931
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложу сюда переработанный проект Антонария, чтобы уже на конкретном примере довести его до ума.
Переработка запускается в сильном упрощении для улучшения понимания и доработки (то есть сейчас нужно горазно меньше сломать мозг, чтобы разобрать суть). Проект Антонария во-первых универсален и связывает три вещи - некий универсальный юзерконтрол (комбобокс), некий отдельностоящий контрол, который используется для выпадения и форма, на которой это все лежит. Соответственно, усложняется взаимодействие между этими объектами и их синхронизация.

С другой стороны, не вижу смысла разносить дроп и основную часть по разным местам (ибо это всегда специфический контрол со своими функциями и вряд ли и то и другое будет выглядит стандартно). Тогда и синхронизация значений и событий дропа не представляет проблему.

Вся обработка вынесена в достаточно автономный модуль LB_DropDown, я постарался избавиться от другого связанного кода, для облегчения интеграции. Также избавился от глобальных объектных переменных в модуле, осталось два глобальных метода CreateDD, KillDD и глобальная переменная DDDropped для проверки состояния.

Туда добавлен тот дурацкий код, который я приводил выше для обеспечения работы с кнопками. В итоге, сейчас дроп представляет собой фрейм с кнопкой, встроенный в юзерконтрол.

ЗЫ: Еще я оттуда убрал работу со стилями, так как мне нужно запускать мой софт на Win2K
ЗЗЫ: А следующим постом - куча вопросов :)
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36957000
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyОшибся, последний файл в той теме.
Так собственно, после нажатия на кнопку, дроп перестает закрываться по потере фокуса. Это, собственно, проблема. Впрочем, я там еще покурю, так как корректная работа с msgbox и поля есть, которые получают фокус. Пока вопросы другие:

========================

1) Зачем в процедуре DropWndProc есть строка
Код: plaintext
1.
        Case WM_DESTROY
            SetFocus gParentWindow
?
Получатся, что при выпавшем дропе пользователь с первого раза не может увести фокус на другое приложение или на другую форму. Напрягает. Я закомментировал эту строку, вроде глюков пока не нашел, но может просто не смог?

2) Как сделать дроп без рамки? Я так понимаю, это определяется строкой
Код: plaintext
1.
    SetWindowLong hw, GWL_STYLE, WS_BORDER
просмотрев список констант не нашел ничего понятного

3) В чем прикол RestorePtr?

4) Зачем вообще нужен FrmProc? Я ставил точку останова туда - вообще не попадает внутрь Case

5) Мелькание дропа. При убивании дропа на какой-то момент под ним появляется белое окошко (gDropWindow). Очень неприятное зрелище. Как логичнее всего от него избавиться (может делать его невидимым перед убийством или что-то типа того)?

6) Почему у меня не работает следующая конструкция:
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Command2_Click()

    KillDD
    Do Until Not DDDropped: DoEvents: Loop

End Sub
не выходит из цикла. Как-то я все же плохо понимаю, как работает GetMessage
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36957648
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТак собственно, после нажатия на кнопку, дроп перестает закрываться по потере фокуса.Если поставить фокус в один из выпавших текстбоксов, то после этого закрывается.

1) Не помню точно. Скорее всего для лечения какого-то глюка. Попробуй убрать.
2) Убрать эту строчку? ))
3) Может Res olv ePtr? Единственный способ присвоить результат AddressOf переменной — прогнать ее параметром через функцию.
4) Ммм... Там нет Case и туда попадает. Опять же для лечения глюков.
5) Да, нужно его спрятать перед убиением.
6) Это тоже не из той оперы. Я ориентируюсь на последний файл все той же темы.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958005
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy1) Не помню точно. Скорее всего для лечения какого-то глюка. Попробуй убрать.ну так я ж и убрал. Единственное, я так понимаю, ты ориентируешься на модальность формы? А я их не использую. Может быть в этом дело?

Antonariy2) Убрать эту строчку? ))пробовал же. Тогда у окошка появляется заголовок.

Antonariy3) Может Res olv ePtr? Единственный способ присвоить результат AddressOf переменной — прогнать ее параметром через функцию.
Это я понял, тока не понял, из-за чего. Впрочем, это вопрос риторический.

Antonariy4) Ммм... Там нет Case и туда попадает. Опять же для лечения глюков.
а, ну там не case а
Код: plaintext
    If message =  161  Then
и он никогда не возникает. А что это за сообщение, если для него константа даже не объявлена?
Antonariy5) Да, нужно его спрятать перед убиением.
плиз. Как именно?

Antonariy6) Это тоже не из той оперы. Я ориентируюсь на последний файл все той же темы.я тут как раз прошу твоей помощи на базе выложенного мной проекта. Смысл в чем - я тупо добавил DDDropped=True в начале работы CreateDD и DDDropped=False в конце. Далее я убиваю дроп и пытаюсь дождаться, когда цикл в CreateDD закончит свою работу. А он не заканчивает. Через таймер это обходится, но это очень неудобно.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958152
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так я ж и убрал. Единственное, я так понимаю, ты ориентируешься на модальность формы? А я их не использую. Может быть в этом дело?Может. А еще помню глюк при потере фокуса: если ткнуть в форму, то все нормально, а если в ее заголовок — проект падал. Одна из мутных заплаток — для него. Вроде как раз message = 161 (WM_NCLBUTTONDOWN). _NC означает non-client, неклиентская часть окна.

плиз. Как именно?

Код: plaintext
Private Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

я тут как раз прошу твоей помощи на базе выложенного мной проекта. Там не хватает модуля LB_DropDown.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958220
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyя тут как раз прошу твоей помощи на базе выложенного мной проекта. Там не хватает модуля LB_DropDown.
ах да, блин, он же из библиотеки
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958472
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariy2) Убрать эту строчку? ))пробовал же. Тогда у окошка появляется заголовок.
Ну, собственно, вопрос остался - как сделать окно безничего - то есть без рамки и заголовка.

Antonariyплиз. Как именно?ShowWindow
Ну вообще-то оно там есть, только не срабатывает, видимо. Ну или в другом причина...:
Код: plaintext
1.
2.
3.
4.
        Case WM_USER +  1 
            ShowWindow trg,  0 
            'Debug.Print trg, gParentWindow
            SetParent trg, gParentWindow
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958506
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу вообще-то оно там есть, только не срабатывает, видимо. Ну или в другом причина...:
Код: plaintext
1.
2.
3.
4.
        Case WM_USER +  1 
            ShowWindow trg,  0 
            'Debug.Print trg, gParentWindow
            SetParent trg, gParentWindow

Сорри, спутал, это не то окно
добавить ShowWindow hWnd, 0 и все красиво. Этот вопрос отпал
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36958915
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, собственно, вопрос остался - как сделать окно безничего - то есть без рамки и заголовка.Вспомнил, что меня этот вопрос тоже интересовал, даже спрашивал где-то на сишных форумах, но так и не выяснил.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36959219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВспомнил, что меня этот вопрос тоже интересовал, даже спрашивал где-то на сишных форумах, но так и не выяснил.

Гм. Ладно, можно, конечно, и с рамкой.

Не смотрел, как дождаться завершения выполнения убийства дропа?
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36962540
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

В результате двух дней всяческих совершенно ненаучных изысканий добавил к коду вот такую штуку:

Код: plaintext
1.
2.
3.
4.
5.
6.
Private Function FrmProc(ByVal hWnd As Long, ByVal Message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Select Case Message
        Case WM_ACTIVATE, WM_NCACTIVATE
            If wParam <>  0  Then
              KillDD
            End If

KillDD - это отправка трех сообщений дропу на закрытие.
В сочетании с моим предыдущим кодом позволяет фокусу покинуть и поле и кнопку и закрыть дроп.

Навскидку как думаешь, не сделал ли я несусветную глупость?
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36962699
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не падает, значит не сделал. Я весь этот код писал по этому принципу)
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36962705
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особый шик, если ide не падает и просто так внезапно после нескольких с виду успешных перезапусков проекта.) А такие глюки даже с поллитрой плохо ищутся, проще переписать заново.
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36965037
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Выкладываю подчищенный свой вариант.
Я не знаю, будет ли он нормально работать на модальной форме, но он
а) работает на немодальной форме
б) позволяет размещать на дропе всякие кнопки и поля (в т.ч. в составе юзерконтролов)
в) при переводе фокуса не возвращает его обратно при уничтожении дропа (то есть при открытом дропе можно нажать на другую кнопку на форме с первого раза, а также перейти на другую форму с первого раза) - что очень было неприятно в твоем варианте.

Но есть проблема, с которой без тебя я не справлюсь. Я плохо понимаю, как работает этот цикл с GetMessage и,главное, а почему сделано именно так, почему нельзя выполнить команды, идущие после цикла по какому-то событию или сообщению.

Суть в том, что после какого-то события на самом дропе (нажатие кнопки) нужно закрыть дроп и выполнить какие-то операции, и в частности, это может быть открытие другой формы (ну с этим удавалось справиться), MsgBox-а или диалога CommonDialog (а вот тут уже все безбожно виснет).

Процедура DDUC_Kill работает асинхронно, то есть ее окончание не означает окончательного закрытия дропа, а попытка дождаться закрытия дропа через пустой цикл с DoEvents ни к чему не приводит - цикл не завершается (код, которых хотелось бы, чтобы работал, сейчас закомментирован в юзерконтроле в событии кнопки). Конечно, можно использовать таймер, ожидающий закрытия дропа, но это очень неудобно в использовании. Надеюсь, ты подкинешь идею. :)
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36965918
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня нет идей. Фактически вслепую удалось создать стабильную версию (которая с темами), и я решил, что больше не стоит чинить то, что и так работает, как мне нужно.

Зато могу подкинуть исходник, который я взял за основу. Там от MsgBox окна не падают)
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #36965971
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТам от MsgBox окна не падают)
а там и обработки VB событий нет, все контролы создаются через API и события обрабатываются через сабклассинг... так что из этого кода я мало что себе подчерпну....
...
Рейтинг: 0 / 0
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
    #37065718
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.ProWorobjoffЕсть еще один маленький клопик:
Если форма внизу экрана, фрейм дропается вникуда (за пределы экрана, а не вверх).
А это ты не стал исправлять делать, как я понимаю?Не стал.

1) Сделал выпадание вверх, если вниз упирается в край рабочей области
2) Инкапсулировал вычисление координат дропа в библиотеку, чтобы вызов из контрола был предельно прост.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / [VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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