Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c