Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView и Combo Box, сделать комбик в лист вью 
V
    Опции темы
jimbo
Дата 8.2.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Привет всем!

MSVS08

На диалог кидаю листвью. репорт вью ставлю. 

Заполняю колонки и 3 айтема кидаю ручками. 

Хочу, чтобы у меня первая колонка выглядела как комбобокс. (все сабайтемы)  возникли трудности
1) Как сделать, чтобы при нажатии на комбик - он раскрывался. я так понял я просто жму не на комбобокс а на лист.Что сделать, чтобы лист не перехватывал нажатие и комбик открывался? может его вручную открыть? я пока проверяю. может кто логичнее решение предложит)
2) как фиксировать ширину столбца или столбцов


--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
artsb
Дата 8.2.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



1. создайте один комбобокс. при клике по айтему заполняйте комбобокс нужными значениями и отображайте его в нужном месте. А раскроете его "вручную".

Добавлено через 2 минуты и 35 секунд
не забудьте листвиев сделать родителем комбобокса


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Earnest
Дата 9.2.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Вообще-то комбобокс выглядит в таблице ужасающе. Но есть приемчик, подсмотренный мною у BCGP: комбобокс создается и позиционируется, но НЕВИДИМЫМ. Позиционируется так, чтобы низ совпал с ячейкой. По нажатию на итем (или можно свою кнопочку нарисовать), просто посылаем CB_SHOWDROPDOWN. Дальше - стандартно: ловите в лист-вью уведомление CBN_SELCHANGE или CBN_SELENDOK и принимаете значение. По уведомлению CBN_CLOESUP комбобокс можно удалить...
Первая колонка умеет создавать эдит. Если нужно ограничить выбор списком значений, то редактирование лучше отключить.


--------------------
...
PM   Вверх
artsb
Дата 9.2.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Цитата(Earnest @  9.2.2010,  09:57 Найти цитируемый пост)
Вообще-то комбобокс выглядит в таблице ужасающе. Но есть приемчик, подсмотренный мною у BCGP: комбобокс создается и позиционируется, но НЕВИДИМЫМ. Позиционируется так, чтобы низ совпал с ячейкой. По нажатию на итем (или можно свою кнопочку нарисовать), просто посылаем CB_SHOWDROPDOWN. Дальше - стандартно: ловите в лист-вью уведомление CBN_SELCHANGE или CBN_SELENDOK и принимаете значение. По уведомлению CBN_CLOESUP комбобокс можно удалить...

Ну я это и имел ввиду. Видать не точно выразился smile

Цитата(Earnest @  9.2.2010,  09:57 Найти цитируемый пост)
CBN_CLOESUP комбобокс можно удалить...

Может вы имели ввиду скрыть, а не удалить?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Earnest
Дата 10.2.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(artsb @  9.2.2010,  11:24 Найти цитируемый пост)
Может вы имели ввиду скрыть, а не удалить?

Есть разные методы: можно создавать окно только на время, когда оно нужно, а потом удалять. А можно просто прятать (т.е. чего прятать, оно и так невидимо...). В втором случае при клике нужно поле передвинуть, перезаполнить (вдруг что-то изменилось). в общем, разница с созданием заново ничтожна. По большей части, это дело вкуса. 


--------------------
...
PM   Вверх
jimbo
Дата 10.2.2010, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



а что делать со скролллингом? 

и такой момент. есть в таблице колонки, допустим
имя - время - значение

у колонки значение может быть несколько значений. если одно - оно сразу вписывается в таблицу. 
если несколько - я хотел ставить комбобокс. у меня возникли сложности со скроллингом - рисуется много комбиков и не сразу все удаляются. плюс при нажатии на самый последний комбик - вылазиет не он а другоу. потом когда все рисуется - нормально. 

ваш метод с удалением - решает вопрос с рисовкой, я так полагаю. но не понятно тогда становится а можно ли сделать выбор? т.е. постоянно мы видим заполнееную таблицу. а где можно делать выбор - мы не видим, т.к. комбика нет:(
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Earnest
Дата 10.2.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



jimbo, ты читаешь, что тебе пишут? У меня такое ощущение, что нет. 
Комбик вообще один на всю таблицу и не виден. Используется только когда пользователь на итем кликнет. Какие могут проблемы со скроллингом?
Насчет того, как показать пользователю, что возможен выбор, могут быть варианты. Например, рисовать кнопку в итеме самому (через OwnerDraw или CustomDraw). И не создавать кнопку а именно рисовать (фигнюшку, похожую на кнопку). А можно и не париться. Если по клику на итем не начинать редактирование, а вывешивать список, пользователь наверняка догадается, что надо выбирать.


--------------------
...
PM   Вверх
jimbo
Дата 10.2.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



я не тупой - я все понимаю. 

я создавал комбик на каждый айтем, где надо делать выбор, чтобы пользователь видел где он возможен а где нет. 

Вот допустим, вы все выбрали, а потом решили изменить - а куда тыркать ? не видно!!

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

Про то, что комбик можно один иметь я догадался, решаю вопрос с уведомлением пользователя.

про скролинг я написал - может кто знает как решить проблему, тогда и вопрос с уведомлением пропадает, так как комбиков много.

про рисование кнопки- ну это не эстетично мне кажется, надо что-то маленькое и не мешающее
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
artsb
Дата 10.2.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Earnest, понял вас smile

Цитата(jimbo @  10.2.2010,  09:42 Найти цитируемый пост)
не видно!!

Ну так это и хорошо. Представьте если в каждой ячейке будет Комбик - это же будет выглядеть ужасно. Поэтому обрабатывайте клик по Итему и потом создавайте (или отображайте, как вам удобнее) Комбик по тем же координатам что и Итем и автоматом разворачивайте список. Если вы хотите показать пользователю, что в "этой" ячейке расположен список - рисуйте что-нибудь, что будет об этом говорить (стрелочку вниз или треугольник в уголке (как в Excel), например).
Где это сделать написал Earnest:
Цитата(Earnest @  10.2.2010,  08:53 Найти цитируемый пост)
через OwnerDraw или CustomDraw


Ещё напишите обработчик для Комбика OnExit, в котором скрывайте Комбик (также его нужно скрывать после того как пользователь выбрал значение). Это будет гарантировать, что Комбик скроется если пользователь начнёт прокручивать список ListView или переключится на другой контрол. Это должно решить вашу проблему с кашей из Комбиков.

Это сообщение отредактировал(а) artsb - 10.2.2010, 10:55


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Earnest
Дата 10.2.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(artsb @  10.2.2010,  11:53 Найти цитируемый пост)
также его нужно скрывать после того как пользователь выбрал значение

Если сам комбобокс не виден, то его выпадающий список прекрасно сам скроется, когда выбор сделан или ESCAPE или переключение фокуса. В том то и смысл, что париться особо не надо. CBN_CLOSEUP дает возможность узнать, что список закрылся, и можно что-то дополнительно сделать - но не в смысле скрытия, комобокс прекрасно сам с этим справится..
jimbo, никто и не говорит, что ты тупой. Просто обсуждая с кем-то свою проблему, не надо предполагать, что твой собеседник только о ней и думает, и может понимать тебя с полуслова. Старайся четче излагать свои мысли, сообщая необходимые и достаточные сведения, вот и все. Что касается рисования треугольника, есть функция DrawFrameControl, которая тебе поможет, с type=DFC_SCROLL и state=DFCS_SCROLLDOWN. Писать ради этого полный OnwerDraw обидно и муторно, но можно, по-моему, обойтись CustomDraw - обработать что-то вроде PostPaintItem (точных слов не помню, читай про NM_CUSTOMDRAW для лист-вью).

Добавлено через 3 минуты и 19 секунд
Если все же хочешь париться с тысячей комбобоксjs - ну вдруг...
Лови WM_HSCROLL и WM_VSCROLL на листконтроле, вызывай стандартную обработку, а потом вычисляй, куда уехали итемы и перемещай комбики. Вполне реально... но я бы не стала...


--------------------
...
PM   Вверх
jimbo
Дата 10.2.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Всем спасибо за ответы!

Earnest, я извиняюсь. да я много чего не написал, моя ошибка, признаю.


Много комбобоксов - это конечно круто - но муторно. решил таскать один по всей таблице. вопрос с уведомлением пользователя решил осветлением текста сабайтема. стрелочка вниз конечно прикольно, но мозолит глаза(мне так показалосьsmile)



Цитата

Представьте если в каждой ячейке будет Комбик - это же будет выглядеть ужасно


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

тема закрытаsmile еще раз всем спасбио
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Dem_max
Дата 12.2.2010, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Тебе так нужно сделать ?

user posted image


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
jimbo
Дата 12.2.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



да, именно так надо было. уже сделал. всем спасибоsmile 

или у тебя есть несколько другая модель реализации? 

Пожалуйста - расскажи идею, будет очень познавательно)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Dem_max
Дата 12.2.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Код


LRESULT (CALLBACK* OldEditListProc) (HWND, UINT, WPARAM, LPARAM);

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

   NMHDR *lpnmhdr = (LPNMHDR) lParam;
   NMUPDOWN *lpnmud = (LPNMUPDOWN) lParam;

   switch (msg)
   {
      case WM_NOTIFY:
      {
         switch(lpnmhdr->code)
         {
            case NM_CLICK:
            {
               switch(lpnmhdr->idFrom)
               {
                  case IDC_DATAN_LIST:
                  {
                     LPNMITEMACTIVATE lpnmia = (LPNMITEMACTIVATE)lParam;
                     RECT rc;
                     
                     ListView_GetSubItemRect(GetDlgItem(hWndDlg, IDC_DATA_LIST), lpnmia->iItem, lpnmia->iSubItem,  LVIR_BOUNDS, &rc);
                     
                     int i = ListView_GetItemCount(GetDlgItem(hWndDlg, IDC_DATA_LIST));
                     
                     Item = lpnmia->iItem; // запоминаем где нажали это нужно если прога без манифеста
                     
                     // Эта проверка что мы находимся в 3 столбще (счет с 1) и в нужной строчке
                     if(lpnmia->iSubItem != 2 || lpnmia->iItem > i || lpnmia->iItem < 0 ) break;
                     
                     hWndEditList = CreateWindow(_T("ComboBox"), _T(""),
                               CBS_DROPDOWNLIST | WS_VSCROLL | WS_CHILD,// | WS_VISIBLE,
                              0, 0, 20, 230,
                              GetDlgItem(hWndDlg, IDC_DATA_LIST), 
                              (HMENU)IDC_EDIT_LIST,
                              hInstance,
                              NULL);
                     
                     HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
                     SendMessage(hWndEditList, WM_SETFONT, (WPARAM)hFont, NULL);

                     ComboBox_AddString(hWndEditList, _T("1"));
                     ComboBox_AddString(hWndEditList, _T("2"));
                     ComboBox_AddString(hWndEditList, _T("3"));
                     ComboBox_AddString(hWndEditList, _T("4"));
                     ComboBox_SetCurSel(hWndEditList, 0);  

                     SetWindowPos(hWndEditList, NULL, rc.left, rc.top, (rc.right-rc.left), (rc.bottom-rc.top), SWP_SHOWWINDOW);
                     OldEditListProc = (WNDPROC)SetWindowLong(hWndEditList, GWL_WNDPROC,(long)EditListWndProc);
                     SetFocus(hWndEditList);
                     
                     ComboBox_SetMinVisible(hWndEditList, 5);
                     ComboBox_ShowDropdown(hWndEditList, TRUE);
                  }break;
               }
            }break;
         }
      }break;
  }

  return FALSE;
}

//---------------------------------------------------------------------------
LRESULT CALLBACK EditListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   UINT codeNotify = HIWORD(wParam);

   switch (msg)
   {
      case WM_COMMAND:
      {
         switch(codeNotify)
         {
            case CBN_CLOSEUP:
            {
               DestroyWindow(hwnd);
            } break;

            case CBN_SELCHANGE:
            {
               TCHAR txt[200];

               ComboBox_GetText(hWndEditList, txt, 200);

               int i = Item;//ListView_GetHotItem не работает без Манифеста ХP ListView_GetHotItem(GetDlgItem(hWndDlg, IDC_DATA_LIST));
               
               ListView_SetItemText(GetDlgItem(hWndDlg, IDC_DATA_LIST), i, 2, txt);

            }break;
         }
      }break;

      case WM_WINDOWPOSCHANGING:
      {
         SetWindowPos(hWndEditList, NULL, 0, 0, 0, 0, SWP_HIDEWINDOW);
         InvalidateRect(GetDlgItem(hWndDlg, IDC_DATA_LIST), NULL, TRUE);
      }break;

   }  

   return CallWindowProc((WNDPROC)OldEditListProc, hwnd, msg, wParam, lParam);
}





Это сообщение отредактировал(а) Dem_max - 12.2.2010, 11:35


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
jimbo
Дата 12.2.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



интересно, вы читали что было в ветке этой? собственно тоже самое тут и описываетсяsmile

ничего нового - но надеюсь поможет след поколениюsmile

все равно спасибо за код)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0781 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.