Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2014, 13:07   #21
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ща кофе допью и погадаю... покажите код, иначе как вам ответить?
Код:
    WM_DRAWITEM:
    begin
      lpdis := pdrawitemstruct(Lpar);
      sel := cbox_GetIndex(cbox_AVI_Splitter);
      n := cbox_GetCount(cbox_AVI_Splitter);
      top := 0;
      for i:=0 to n-1 do
        begin
          t := cbox_getItemText(cbox_AVI_Splitter,i);
          if sel=i then
          SetTextColor(lpdis.hDC,RGB(255,0,0)) else
          SetTextColor(lpdis.hDC,RGB(0,0,0));
          TextOut(lpdis.hDC,0,top,PChar(t),Length(t));
          inc(top,16);
        end;
    end;

    WM_COMMAND:
    if HiWord(Wpar)= cbn_selchange then
    begin
      sel := cbox_GetIndex(cbox_AVI_Splitter);
      t := cbox_GetItemText(cbox_AVI_Splitter,sel);
      dc := GetDC(cbox_AVI_Splitter);
      TextOut(dc,0,0,PChar(t),Length(t));
      ReleaseDC(cbox_AVI_Splitter,dc);
    end;
Вот как-то так у меня выходит. Когда вожу мышью по списку, то строчка под курсором становится красной. Значит, индекс комбо почему-то меняется при движении мыши.
Это со стилем CBS_OWNERDRAWFIXED.

Последний раз редактировалось BLACK_RAIN; 26.02.2014 в 13:09.
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.02.2014, 15:49   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Прочитайте описание структуры DRAWITEMSTRUCT - ваш обработчик абсолютно неправилен.
Возможно вникнув почему называется WM_DRAWITEM станет понятней.
waleri вне форума Ответить с цитированием
Старый 26.02.2014, 16:23   #23
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Возможно вникнув почему называется WM_DRAWITEM станет понятней.
Выходит, код по моей ссылке неправильный? Я же по нему это писал.
натолкните на мысль.
Если использовать CBS_OWNERDRAWVARIABLE, то сообщение приходит для каждого элемента и они обрабатываются отдельно.
Не пойму, что я упустил?

Последний раз редактировалось BLACK_RAIN; 26.02.2014 в 16:31.
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.02.2014, 16:55   #24
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

WM_DRAWITEM всегда приходит для каждого элемента, при использовании CBS_DROPDOWNLIST - даже для места, где обычно находится edit box.
При CBS_OWNERDRAWVARIABLE приходит и WM_MEASUREITEM.
waleri вне форума Ответить с цитированием
Старый 27.02.2014, 09:16   #25
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

waleri
Cейчас попробую переписать точь в точь по MSDN и посмотрю, будет работать или нет.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.02.2014, 10:54   #26
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Всё получилось!
Но теперь я не пойму, как получить индекс комбо, чтобы сравнить его с itemID.
CB_GETCURSEL возвращает индекс элемента, который находится под курсором, а не выбранный индекс комбо.
Полагаю, что можно брать текст из комбо и сравнивать его с текстом элемента. Если они совпали - менять цвет. Но это как-то стрёмно выглядит. Есть ли более правильное решение?
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.02.2014, 13:09   #27
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А это зачем?
Если то, о чем я думаю, то для этого есть itemState и itemAction.
waleri вне форума Ответить с цитированием
Старый 27.02.2014, 14:41   #28
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А это зачем?
Чтобы выбранный айтем отображался в списке другим цветом или еще как-то выделялся. В данный момент, это не важно. Но на будущее, хотелось бы сразу прояснить этот момент.
Цитата:
Сообщение от waleri Посмотреть сообщение
Если то, о чем я думаю, то для этого есть itemState и itemAction.
Я тоже так думал и с ними плясал, но не выходит. Айтемы либо все красные, либо все чёрные, либо меняют цвет при движении мыши. Я не понял, что с чем нужно сравнивать (смотрел в MSDN список возможных значений).
Код:
    WM_MEASUREITEM:
    begin
      mis := pmeasureitemstruct(Lpar);
      mis.itemHeight := 18;
    end;

    WM_DRAWITEM:
    begin
      dis := pdrawitemstruct(Lpar);
      s := gettext(combo);
      t := cbox_GetItemText(combo,dis.itemID);
      if ((dis.itemState and ods_comboboxedit)<=0) and (t=s) then //по-идее, долно работать, но всегда true
      SetTextColor(dis.hDC,RGB(255,0,0)) else
      SetTextColor(dis.hDC,RGB(0,0,0));
      TextOut(dis.hDC,0,dis.rcItem.Top,PChar(t),Length(t));
    end;

    WM_CREATE:
    begin
      combo := createwindow('ComboBox','',WS_CHILD or WS_VISIBLE or
      CBS_DROPDOWNLIST or CBS_OWNERDRAWFIXED or CBS_HASSTRINGS or WS_VSCROLL or WS_TABSTOP,
           10,10,80,200,wnd,0,hinstance,nil);
      for i:=0 to 9 do
        cbox_AddItem(combo,'item'+ IntToStr(i+1));
      cbox_SetIndex(combo,2);
Допустим, текущий выбранный элемент списка имеет индекс 2. Значит, третья строчка должна быть красной. Как задать условие?
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.02.2014, 15:43   #29
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Всё, спасибо, разобрался!
Немного не так, как хотел, но работает.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.02.2014, 17:23   #30
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Я повторюсь, для этого есть itemState и itemAction... но как знаете...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма. Выпадающий список SNkMaster HTML и CSS 13 15.03.2010 15:02
Выпадающий список Акашаев Нурлан Общие вопросы Delphi 3 27.06.2008 16:58
Выпадающий список в таблице БД Antowka БД в Delphi 14 28.05.2008 15:18
выпадающий список SunKnight БД в Delphi 1 24.03.2008 22:44
выпадающий список Toxa Microsoft Office Excel 2 23.04.2007 09:40