![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListBox убрать рамку в выделенной строке [D7, WinXP]
Дмитрий_05 © (2005-12-01 13:44:00)Как в ListBox-е убрать рамку в выделенной строке? она рисуется вокруг строки как бы пунктиром... вот как от нее можно избавиться?
Джо (2005-12-03 02:08:00) [21]
> [8] XCoder © (03.12.05 02:00)
> Так просто рамку не убереш, так как она рисуется после вызова
> OnDrawItem.
Вот как раз потому, если мы в OnDrawItem нарисуем focused-рамку, то следующий вызов DrawFocusRect (уже после OnDrawItem) на этом же месте даст чистую картинку, там же xor используется :)
Джо (2005-12-03 02:06:00) [22]
> [9] Джо © (03.12.05 02:01)
Лучше это условие записать вот так (возможно, еще пару флагов проверить, посмотри сам):
if (odSelected in State) and (odFocused in State) then
DrawFocusRect (Rect);
Джо (2005-12-03 02:01:00) [23]
> рамка рисуется на всех строках сразу
Так ты же ее и рисуешь на ВСЕХ строках. А тебе нужно рисовать только на выделенных, т.е, как-то в таком роде:
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) then
DrawFocusRect (Rect);
end;
XCoder (2005-12-03 02:00:00) [24]Так просто рамку не убереш, так как она рисуется после вызова OnDrawItem. Я использовал TCustomListBox. Перекрыл ему обработчик WM_PAINT и написал свой. Установил новый компонент в палитру и использовал его. Вот и все.
Дмитрий_05 (2005-12-03 01:44:00) [25]свойстро Style = lbOwnerDrawVariable, рамка рисуется на всех строках сразу...(((
Дмитрий_05 (2005-12-03 01:41:00) [26]Не помогло:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
DrawFocusRect(ListBox1.Canvas.Handle, Rect);
end;
Igor_thief (2005-12-02 17:16:00) [27]Дмитрий_05 (02.12.05 17:14) [4]
В OnDrawItem.
Дмитрий_05 (2005-12-02 17:14:00) [28]это в самом событии ListBox-а OnDrawItem? или всеже в своем компоненте унаследованно от TListBox?
Igor_thief (2005-12-02 12:46:00) [29]При прорисовке элемента просто вызови DrawFoсusRect. Все!
Дмитрий_05 (2005-12-01 20:01:00) [30]Т.е. так? И все какие переменные потребуются в procedure TMyListBox.CNDrawItemмне их нужно будет объявить в своем типе TMyListBox и тогда WM_PAINT переписывать придется...? или я неправильно понял?
type
TMyListBox = class(TListBox)
protected
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
end;
...
procedure TMyListBox.CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
begin
.........................все скопировать из ListBox CNDrawItem, кроме вызова DrawFocusRect
end;
Игорь Шевченко (2005-12-01 14:14:00) [31]В OnwerDraw ListBox переписать метод CNDrawItem, убрав оттуда вызов DrawFocusRect, в стандартном - не знаю :)