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
Post a Comment