Выпадающее окно у юзер контрола

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Выпадающее окно у юзер контрола

Сообщение ger_kar » 28.04.2016 (Чт) 18:38

Собственно вопрос в том, как правильно делать выпадающие окна у юзер контролов. Если использовать для этих целей обычную форму, то с ней при использовании контрола на модально открытой форме будет облом, причем стили
WS_POPUP, WS_EX_TOOLWINDOW, WS_EX_TOPMOST
никак проблему не решают. Значит с использованием формы пролет.
Если юзать вместо формы другой UserControl, то возникает другая проблема, связанная с тем, что выпадающее окно не должно ограничиваться рамками формы и может выходить за пределы окна формы, а вот UserControl так не может. Есть конечно еще один вариант, создавать и рисовать такое окно самостоятельно при помощи низкоуровневых функций WinAPI, но что то такой вариант мне не очень нравится :)
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 28.04.2016 (Чт) 20:49

Можно попробовать контролу сменить родителя, на рабочий стол hWnd = 0
или в стилях исключить родителя, убрать WS_CHILD , так наверно будет правильнее.
Но, WS_CHILD не незя использовать вместе с WS_POPUP стилем.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 30.04.2016 (Сб) 6:58

В принципе такая метода срабатывает, но Хакер говорит, что такой подход применять не рекомендуется, ибо это не кошерно и не по феншую делать контрол окном верхнего уровня, пересаживая его с формы на рабочий стол ибо в таком случае не все сообщения будут поступать корректно и сама объектная надстройка COM над окном тоже может работать неправильно в некоторых ситуациях. Это с одной стороны, с другой, если посмотреть на стили стандартных контролов с выпадающим окном, то они у них родительским окном является рабочий стол и стиль WS_CHILD тоже присутсвует. Утилита Spy++ относительно стилей окна дает следующую информацию:
Код: Выделить всё
Стандартный контрол ComboBox
Стили
WS_CHILDWINDOW
WS_CLIPSIBLINGS
WS_BORDER
00008041

Расширенные стили
WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR
WS_EX_TOPMOST
WS_EX_TOOLWINDOW

Кроме этого возникает еще одна проблема, как это окно потом закрывать это открытое окно? В случае, если выпадающее окно сделано на основе формы, то клик за пределами легко отлавливается по потере формой вплывающего окна фокуса. Если использовать подход с пересадкой окна на рабочий стол такой вариант, как с формой, не прокатывает. Использовать фичу с SetCapture/ReleaseCapture тоже не получается, дело в том, что выпадающее окно содержит в своем составе другие контролы и при захвате мышки после SetCapture эти контролы перестают получать сообщения и соответственно не работают.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 01.05.2016 (Вс) 17:13

Интересно, куда делся последний пост bon818...
А вообще я пример скачал и посмотрел и сразу обнаружил глюк в примере, там где UserControl1. При смене владельца окна контрола, с окна формы, на рабочий стол наблюдается интересный эффект. Визуально окно контрола переезжает на новое место, но продолжает получать сообщения от мышки (а возможно и другие сообщения) находящейся в прямоугольнике на форме, там где раньше был контрол. Т.е. его на форме как бы нет, но сама связь сохранилась и окно чутко реагирует на манипуляции по месту своего бывшего нахождения. Поэтому и закрытие по потере фокуса (точнее даже не потери, а изменения) работает, только если кликнуть мышью в пределах прямоугольника, который раньше занимал контрол. На клики вне этого места окно контрола никак не реагирует. Так что нормально сделать закрытие выпадающего окна так не получится.
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 01.05.2016 (Вс) 18:19

Пост удалил я сам, сначала хотел сделать правки, но понял что утверждения что я сделал не совсем правильны.
Кроме этого хотел сделать новый пример, из смеси UserControl + API.
Потом вспомнил, что как то не очень давно, я встраивал в стандартное выпадающее меню, градиентное окно для выбора цвета.
И тоже сталкивался с подобными трудностями, надо найти и глянуть что я там делал.

Вообще конечно непонятно, что именно ты хочешь сделать.
Например контролы, те что без захвата мыши можно без проблем использовать.
Сменил родителя и все, остается только позиционировать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 01.05.2016 (Вс) 18:59

Ну вообще я делаю не один, а сразу целую группу контролов. В том числе и контролы с выпадающими окнами. Например меня не устраивает стандартный DatePicker и календарь поэтому выпадающем окне должен быть календарик, но не стандартный, а мой, кроме этого он может использоваться и отдельно, а также в составе других контролов, например в дополнение к простому DatePicker я хочу добавить контрол для выбора не даты, а сразу периода (на подобии 1С), также будут и другие контролы, в которых будут другие выпадающие списки с другими элементами, в том числе и с нестандартными. Если рисовать такие окна с использованием WinAPI и стандартных контролов, то проблем особо нет, а вот если делать то, что хочу сделать я, то придется делать массу лишней работы. Тот же календарик придется делать 2 раза, один раз как UserControl с использованием событий, а другой раз тоже самое сделать на чистом WinAPI с использованием сообщений. Те же кнопки придется рисовать отдельно на WinAPI, а их не одна. Вобщем вместо повторного использования кода будет масса лишней работы. Если просто пересадить окно контрола того же календарика например, на рабочий стол, то сразу начинаются проблемы с его закрытием, так как оно первоначально он находится в составе пикера, и при пересадке на рабочий стол, фокус принимать от пикера не желает. Сейчас пробую такую модель, создать отдельное окно привязанное к рабочему столу, и выпадающее окно пересаживать уже на него.
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 01.05.2016 (Вс) 20:17

ger_kar писал(а):Если рисовать такие окна с использованием WinAPI и стандартных контролов, то проблем особо нет, а вот если делать то, что хочу сделать я, то придется делать массу лишней работы.

Ты хочешь с нуля все рисовать?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 01.05.2016 (Вс) 20:37

bon818 писал(а):Ты хочешь с нуля все рисовать?
Ну что то с нуля, если есть возможность включить в состав стандартные контролы, то включаю их. Например сам календарик нарисован с нуля, кроме кнопок, которые стандартные. В пикере используется стандартный TextBox. Что то рисовал на WinAPI, но конкретно календарик нарисован графическими методами VB (на 80%). Там только рамка фокуса и некоторые другие моменты используют WinAPI
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 01.05.2016 (Вс) 22:07

ger_kar писал(а):но конкретно календарик нарисован графическими методами VB (на 80%)

Тебе виднее, но по моему апишный вполне нормальный и ведет себя как нужно.
ger_kar писал(а):я хочу добавить контрол для выбора не даты, а сразу периода (на подобии 1С)

А что там за контрол, может скрин покажешь ?
Вложения
пример v2.rar
пример v2
(17.19 Кб) Скачиваний: 166

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 04.05.2016 (Ср) 20:45

bon818 писал(а):А что там за контрол, может скрин покажешь ?

Календарь.png
Выпадающий календарь в1С
Календарь.png (4.47 Кб) Просмотров: 4299

Выбор периода - это одна форма, но имеющая два вида, которые меняются, при клике по гиперссылке внизу
СтандартныйПериод.png
Выбор периода в 1С (вид: "стандартного период")
СтандартныйПериод.png (9.96 Кб) Просмотров: 4299

ПроизволныйПериод.png
Выбор периода в 1С (вид: "произвольный период")
ПроизволныйПериод.png (9.43 Кб) Просмотров: 4299


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

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 08.05.2016 (Вс) 17:51

ger_kar писал(а):Что касается стандартного календарика в выпадающем окне пикера, то туда трудно что либо добавить.

ИМХО: Я бы не стал что добавлять в окно с календарём, просто сделал бы его выпадающим.
А всё остальное разместил-бы в юзер-контроле.
ger_kar писал(а):И шрифт там мелковатый, клиенту не нравится.

Его можно менять.

Единственное что в нём мне не нравится, это глюк в XP, если подключить к нему тему, то он начинает глючно отображать выделенные даты.
Но есть и большой плюс как мне кажется, это визуально, легко, удобно выбирать даты.

Вот написанный на PB10, вариант выбора диапазона дат, + перекрашенный, чтоб видеть что выделено ).
Вложения
Sysmonthcal.rar
PB10 вариант выбора диапазона да
(35.32 Кб) Скачиваний: 168

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Выпадающее окно у юзер контрола

Сообщение ger_kar » 08.05.2016 (Вс) 21:00

bon818 писал(а):Его можно менять.
Т.е. можно изменить шрифт и сделать ячейки более крупными? И как это сделать?
bon818 писал(а):Вот написанный на PB10, вариант выбора диапазона дат, + перекрашенный, чтоб видеть что выделено ).
В принципе удобно, но выглядит он уж как то мрачно :)
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Выпадающее окно у юзер контрола

Сообщение bon818 » 09.05.2016 (Пн) 14:44

ger_kar писал(а):Т.е. можно изменить шрифт и сделать ячейки более крупными? И как это сделать?

Уже собрался ответить, что всё просто, создаём новый шрифт и назначаем для этого окна ( WM_SETFONT ).
Но, видно они вместо исправления глюков, полностью переписали коннтрол SysMonthCal.
Теперь, начиная с Висты, это не сработает. Наверно все же можно, но как, пока не понятно.
Мало того, перестали работать константы окраски, MCM_SETCOLOR, MCSC_TEXT, MCSC_BACKGROUND, ...
Посмотри сам, запусти (PB10 вариант выбора диапазона дат) в WIN7.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

    TopList