|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyСамый первый вариант контрола поддерживал нажатия на кнопки. ну та же беда после нажатия на кнопку DD по потере фокуса не закрывается ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 21:29 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProAntonariyСамый первый вариант контрола поддерживал нажатия на кнопки. ну та же беда после нажатия на кнопку DD по потере фокуса не закрывается ну и умирает нафиг. я пытаюсь в примере по ссылке развернуть фрейм с кнопкой вместо дерева ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 21:32 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
А если читать ниже, около окончательного примера комментарий автора: AntonariyНе рекомендуется на дропдаун класть CommandButton - если фокус на кнопке, дропдаун не прячется как я понимаю, не только кнопки, но и текстовые поля и т.п., что имеет фокус ввода ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 21:36 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProAntonariyСамый первый вариант контрола поддерживал нажатия на кнопки. ну та же беда после нажатия на кнопку DD по потере фокуса не закрываетсяОшибся, последний файл в той теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 10:36 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Выложу сюда переработанный проект Антонария, чтобы уже на конкретном примере довести его до ума. Переработка запускается в сильном упрощении для улучшения понимания и доработки (то есть сейчас нужно горазно меньше сломать мозг, чтобы разобрать суть). Проект Антонария во-первых универсален и связывает три вещи - некий универсальный юзерконтрол (комбобокс), некий отдельностоящий контрол, который используется для выпадения и форма, на которой это все лежит. Соответственно, усложняется взаимодействие между этими объектами и их синхронизация. С другой стороны, не вижу смысла разносить дроп и основную часть по разным местам (ибо это всегда специфический контрол со своими функциями и вряд ли и то и другое будет выглядит стандартно). Тогда и синхронизация значений и событий дропа не представляет проблему. Вся обработка вынесена в достаточно автономный модуль LB_DropDown, я постарался избавиться от другого связанного кода, для облегчения интеграции. Также избавился от глобальных объектных переменных в модуле, осталось два глобальных метода CreateDD, KillDD и глобальная переменная DDDropped для проверки состояния. Туда добавлен тот дурацкий код, который я приводил выше для обеспечения работы с кнопками. В итоге, сейчас дроп представляет собой фрейм с кнопкой, встроенный в юзерконтрол. ЗЫ: Еще я оттуда убрал работу со стилями, так как мне нужно запускать мой софт на Win2K ЗЗЫ: А следующим постом - куча вопросов :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 13:42 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyОшибся, последний файл в той теме. Так собственно, после нажатия на кнопку, дроп перестает закрываться по потере фокуса. Это, собственно, проблема. Впрочем, я там еще покурю, так как корректная работа с msgbox и поля есть, которые получают фокус. Пока вопросы другие: ======================== 1) Зачем в процедуре DropWndProc есть строка Код: plaintext 1.
Получатся, что при выпавшем дропе пользователь с первого раза не может увести фокус на другое приложение или на другую форму. Напрягает. Я закомментировал эту строку, вроде глюков пока не нашел, но может просто не смог? 2) Как сделать дроп без рамки? Я так понимаю, это определяется строкой Код: plaintext 1.
3) В чем прикол RestorePtr? 4) Зачем вообще нужен FrmProc? Я ставил точку останова туда - вообще не попадает внутрь Case 5) Мелькание дропа. При убивании дропа на какой-то момент под ним появляется белое окошко (gDropWindow). Очень неприятное зрелище. Как логичнее всего от него избавиться (может делать его невидимым перед убийством или что-то типа того)? 6) Почему у меня не работает следующая конструкция: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 14:02 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProТак собственно, после нажатия на кнопку, дроп перестает закрываться по потере фокуса.Если поставить фокус в один из выпавших текстбоксов, то после этого закрывается. 1) Не помню точно. Скорее всего для лечения какого-то глюка. Попробуй убрать. 2) Убрать эту строчку? )) 3) Может Res olv ePtr? Единственный способ присвоить результат AddressOf переменной — прогнать ее параметром через функцию. 4) Ммм... Там нет Case и туда попадает. Опять же для лечения глюков. 5) Да, нужно его спрятать перед убиением. 6) Это тоже не из той оперы. Я ориентируюсь на последний файл все той же темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 16:32 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy1) Не помню точно. Скорее всего для лечения какого-то глюка. Попробуй убрать.ну так я ж и убрал. Единственное, я так понимаю, ты ориентируешься на модальность формы? А я их не использую. Может быть в этом дело? Antonariy2) Убрать эту строчку? ))пробовал же. Тогда у окошка появляется заголовок. Antonariy3) Может Res olv ePtr? Единственный способ присвоить результат AddressOf переменной — прогнать ее параметром через функцию. Это я понял, тока не понял, из-за чего. Впрочем, это вопрос риторический. Antonariy4) Ммм... Там нет Case и туда попадает. Опять же для лечения глюков. а, ну там не case а Код: plaintext
Antonariy5) Да, нужно его спрятать перед убиением. плиз. Как именно? Antonariy6) Это тоже не из той оперы. Я ориентируюсь на последний файл все той же темы.я тут как раз прошу твоей помощи на базе выложенного мной проекта. Смысл в чем - я тупо добавил DDDropped=True в начале работы CreateDD и DDDropped=False в конце. Далее я убиваю дроп и пытаюсь дождаться, когда цикл в CreateDD закончит свою работу. А он не заканчивает. Через таймер это обходится, но это очень неудобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 18:19 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
ну так я ж и убрал. Единственное, я так понимаю, ты ориентируешься на модальность формы? А я их не использую. Может быть в этом дело?Может. А еще помню глюк при потере фокуса: если ткнуть в форму, то все нормально, а если в ее заголовок — проект падал. Одна из мутных заплаток — для него. Вроде как раз message = 161 (WM_NCLBUTTONDOWN). _NC означает non-client, неклиентская часть окна. плиз. Как именно? Код: plaintext
я тут как раз прошу твоей помощи на базе выложенного мной проекта. Там не хватает модуля LB_DropDown. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 19:35 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariyя тут как раз прошу твоей помощи на базе выложенного мной проекта. Там не хватает модуля LB_DropDown. ах да, блин, он же из библиотеки ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2010, 20:09 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProAntonariy2) Убрать эту строчку? ))пробовал же. Тогда у окошка появляется заголовок. Ну, собственно, вопрос остался - как сделать окно безничего - то есть без рамки и заголовка. Antonariyплиз. Как именно?ShowWindow Ну вообще-то оно там есть, только не срабатывает, видимо. Ну или в другом причина...: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2010, 00:13 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProНу вообще-то оно там есть, только не срабатывает, видимо. Ну или в другом причина...: Код: plaintext 1. 2. 3. 4.
Сорри, спутал, это не то окно добавить ShowWindow hWnd, 0 и все красиво. Этот вопрос отпал ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2010, 01:21 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Ну, собственно, вопрос остался - как сделать окно безничего - то есть без рамки и заголовка.Вспомнил, что меня этот вопрос тоже интересовал, даже спрашивал где-то на сишных форумах, но так и не выяснил. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2010, 11:10 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyВспомнил, что меня этот вопрос тоже интересовал, даже спрашивал где-то на сишных форумах, но так и не выяснил. Гм. Ладно, можно, конечно, и с рамкой. Не смотрел, как дождаться завершения выполнения убийства дропа? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2010, 13:03 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy, В результате двух дней всяческих совершенно ненаучных изысканий добавил к коду вот такую штуку: Код: plaintext 1. 2. 3. 4. 5. 6.
KillDD - это отправка трех сообщений дропу на закрытие. В сочетании с моим предыдущим кодом позволяет фокусу покинуть и поле и кнопку и закрыть дроп. Навскидку как думаешь, не сделал ли я несусветную глупость? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 19:30 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Если не падает, значит не сделал. Я весь этот код писал по этому принципу) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 21:53 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Особый шик, если ide не падает и просто так внезапно после нескольких с виду успешных перезапусков проекта.) А такие глюки даже с поллитрой плохо ищутся, проще переписать заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 21:57 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy, Выкладываю подчищенный свой вариант. Я не знаю, будет ли он нормально работать на модальной форме, но он а) работает на немодальной форме б) позволяет размещать на дропе всякие кнопки и поля (в т.ч. в составе юзерконтролов) в) при переводе фокуса не возвращает его обратно при уничтожении дропа (то есть при открытом дропе можно нажать на другую кнопку на форме с первого раза, а также перейти на другую форму с первого раза) - что очень было неприятно в твоем варианте. Но есть проблема, с которой без тебя я не справлюсь. Я плохо понимаю, как работает этот цикл с GetMessage и,главное, а почему сделано именно так, почему нельзя выполнить команды, идущие после цикла по какому-то событию или сообщению. Суть в том, что после какого-то события на самом дропе (нажатие кнопки) нужно закрыть дроп и выполнить какие-то операции, и в частности, это может быть открытие другой формы (ну с этим удавалось справиться), MsgBox-а или диалога CommonDialog (а вот тут уже все безбожно виснет). Процедура DDUC_Kill работает асинхронно, то есть ее окончание не означает окончательного закрытия дропа, а попытка дождаться закрытия дропа через пустой цикл с DoEvents ни к чему не приводит - цикл не завершается (код, которых хотелось бы, чтобы работал, сейчас закомментирован в юзерконтроле в событии кнопки). Конечно, можно использовать таймер, ожидающий закрытия дропа, но это очень неудобно в использовании. Надеюсь, ты подкинешь идею. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2010, 23:06 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
У меня нет идей. Фактически вслепую удалось создать стабильную версию (которая с темами), и я решил, что больше не стоит чинить то, что и так работает, как мне нужно. Зато могу подкинуть исходник, который я взял за основу. Там от MsgBox окна не падают) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2010, 13:43 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyТам от MsgBox окна не падают) а там и обработки VB событий нет, все контролы создаются через API и события обрабатываются через сабклассинг... так что из этого кода я мало что себе подчерпну.... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2010, 14:06 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyShocker.ProWorobjoffЕсть еще один маленький клопик: Если форма внизу экрана, фрейм дропается вникуда (за пределы экрана, а не вверх). А это ты не стал исправлять делать, как я понимаю?Не стал. 1) Сделал выпадание вверх, если вниз упирается в край рабочей области 2) Инкапсулировал вычисление координат дропа в библиотеку, чтобы вызов из контрола был предельно прост. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2011, 01:34 |
|
|
start [/forum/topic.php?fid=60&msg=36965918&tid=2159058]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 468ms |
0 / 0 |