| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > ListView и Combo Box |
| Автор: jimbo 8.2.2010, 19:04 |
| Привет всем! MSVS08 На диалог кидаю листвью. репорт вью ставлю. Заполняю колонки и 3 айтема кидаю ручками. Хочу, чтобы у меня первая колонка выглядела как комбобокс. (все сабайтемы) возникли трудности 1) Как сделать, чтобы при нажатии на комбик - он раскрывался. я так понял я просто жму не на комбобокс а на лист.Что сделать, чтобы лист не перехватывал нажатие и комбик открывался? может его вручную открыть? я пока проверяю. может кто логичнее решение предложит) 2) как фиксировать ширину столбца или столбцов |
| Автор: artsb 8.2.2010, 19:11 |
| 1. создайте один комбобокс. при клике по айтему заполняйте комбобокс нужными значениями и отображайте его в нужном месте. А раскроете его "вручную". Добавлено через 2 минуты и 35 секунд не забудьте листвиев сделать родителем комбобокса |
| Автор: Earnest 9.2.2010, 09:57 |
| Вообще-то комбобокс выглядит в таблице ужасающе. Но есть приемчик, подсмотренный мною у BCGP: комбобокс создается и позиционируется, но НЕВИДИМЫМ. Позиционируется так, чтобы низ совпал с ячейкой. По нажатию на итем (или можно свою кнопочку нарисовать), просто посылаем CB_SHOWDROPDOWN. Дальше - стандартно: ловите в лист-вью уведомление CBN_SELCHANGE или CBN_SELENDOK и принимаете значение. По уведомлению CBN_CLOESUP комбобокс можно удалить... Первая колонка умеет создавать эдит. Если нужно ограничить выбор списком значений, то редактирование лучше отключить. |
| Автор: Earnest 10.2.2010, 08:33 |
Есть разные методы: можно создавать окно только на время, когда оно нужно, а потом удалять. А можно просто прятать (т.е. чего прятать, оно и так невидимо...). В втором случае при клике нужно поле передвинуть, перезаполнить (вдруг что-то изменилось). в общем, разница с созданием заново ничтожна. По большей части, это дело вкуса. |
| Автор: jimbo 10.2.2010, 08:43 |
| а что делать со скролллингом? и такой момент. есть в таблице колонки, допустим имя - время - значение у колонки значение может быть несколько значений. если одно - оно сразу вписывается в таблицу. если несколько - я хотел ставить комбобокс. у меня возникли сложности со скроллингом - рисуется много комбиков и не сразу все удаляются. плюс при нажатии на самый последний комбик - вылазиет не он а другоу. потом когда все рисуется - нормально. ваш метод с удалением - решает вопрос с рисовкой, я так полагаю. но не понятно тогда становится а можно ли сделать выбор? т.е. постоянно мы видим заполнееную таблицу. а где можно делать выбор - мы не видим, т.к. комбика нет:( |
| Автор: Earnest 10.2.2010, 08:53 |
| jimbo, ты читаешь, что тебе пишут? У меня такое ощущение, что нет. Комбик вообще один на всю таблицу и не виден. Используется только когда пользователь на итем кликнет. Какие могут проблемы со скроллингом? Насчет того, как показать пользователю, что возможен выбор, могут быть варианты. Например, рисовать кнопку в итеме самому (через OwnerDraw или CustomDraw). И не создавать кнопку а именно рисовать (фигнюшку, похожую на кнопку). А можно и не париться. Если по клику на итем не начинать редактирование, а вывешивать список, пользователь наверняка догадается, что надо выбирать. |
| Автор: jimbo 10.2.2010, 09:42 |
| я не тупой - я все понимаю. я создавал комбик на каждый айтем, где надо делать выбор, чтобы пользователь видел где он возможен а где нет. Вот допустим, вы все выбрали, а потом решили изменить - а куда тыркать ? не видно!! Вот вариант с подсветкой мне больше нравится. только не пойму, как нарисовать в уголке сабайтема треугольник, чтобы дать пользователю понять что там список может быть, и одновременно не мешать видеть всю таблицу. Про то, что комбик можно один иметь я догадался, решаю вопрос с уведомлением пользователя. про скролинг я написал - может кто знает как решить проблему, тогда и вопрос с уведомлением пропадает, так как комбиков много. про рисование кнопки- ну это не эстетично мне кажется, надо что-то маленькое и не мешающее |
| Автор: artsb 10.2.2010, 10:53 |
| Earnest, понял вас Ну так это и хорошо. Представьте если в каждой ячейке будет Комбик - это же будет выглядеть ужасно. Поэтому обрабатывайте клик по Итему и потом создавайте (или отображайте, как вам удобнее) Комбик по тем же координатам что и Итем и автоматом разворачивайте список. Если вы хотите показать пользователю, что в "этой" ячейке расположен список - рисуйте что-нибудь, что будет об этом говорить (стрелочку вниз или треугольник в уголке (как в Excel), например). Где это сделать написал Earnest: Ещё напишите обработчик для Комбика OnExit, в котором скрывайте Комбик (также его нужно скрывать после того как пользователь выбрал значение). Это будет гарантировать, что Комбик скроется если пользователь начнёт прокручивать список ListView или переключится на другой контрол. Это должно решить вашу проблему с кашей из Комбиков. |
| Автор: Earnest 10.2.2010, 13:10 | ||
Если сам комбобокс не виден, то его выпадающий список прекрасно сам скроется, когда выбор сделан или ESCAPE или переключение фокуса. В том то и смысл, что париться особо не надо. CBN_CLOSEUP дает возможность узнать, что список закрылся, и можно что-то дополнительно сделать - но не в смысле скрытия, комобокс прекрасно сам с этим справится.. jimbo, никто и не говорит, что ты тупой. Просто обсуждая с кем-то свою проблему, не надо предполагать, что твой собеседник только о ней и думает, и может понимать тебя с полуслова. Старайся четче излагать свои мысли, сообщая необходимые и достаточные сведения, вот и все. Что касается рисования треугольника, есть функция DrawFrameControl, которая тебе поможет, с type=DFC_SCROLL и state=DFCS_SCROLLDOWN. Писать ради этого полный OnwerDraw обидно и муторно, но можно, по-моему, обойтись CustomDraw - обработать что-то вроде PostPaintItem (точных слов не помню, читай про NM_CUSTOMDRAW для лист-вью). Добавлено через 3 минуты и 19 секунд Если все же хочешь париться с тысячей комбобоксjs - ну вдруг... Лови WM_HSCROLL и WM_VSCROLL на листконтроле, вызывай стандартную обработку, а потом вычисляй, куда уехали итемы и перемещай комбики. Вполне реально... но я бы не стала... |
| Автор: jimbo 10.2.2010, 15:03 | ||
| Всем спасибо за ответы! Earnest, я извиняюсь. да я много чего не написал, моя ошибка, признаю. Много комбобоксов - это конечно круто - но муторно. решил таскать один по всей таблице. вопрос с уведомлением пользователя решил осветлением текста сабайтема. стрелочка вниз конечно прикольно, но мозолит глаза(мне так показалось
готов не согласиться. комбобоксы во всю колонку - очень даже нормально. интуитивно понятнее, что в этой колонке надо выбрать значения. что это не просто текстовое поле, а то, что можно или нужно задать. это как чек-боксы во всю колонку - сразу понятно, что надо делать выборку или установить значение - да/нет. тема закрыта |
| Автор: Dem_max 12.2.2010, 09:12 |
Тебе так нужно сделать ?![]() |
| Автор: jimbo 12.2.2010, 11:07 |
| да, именно так надо было. уже сделал. всем спасибо или у тебя есть несколько другая модель реализации? Пожалуйста - расскажи идею, будет очень познавательно) |
| Автор: Dem_max 12.2.2010, 11:31 | ||
|
| Автор: jimbo 12.2.2010, 13:48 |
| интересно, вы читали что было в ветке этой? собственно тоже самое тут и описывается ничего нового - но надеюсь поможет след поколению все равно спасибо за код) |