Popup window

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Popup window

Сообщение Joo » 20.10.2009 (Вт) 7:24

Привет!
Есть задача сделать всплывающее окошко, например как у ComboBox.
Это конечно тоже окно.
Я могу сделать обычную форму без рамок всяких, TopMost=True, ShowInTaskBar=False и при деактивации убирать его. Но есть проблемы.
Например у активной формы заголовок деактивируется, вернее она сама деактивируется, просто только по заголовку видно, я эту проблему решил передав активную форму как Owner и внутри Popup окна обрабатываю WM_NCACTIVATE для неё.
Вроде все замечательно, но если не передавать Owner?
Как-то же создаются эти всякие окошки правильно, менюшки, тултипы? Может стилей каких окну добавить или убрать?
Идеи есть у кого? Или решение верное?
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Popup window

Сообщение Joo » 20.10.2009 (Вт) 11:37

В поисках я наткнулся на такое выражение в MSDN
...Если в неактивном окне следует использовать элементы управления пользовательского интерфейса, следует рассмотреть возможность использования элементов управления ToolStrip, таких как ToolStripDropDown. Эти элементы управления являются безоконными и не приведут к активации окна при их выборе...

Как создать и отобразить такое безоконное окно с ЭУ? ToolStripDropDown не предлагать.
Ну как то же делают всякие менюшки кастомные, да и контролы всякие с всплывающими окнами, наподобие цветовой палитры.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Popup window

Сообщение Nord777 » 20.10.2009 (Вт) 12:13

Эти элементы управления являются безоконными и не приведут к активации окна при их выборе...
Это видимо про активацию при помощи сообщений. Мышью активируется.

Ты очень расплывчато выражаешься.
Приведи пример контрола, чьё поведение ты хочешь повторить.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Popup window

Сообщение Joo » 20.10.2009 (Вт) 13:21

Nord777 писал(а):
Эти элементы управления являются безоконными и не приведут к активации окна при их выборе...
Это видимо про активацию при помощи сообщений. Мышью активируется.

Ты очень расплывчато выражаешься.
Приведи пример контрола, чьё поведение ты хочешь повторить.


В общем мне нужно сделать контрол типа ComboBox но при нажатии на стрелочку, вcплывать должен DataGridView.

В принципе с рефлектором в руках я расковырял ToolStripDropDown, и как оказалось я делал так же как там, отлавливал WM_NCACTIVATE и не давал родителю деактивировать заголовок.

Но мне указывать родителя приходиться вручную Show(OwnerWindow), а ToolStripDropDown сам определяет какому окну нельзя деактивировать заголовок.
Как он сам определяет это окно я не понял.

Использование ToolStripDropDown возможно но крайне не желательно.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Popup window

Сообщение Joo » 20.10.2009 (Вт) 14:54

В общем у меня получился вот такой вариант.
Конечно он требует доработки. Механизма лучше я не придумал.

Во вложении исходник, может пригодиться кому.

PopupWindow.png
PopupWindow.png (40.72 Кб) Просмотров: 987
Вложения
PopupWindow.zip
(127.84 Кб) Скачиваний: 244
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Popup window

Сообщение Nord777 » 21.10.2009 (Ср) 12:17

1) Зачем ты datagridview вкладываешь в форму?
2) Если положить контрол в контейнер(например панель) - неправильно определяются координаты.
Вместо PointToScreen используй RectangleToScreen.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Popup window

Сообщение Joo » 21.10.2009 (Ср) 13:36

Nord777 писал(а):1) Зачем ты datagridview вкладываешь в форму?
2) Если положить контрол в контейнер(например панель) - неправильно определяются координаты.
Вместо PointToScreen используй RectangleToScreen.


1. Мне нужен именно датагрид, а как по другому? Или я тебя не понял.

2. Ок, учту.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Popup window

Сообщение Nord777 » 21.10.2009 (Ср) 14:28

1. Мне нужен именно датагрид, а как по другому? Или я тебя не понял.
В данном коде ты меняешь поведение и стили формы-контейнера в котором лежит твой датагрид.
Попробуй менять стили и wndproc непосредственно у датагрида, не кладя его на форму. Любой контрол это полноценное окно, а основное поведение диктуется стилями.
После ws_popup он будет вести себя практически как форма.
Разница только в реализации wnd_proc.
Стили примерно такие:
Код: Выделить всё
                cParams.ClassStyle = CS_DROPSHADOW Or CS_SAVEBITS
                cParams.Style = WS_BORDER Or WS_POPUP Or WS_VISIBLE
                cParams.ExStyle = WS_EX_TOPMOST
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Popup window

Сообщение Joo » 21.10.2009 (Ср) 15:06

Nord777 писал(а):В данном коде ты меняешь поведение и стили формы-контейнера в котором лежит твой датагрид.
Попробуй менять стили и wndproc непосредственно у датагрида, не кладя его на форму. Любой контрол это полноценное окно, а основное поведение диктуется стилями.
После ws_popup он будет вести себя практически как форма.
Разница только в реализации wnd_proc.
Стили примерно такие:
Код: Выделить всё
                cParams.ClassStyle = CS_DROPSHADOW Or CS_SAVEBITS
                cParams.Style = WS_BORDER Or WS_POPUP Or WS_VISIBLE
                cParams.ExStyle = WS_EX_TOPMOST


Ага, все понял. Я как-то сразу не подумал, а и права не обязательно на форму кидать. Спасибо за идею.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: Google-бот и гости: 36

    TopList