|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Ну раз никто глупых вопросов не задает, тогда задам я В общем задача понятна должна быть, но тезисы обрисую: 1) Есть юзерконтрол. У него должна быть некая функция, которая обеспечивает появление дополнительного окошка, в которое в идеале динамически грузится другой юзерконтрол с произвольным функционалом. 2) Окошко не должно ограничиться границами контейнера, на котором расположен базовый юзерконтрол (иначе можно было бы просто изменять размеры юзерконтрола) 3) Окошко должно реагировать на края экрана и выпадать сверху, если снизу оно не помещается до края экрана. 4) Окошко должно исчезнуть, если произошел клик мимо него (простая потеря фокуса не годится, так как если просто кликнуть по пустой части формы, активный контрол фокус не теряет), а также потеря фокуса основным контролом или базовым приложением. Как я понимаю, п.2,3,4 без АПИ реализовать не удастся, подскажите плиз - какими функциями нужно воспользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 12:17 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 12:48 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy, Упс... старый склеротик... тогда не разобрал, не до этого было.... ща займусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 12:54 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy, А ты его после того не дорабатывал? Чтоб уж последнюю версию смотреть... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 14:00 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Вот она. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 14:11 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Ругается на отсутствие cUxTheme.dll Это для чего? в той версии такого не было ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 14:25 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
c UxTheme это класс, а ругается наверное на отсутствие uxtheme.dll — "Библиотека тем UxTheme (Microsoft)". У меня XP SP3 и она есть в System32. Она нужна для того, чтобы кнопка комбобокса рисовалась в соответствии с текущем стилем винды. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 15:22 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Antonariy, Я в данный момент на 2000к и стили мне не нужны, так как выпадания будут вызываться специфическими кнопками, поэтому пока ковыряю старую версию. Пытаюсь курить код, тяжело, ибо стихи АПИ - нет беглости, а пока изучишь каждую функцию, забудешь с чего начинал. Так структуру примерно разобрал, просто много непонятно, почему именно так. К примеру, почему события Click и DblClick сделаны через отдельный класс? А вот само время жизни окна находится внутри цикла, в котором нет DoEvents - как же он обходится? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 16:11 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProК примеру, почему события Click и DblClick сделаны через отдельный класс? Кстати, для чего они вообще нужны? По идее - требуется, чтобы по возникновению какого-то события в выпавшем фрагменте, сам выпавший фрагмент закрылся. Для этого, как я понимаю, нужно выставить fStop в True, но это делается через сообщения, почему? Только из-за того, чтобы работало на модальной форме? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 16:58 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProК примеру, почему события Click и DblClick сделаны через отдельный класс? Кстати, для чего они вообще нужны?Нужны для того, чтобы создать у контрола событие аналогичное Click у комбобокса. Зачем нужен даблклик? Затем, что по клику у дерева, например, распахиваются узлы, будет неприятно, если дропдаун закроется до того, как нужный узел будет найден. В отдельном классе просто потому что так сложилось. Можно и через сам юзерконтрол. Shocker.ProДля этого, как я понимаю, нужно выставить fStop в TrueНет, в старой версии это была заплатка от краша при потере фокуса, в последней версии она не нужна, как и условие If fStop. Вообще большинство "почему именно так" это заплатки от вылета программы в астрал. Делаю какое-то действие, получаю вылет, нахожу событие или их последовательность, приводящую к вылету, ищу пути обхода. В одних местах это перевод фокуса, в других — уничтожение окна. Shocker.Pro А вот само время жизни окна находится внутри цикла, в котором нет DoEvents - как же он обходится?GetMessage ожидает событий, блокируя поток. Пока их нет, цикл стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 19:10 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
фух, отодрал работу со стилями, ща буду курить дальше уже новую версию... WorobjoffЕсть еще один маленький клопик: Если форма внизу экрана, фрейм дропается вникуда (за пределы экрана, а не вверх). А это ты не стал исправлять делать, как я понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2010, 16:06 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Не стал. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2010, 17:17 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyShocker.Pro А вот само время жизни окна находится внутри цикла, в котором нет DoEvents - как же он обходится?GetMessage ожидает событий, блокируя поток. Пока их нет, цикл стоит. Но, получается, при этом спокойно отрабатываются события в другом потоке? То есть в "выпавшем" контроле я могу делать что хочу? В принципе, получается такая цепочка, если я все правильно понял: 1) TargetProc перехватывает сообщения окну "выпавшего" контрола 2) Если находит WM_LBUTTONDBLCLK, посылает контейнеру "выпавшего" окна сообщение на уничтожение 3) ...Одновременно с этим запускает таймер для генерации события 4) Окно контейнера уничтожается, GetMessage получает WM_QUIT, цикл завершается, завершая работу "выпадения" 5) тем временем таймер генерит событие в классе, которое получает базовый контрол. В общем-то, я хочу несколько переиначить это дело, то есть наплевать на Click, DblClick - у выпадающего юзерконтрола могут быть задачи посерьезнее и я делегирую ему полномочия решить, когда ему закрыться (например пользователь нажал определенную кнопку). То есть пункты 2,3,5 я могу смело ликвидировать. Если я опять же правильно понял, когда выпавший контрол решит, что его миссия выполнена, он должен сделать это: Код: plaintext 1. 2.
и цикл завершит свою работу. При этом сам факт завершения цикла будет событием для базового контрола, что выпавшая часть завершила свою работу, а если нужна дополнительная информация - ее можно взять через свойства выпадающего контрола. Правильный подход? ЗЫ: твой текущий пример можно загнать в астрал следующим образом - раскрыть выпадающий список и нажать Alt+F4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 00:54 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProНо, получается, при этом спокойно отрабатываются события в другом потоке? То есть в "выпавшем" контроле я могу делать что хочу?Это не другой поток, это другой обработчик событий другого окна. Они работают по очереди, но так быстро, что кажется, как бы одновременно. Сначала событие обрабатывает контрол, потом оно добирается до GetMessage, если контрол его не зарубит, и цикл продолжает свой неспешный бег. Shocker.ProЕсли я опять же правильно понял,Правильно. Shocker.ProПри этом сам факт завершения цикла будет событием для базового контрола, что выпавшая часть завершила свою работу, а если нужна дополнительная информация - ее можно взять через свойства выпадающего контрола.Собственно, у меня так и сделано. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Shocker.ProЗЫ: твой текущий пример можно загнать в астрал следующим образом - раскрыть выпадающий список и нажать Alt+F4Да уж, до этого я не додумался — закрывать программу в самый разгар работы в ней. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 11:15 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProВ общем-то, я хочу несколько переиначить это дело, то есть наплевать на Click, DblClick - у выпадающего юзерконтрола могут быть задачи посерьезнее и я делегирую ему полномочия решить, когда ему закрыться (например пользователь нажал определенную кнопку). Кстати, здесь есть громадная засада. Контрол спроектирован так, чтобы исключить возможность появления вообще в системе обновременно более одного выпадающего окна, потому что глобальные переменные модуля разделяются всеми экземплярами контрола во всех процесах. Если же процедуру закрытия будет регламентировать не DDControl, а кто попало, то потенциально возможна попытка показать более одного дропдауна, что приведет к краху программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 11:28 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Как минимум нужно прятать дропдаун изнутри DDControl'а, если фокус получил другой его экземпляр. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 11:30 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyКстати, здесь есть громадная засада. Контрол спроектирован так, чтобы исключить возможность появления вообще в системе обновременно более одного выпадающего окна, потому что глобальные переменные модуля разделяются всеми экземплярами контрола во всех процесах. Я тоже поначалу не понял, почему это модуль, а не класс. Что причина, а что следствие - 1) ТЗ на то, что нельзя получить два выпадающих списка одновременно => реализация в виде модуля или 2) Реализация в виде модуля - как следствие невозможность получить два выпадающих контрола ? А если изолировать модуль в класс - будут работать два? Насколько я понимаю, увод фокуса автоматически закроет выпадающую часть, так что второй выпадающий контрол может появиться только если это будет по инициативе программы, а не пользователя. Кстати, а что будет, если приложение по своей инициативе уведет фокус на другую форму (есть у меня такое - приход сверхважного сообщения)? AntonariyЕсли же процедуру закрытия будет регламентировать не DDControl, а кто попало, то потенциально возможна попытка показать более одного дропдауна, что приведет к краху программы. Ну, собственно, вариант с отсылкой WM_USER + 4 это решает? или ты что-то другое имеешь ввиду? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 13:12 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Shocker.ProЧто причина, а что следствиеНи то ни другое. Хотелось полной имитация работы комбобокса, а из того, что двух открытых комбобоксов не бывает, следует ненужность поддержки нескольких открытых дропдаунов. В любом случае, в виде класса это сделать не получится без ассемблерных вставок, а оно разве надо? Shocker.ProНасколько я понимаю, увод фокуса автоматически закроет выпадающую часть, так что второй выпадающий контрол может появиться только если это будет по инициативе программы, а не пользователя.Все верно, упустил это из виду. Shocker.ProКстати, а что будет, если приложение по своей инициативе уведет фокус на другую форму (есть у меня такое - приход сверхважного сообщения)?Потеря фокуса есть потеря фокуса, неважно как это произошло. Shocker.ProНу, собственно, вариант с отсылкой WM_USER + 4 это решает? или ты что-то другое имеешь ввиду?Проблему решает потеря фокуса, а WM_USER + 4 призвано закрывать дропдаун альтернативным потере способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 14:57 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyВ любом случае, в виде класса это сделать не получится без ассемблерных вставок, а оно разве надо? Для общего развития - а что там такого, что не может быть размещено в классе? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 18:20 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Оконные процедуры. AddressOf понимает только те, что объявлены в модуле. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2010, 23:12 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
AntonariyОконные процедуры. AddressOf понимает только те, что объявлены в модуле. Ну обойти, конечно, можно, разместив оконные процедуры в модуле и делая реестр hwnd и соответствующих им объектов.... но незачем, конечно же.... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2010, 13:56 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Блин. БЛИН. Antonariy, Ща начал интегрировать в рабочий проект и тут-то выяснилось, что метод не подходит для моих целей. Как я писал в самом начале - предполагается выпадение юзерконтрола с произвольным функционалом. Возьмем в примитивном случае, что должен выпасть фрейм с кнопкой на нем. Как только я пытаюсь нажать кнопку, у окна gTarget возникает сообщение WM_KILLFOCUS и мое окошко DD уничтожается, не дав мне даже получить событие от кнопки. А нужно, чтобы оно в этом случае вообще не закрывалось. В общем, методом тыка и грубой силы сделал следующим образом: при получении WM_KILLFOCUS, DD не уничтожается, а запускается таймер. Вот обработчик таймера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Ничего другого в голову не пришло, прошу совета, а то мне кажется это как-то слишком грубо. Кроме того, теоретически ведь я могу щелкнуть по другому контролу с выпадающим списком. И тогда возникнет та самая ситуация, когда открывается следующий DD, а предыдущий не закрыт. Я даже пока не стал пробовать такую ситуацию, конечно, можно сделать контрольные проверки, но пока не делаю, надеюсь, что будет идея получше. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 20:09 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
он еще и не рабочий этот метод если убрать строку Код: plaintext
а с этой строкой - события кнопки не возникают ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 20:35 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Ситуацию исправил добавлением процедуры обработки потери фокуса для любого контрола, находящегося в подчинении DD. Выглядит ужасно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 20:51 |
|
[VB6] Как организовать свой контрол с выпадающим окошком (типа комбобокса)
|
|||
---|---|---|---|
#18+
Самый первый вариант контрола поддерживал нажатия на кнопки. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2010, 21:02 |
|
[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?all=1&fid=60&tid=2159058]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 344ms |
total: | 483ms |
0 / 0 |