listview - Delphi: Canvas.FillRect in List View -



listview - Delphi: Canvas.FillRect in List View -

on alter of text of list view's subitem need brush , fill whole row:

procedure tform1.listviewdrawitem(sender: tcustomlistview; item: tlistitem; rect: trect; state: townerdrawstate); begin if item.subitems[2]='done' begin sender.canvas.font.color := clblack; sender.canvas.brush.color := clgreen; sender.canvas.brush.style := bssolid; sender.canvas.fillrect(rect); end; end;

but sender.canvas.fillrect(rect) fill rect of subitem. how fill whole row?

the question asked on base of operations of delphi: how draw little icons in list view on customdrawitem

thanks!

first, if have 3 columns, caption, subitems[0], , subitems[1], remember? there no subitems[2]!

anyhow, easy. need very, little modification of old code.

procedure tform1.listview1drawitem(sender: tcustomlistview; item: tlistitem; rect: trect; state: townerdrawstate); var i: integer; x1, x2: integer; r: trect; s: string; const dt_align: array[talignment] of integer = (dt_left, dt_right, dt_center); begin if sametext(item.subitems[1], 'done') begin sender.canvas.font.color := clblack; sender.canvas.brush.color := cllime; end else if odd(item.index) begin sender.canvas.font.color := clblack; sender.canvas.brush.color := $f6f6f6; end else begin sender.canvas.font.color := clblack; sender.canvas.brush.color := clwhite; end; sender.canvas.brush.style := bssolid; sender.canvas.fillrect(rect); x1 := 0; x2 := 0; r := rect; sender.canvas.brush.style := bsclear; sender.canvas.draw(3, r.top + (r.bottom - r.top - bm.height) div 2, bm); := 0 listview1.columns.count - 1 begin inc(x2, listview1.columns[i].width); r.left := x1; r.right := x2; if = 0 begin s := item.caption; r.left := bm.width + 6; end else s := item.subitems[i - 1]; drawtext(sender.canvas.handle, s, length(s), r, dt_singleline or dt_align[listview1.columns[i].alignment] or dt_vcenter or dt_end_ellipsis); x1 := x2; end; end;

notice in particular utilize cllime instead of clgreen, because clblack text on clgreen background looks horrible! might consider clwhite text on clgreen background, though:

update in response comments:

to alter 3rd column of list view, doesn't do

procedure tform1.formclick(sender: tobject); begin listview1.items[3].subitems[1] := 'done'; end;

indeed, windows doesn't know info of 1 column affects appearance of entire row! the simplest prepare tell windows repaint entire command when have changed value better: tell windows redraw current row:

procedure tform1.formclick(sender: tobject); begin listview1.items[3].subitems[1] := 'done'; listview1.items[3].update; end;

delphi listview fill brush rect

Comments

Popular posts from this blog

iphone - Dismissing a UIAlertView -

c# - Can ProtoBuf-Net deserialize to a flat class? -

javascript - Change element in each JQuery tab to dynamically generated colors -