Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.19;
Скачать: CL | DM;

Вниз

CustomDrawItem у TListView   Найти похожие ветки 

 
frost ©   (2003-11-23 12:28) [0]

Необходимо раскрашивать TListView причем все - тоесть текст у Item, текст у Item который выделен,
фон у ListView (ну это понятно), фон у выделенных Item, цвет текста у выделенного Item когда ListView не в фокусе и фон у
выделенного Item когда ListView не в фокусе (тоесть HideSellection = False), использую CustomDrawItem но
у State всегда (cdsSelected, cdsFocused) что порекомендуете? Спасибо.


 
frost ©   (2003-11-26 15:58) [1]

Может кто link на пример раскрашенного до безобразия :) TListView знает, очень уж надо.


 
andruxin   (2003-11-27 15:30) [2]

ну кто нибудь знает. меня тоже это интересует.


 
frost ©   (2003-12-01 10:22) [3]

В Demos у Delphi есть пример CustomDraw где разукрашивается дерево, но может все таки ктото знает пример для TListView.


 
Maxud ©   (2003-12-01 10:53) [4]

Рой здесь :)

OnAdvancedCustomDrawSubItem(
Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);

type TCustomDrawState = set of (cdsSelected, cdsGrayed, cdsDisabled, cdsChecked, cdsFocused, cdsDefault, cdsHot, cdsMarked, cdsIndeterminate);


 
frost ©   (2003-12-01 11:03) [5]

Но все так и делаю только использую OnCustomDrawItem и State всегда (Selected, Focused)


 
NAlexey ©   (2003-12-01 11:08) [6]

Проверяй так:

if (Item = Sender.ItemFocused) and (Item <> Sender.Selected)


 
mRodion ©   (2003-12-02 16:07) [7]

Я делал это так, если я правильно понял Ваш вопрос.

procedure TfmLane.lvPicListDrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
const
CSPACE = 10;
var
i,j,k:integer;
x,y,x2,y2:integer;
aRect:TRect;
TextForPrint:string;
begin
lvPicList.Canvas.Brush.Color := CbackgroundColor1;
lvPicList.Canvas.Font.Color := lvPicList.Font.Color;

if (odSelected in State) then begin
lvPicList.Canvas.Brush.Color := clHighlight;
lvPicList.Canvas.Font.Color := clHighlightText;
end;

aRect := Rect;
x:=rect.Left;
y:=rect.top;
lvPicList.Canvas.FillRect (rect);
lvPicList.Canvas.Pen.Color := clRed;

TextForPrint := item.Caption;
lvPicList.Canvas.TextOut (x+CSPACE,y+1,TextForPrint);
x:=x+lvPicList.Columns.Items[0].Width;
Arect.Left := x;
for i:=1 to lvPicList.Columns.Count-1 do begin
lvPicList.Canvas.FillRect (arect);
if i<=item.SubItems.Count then begin
TextForPrint := item.SubItems.Strings[i-1]
end else begin
TextForPrint := "";
end;
lvPicList.Canvas.TextOut (x+CSPACE,y+1,TextForPrint);
x:=x+lvPicList.Columns.Items[i].Width;
Arect.Left := x;
end;

lvPicList.Canvas.Brush.Color := lvPicList.Color;
arect.Right := lvPicList.ClientWidth;
lvPicList.Canvas.FillRect (arect);

if (Item.Focused) then begin
lvPicList.Canvas.brush.Color :=clWhite;
lvPicList.Canvas.brush.Style := bsBDiagonal;
lvPicList.Canvas.FrameRect (rect);
end;
end;


 
Mouse   (2003-12-02 16:30) [8]

Вы все напутали!
Если ты хочешь чтобы у тя айтимы в ListView красиво красились - крась их при построении!
При етом можно разным айтимам задавать разные цвета и шрифты, и даже select цвет можно каждому поразному задать!
Но это все работает отлично, если все ето задавать при построении!
Если ето делать в OnCustomDrawItem - он не всегда пашет как ты хочешь и иногда притормаживает конкретно!


 
NAlexey ©   (2003-12-02 16:44) [9]

>mRodion ©
x:=x+lvPicList.Columns.Items[i].Width;
Скорее всего, вот это не будет работать во время раздвижения колонок. Т.е навел курсор на разделитель между колонками, нажал-потащил, фактическая ширина изменилась, а здесь ты будешь получать прежнюю ширину.


 
mRodion ©   (2003-12-02 16:48) [10]

2 NAlexey:
Приведенный код с некоторыми доработками работает во многих приложениях.
Фактическая ширина изменится, когда ты отпустишь ползунок.
Тогда вызовется медот DrawItem и все будет ОК


 
NAlexey ©   (2003-12-02 17:01) [11]

>mRodion ©
Возможно, просто если надвинуть кромку на соседнюю колонку, то текст скорее всего затрется, если отодвинуть то будут артефакты...


 
mRodion ©   (2003-12-05 12:06) [12]

Доработка в том и заключается, что текст никогда не печатается вплоть до последнего пиксела в колонке. Вместо этого печатается многоточие, которое само от края колонки отступает на несколько пикселов. Тогда таких глюков нет.


 
NAlexey ©   (2003-12-05 16:10) [13]

>mRodion ©
Нет, здесь дело не в этом, попробуй сам проведи эксперемент:
возмись за первый разделитель, т.е расширять будешь первую колонку, расширяй ее на длину второй колонки. Ты увидешь что текст второй колонки у тебя нарисуется на на первой(та которую растягиваешь) когда ты растянешь ее больше чем длина второй. Это произойдет потому, что "Columns.Items[i].Width" не изменилась при растягивании, а перерисовываться всеже надо. Процедура перерисовки будет думать что вторая колонка находится на месте, и рисовать текст тоже там где она находится, а фактически будет там находится уже перва. Вот и все...


 
Семен Сорокин ©   (2003-12-05 16:16) [14]

NAlexey © (05.12.03 16:10) [13]
для решения этой проблемы пришлось как-то написать потомка с соответствующими событиями


 
NAlexey ©   (2003-12-05 16:26) [15]

>для решения этой проблемы пришлось как-то написать потомка с соответствующими событиями
А зачем? Я гдето здесь оставлял решение, ты даже комментарий написал. Так что только по пути наименьшего сопротивления:)


 
panov ©   (2003-12-05 16:33) [16]

http://delphimaster.net/view/1-1069868330/


 
NAlexey ©   (2003-12-05 16:42) [17]

>panov ©
А как это поможет отцу русской демократии?:
"но у State всегда (cdsSelected, cdsFocused) что порекомендуете?"
Впринципе я с ним согласен, щас не поленюсь проверю.


 
Erik ©   (2003-12-05 17:03) [18]

Я использовал TVirtualStringTreeView очень хорошая вещь и Selected, Focused проблем нет.
TreePaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);

if Sender.FocusedNode = Node then
TargetCanvas.Brush.Color := $E0E0E0;
Усе. :)



Страницы: 1 вся ветка

Текущий архив: 2003.12.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-61920
Новичек
2003-11-25 14:08
2003.12.19
Как определить почему возникает access violation? :(


14-62221
Dimka Maslov
2003-11-26 14:49
2003.12.19
то-то ещё будет


1-62071
Julia
2003-12-09 12:05
2003.12.19
копирование файлов


6-62188
Vitalik
2003-10-23 11:26
2003.12.19
SendStream


14-62239
Карелин Артем
2003-11-25 13:47
2003.12.19
Еще одно предложение по совершенствованию форума.