Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > ComboBox


Автор: Kefir 4.6.2006, 20:25
Ммм... нужно мне сделать такой комбик, который: а) имеет мой бэкграунд (картинка и сверху текст, естесственно) и б) выпадающий список также появляется на определённом бэкграунде. Вот и весь вопрос - это мне через куда делать?  

Автор: Ch0bits 4.6.2006, 21:26
Нужно использовать режим OwnerDraw.

Добавлено @ 21:27 
Поищи что-нибудь подобное тут:
http://www.codeproject.com/cs/combobox/ 

Автор: Kefir 5.6.2006, 10:56
гм... повозился со всем этим делом - только вот одна проблема у меня - ownerdraw даёт мне рисовать ВНУТРИ комбика, но мне надо весь комбик перерисовывать. (то есть и рамочку вокруг него мне надо переделать). Вотъ... 

Автор: mr.DUDA 5.6.2006, 16:09
Цитата(Kefir @  5.6.2006,  09:56 Найти цитируемый пост)
гм... повозился со всем этим делом - только вот одна проблема у меня - ownerdraw даёт мне рисовать ВНУТРИ комбика, но мне надо весь комбик перерисовывать. (то есть и рамочку вокруг него мне надо переделать). Вотъ... 

Кажется, нужно WM_NCPAINT обрабатывать. 

Автор: Ch0bits 6.6.2006, 20:19
Цитата(mr.DUDA @  5.6.2006,  17:09 Найти цитируемый пост)
Кажется, нужно WM_NCPAINT обрабатывать. 

 smile  smile 
 

Автор: mr.DUDA 14.6.2006, 10:45
Ch0bits, это только догадка. А пример можешь на www.codeguru.com посмотреть, в разделе MFC 

Автор: Kefir 15.6.2006, 09:42
На Paint неохота прорисовывать (не люблю я всякие рисовалки). Я сделал немного подругому (это я так - для тех кто может заинтересуется - вроде как howto). Возни, мне кажется меньше и к тому же всё проходит в дизайнере.
Значит постановка задачи: нужен ComboBox, у которого... 
1) свой вид, т.е. на него можно матягивать картинки как на кнопки и менять их при нажатии/отжатии и т.д. (т.е. по эвентам).
2) у самого дроп-дауна должен быть свой вид (опять же некая картинка) + можно и нестандартную прокрутку сделать (например две кнопки - вверх и вниз).

Итак по шагам. Я сделал следующее:
1. Создаём сам ComboBox - вместо обычного комбо ставим на  форму CheckBox (ответ на вопрос "почему не кнопку?" можно найти в http://forum.vingrad.ru/index.php?showtopic=99908 теме).
2. Устанавливаем Appearance нашего чекбокса в Button.
3. FlatAppearance по вкусу (если кнопка должна быть с мега картинкой без виндовского вида, то ставим FlatStyle = Flat и бякграунд имаже на нужную картинку).
--- Теперь у нас есть нормальная не глючная "кнопка", которая на самом деле чек-бокс (но никто об этом не знает ;)) ---
--- Приступим к дроп-дауну ---
4. Дроп-даун делается очень просто. Добавляем в проект ещё одну форму.
5. Добавляем ему какую-нить public переменную (для примера - public int choise).
6. Кидаем на эту форму нужные контролы, обозначающие "выборы" дроп-дауна (у меня это простые лэйблы).
7. Каждом них назначаем обработчик MouseClick в котором код примерно такой:
Код

this.choise = 1; //тут устанавливаем какой результат выбора
this.Close();

--- Теперь у нас есть замечательный дроп-даун в виде формы (а раз это форма, то возможности дизайна её просто безграничны!) ---
--- Осталось только связать наш чек-бокс с этой формой ---
8. Добавляем чек-боксу эвент MouseClick и там пишем (код опять же подтачиваем под себя):
Код

language_popup lang = new language_popup(); // тут мы создаём нашу дроп-даун форму
lang.Location = new Point(((CheckBox)sender).Location.X, ((CheckBox)sender).Location.Y + 100); // тут мы говорим в каком месте она должна показаться на экране (НБ! чтобы так делать надо у формы поставить StartPosition = Manual, иначе не сработает)
lang.ShowDialog(); // тут мы показываем "дроп-даун"
this.currentLanguage = lang.language; // иполучаем из формы результат выбора пользователя
lang.Dispose();


Итак, это я в общих чертах обрисовал как я сделал красивый комбик. Конечно, есть у него и нехорошие стороны - например, выбор нужен обязательно (т.е. пользователь обязан что-то выбрать), но от этого можно избавится прозрачной формой (а на клике у формы сидит закрытие диалога). Мне лично это не надо, поэтому я такого и не делал. Мне этот путь показался довольно простым в том смысле, что всё делается в дизайнере и довольно-таки просто. Без особых проблем реализуется и "динамический" дроп-даун, так что способ, имхо, удобный. 

Автор: mr.DUDA 15.6.2006, 10:38
Kefir, важная деталь: в обычном drop-down'е если юзер кликнул мышью вне открытого popup-а, то дропдовн закрывается. Например, раскрыв комбобокс и ткнув мышью вне формы (на рабочий стол, другое окно, таскбар и т.п.) - комбобокс сворачивается. 

Автор: Kefir 15.6.2006, 13:10
mr.DUDA, да, это я знаю. в моей проге это не критично - пусть выбирают язык! %) прога будет стоять на терминале с тач-скрином и без клавы. хотя можно конечно извратится и ставить размер формы на весь экран (+ форма, сессно, прозрачная) и по клике не на кнопки просто форму закрывать. хотя, конечно, это уже извращение. Если говорить о некоем "правильном" пути, то это создание своего комбика и обтёсывание его до нужной кондиции. Я же описал более простой, но менее "умный" способ как можно достаточно тупо симитировать поведение комбо с возможностью наложения дизайна. 

Автор: Fomaa 4.5.2009, 17:24
а как же MicroSoft реализовал ComboBox? что он использует в качестве выпадающего списка?

Автор: shmarov 11.6.2009, 14:40
поддерживаю предыдущий вопрос!
как сделать чтобы закрывался список при клике за его пределами?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)