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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2009, 20:03   #1
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию как сделать полосатый листбокс?

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

Код:
  Result:= SendMessage(Handle, LB_ADDSTRING, 0, str);
  SendMessage(Handle, LB_SETITEMDATA, WPARAM(Result), data);
  SendMessage(Handle, LB_GETITEMRECT, Result, LongInt (@rcItem));
  
  DC:= GetDC(Handle);
  Br:= CreateSolidBrush($00408000);

  SelectObject(DC, Br);
  
  Rectangle(DC, rcItem.TopLeft.x, rcItem.TopLeft.y, rcItem.BottomRight.x, rcItem.BottomRight.y);
  
  DeleteObject(Br);
  ReleaseDC(Handle, DC);
проблема в том что контекст сразу удаляеться. вопрос: правельно ли я расписал метод, при каком событие надо вызывать эту ф-ию, и есть ли у кого нить пример полосатого листбокса на WinApi?
user_jasser вне форума Ответить с цитированием
Старый 17.02.2009, 20:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

если я не ошибаюсь, то полосатость листбокса реализуется не во время добавления, а во время прорисовки контрола.
rpy3uH вне форума Ответить с цитированием
Старый 22.02.2009, 13:25   #3
seedam
Новичок
Джуниор
 
Регистрация: 22.02.2009
Сообщений: 1
По умолчанию

Я тоже так думаю, делается все это вначале.
seedam вне форума Ответить с цитированием
Старый 22.02.2009, 14:55   #4
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Это как так? Я слышал про стиль окна "LBS_OWERDRAW" но там не разобрался как добавить итемы в листбокс. через "LB_ADDSTRING" строки получаються невидимые..
user_jasser вне форума Ответить с цитированием
Старый 22.02.2009, 22:53   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Правильно Грузин говорит. Это при перерисовке делается. В Дельфи это делается по событию DrawItem, значит на ВинАпи нужно ловить аналогичное сообщение перерисовки и по нему уже раскрашивать.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 22.02.2009, 23:32   #6
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

mutabor
Дело в том что я дебажу листбокс на сообщение WM_DRAWITEM, а оно ваще не черта не выводит...
user_jasser вне форума Ответить с цитированием
Старый 23.02.2009, 00:16   #7
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

покажи код. должно работать.
Роман Радер вне форума Ответить с цитированием
Старый 23.02.2009, 00:40   #8
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Роман Радер
типо так:

Код:
function NewListBoxProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_DRAWITEM :
    begin
      DebugMessage('WM_DRAWITEM');
    end;
    WM_CHAR :
    begin
      if wParam = $0A then begin
         DestroyWindow(hWnd);
         SetFocus(vHWND[vScintilla]);
      end;
    end;
  end;
  Result:= CallWindowProc(vWNDPROC[vListBox], hWnd, uMsg, wParam, lParam);
end;          

function TVjassEdit.ListBoxCreate(hWndParent: hWND; X, Y, nWidth, nHeight: longint): hWND;
var Style: DWORD;
begin
  Style:= WS_CHILD or WS_VISIBLE or WS_BORDER or WS_VSCROLL;
  result:= CreateWindowEx(0, 'ListBox', nil, Style, X, Y, nWidth, nHeight, hWndParent, 0, hInstance, nil);
  vWNDPROC[vListBox]:= WNDPROC(SetWindowLong(result, GWL_WNDPROC, Longint(@NewListBoxProc)));
end;
даже со стилем LBS_OWERDRAW не пашет. Можеть этот сообщение должно главное окно получать?
user_jasser вне форума Ответить с цитированием
Старый 23.02.2009, 01:29   #9
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Код:
  vWNDPROC[vListBox]:= WNDPROC(SetWindowLong(result, GWL_WNDPROC, Longint(@NewListBoxProc)));
не въехал. vWNDPROC[vListBox] понятно. массив hwnd, vListBox-типа константа с индексом. неважно.
а вот в правой части...
Роман Радер вне форума Ответить с цитированием
Старый 23.02.2009, 14:19   #10
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Роман Радер
ну как бы подменяю виндовсный обработчик на свой. Ну собсно чтоб не писать весь обработчик наново, или как? Регить класс? У меня еще радитель листбокса чужее окно..
user_jasser вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как обновить листбокс? counter Win Api 2 16.02.2009 11:42
Элементы массива в листбокс KiDoki Общие вопросы Delphi 4 07.10.2008 18:05
листбокс blackstersl Общие вопросы Delphi 2 03.10.2008 17:08
ЛистБокс subsonic Общие вопросы Delphi 2 14.07.2008 09:59
Листбокс BETONOMESHALKA Общие вопросы Delphi 16 27.12.2007 10:19