![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сабклассинг TListBox - не ловится WM_DRAWITEM
wild sam © (2006-03-15 01:29:00)Здравствуйте. Хочу избавиться от рисования FocusedRect в TListBoxe c OwnerDraw. Наследника писать не хотелось, поэтому решил засабклассить и перекрыть WM_DRAWITEM. Проблема в том, что в новой оконной процедуре оно не появляется. Все остальные - WM_NCPAINT, например, срабатывают. WM_DRAWITEM - нет. Что это может быть?
Спасибо!
wild sam (2006-03-15 18:13:00) [1]Да, я в курсе. Пробовал перехватывать и cn_drawitem - тот же результат.
clickmaker (2006-03-15 12:05:00) [2]
> wild sam (15.03.06 01:45) [2]
для справки: wm_drawitem посылается родителю листбокса
wild sam (2006-03-15 01:45:00) [3]Упс. Это, действительно, работает :) Я читал про XOR при выводе DrawFocusRect, но реализовать не получилось. Решил, что придется делать сложно.
Спасибо большое!
Джо (2006-03-15 01:33:00) [4]> Хочу избавиться от рисования FocusedRect в TListBoxe c OwnerDraw
Так что мешает сделать в таком роде:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with TListBox(Control).Canvas do
begin
if odSelected in State then
begin
Brush.Color := clActiveCaption;
Font.Color := clHighlightText;
end
else
begin
Brush.Color := clWindow;
Font.Color := clWindowText;
end;
ListBox1.Canvas. FillRect (Rect);
TextOut(Rect.Left,Rect.Top,TListBox(Control).Items[Index]);
// рамку затираем только на выделенной строке
if (odSelected in State) and (odFocused in State) then
DrawFocusRect(Rect);
end;
end;