Listview에서 특정값을 가진 열을 다른 색으로 하고 임의의 라인을 클릭했을때 반전처리를 하려하는데 예문을 보면 각각의 예는 있지만 한번에 처리해주는 예문이 없어서
질문을 올립니다
아래와 같이 이벤트 하나에 두개를 함께 하려니 반전처리때 글자뒤의 칼라가 제대로 처리안되고 글자없는 부분만 반전처리 됩니다
좋은 방안이 없을까요?
procedure TClientForm.ListViewDrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
i,j, ColPos: Integer;
ColRect : TRect;
Index: Integer;
ColumnStart: Integer;
begin
with ListView do begin
if Item.SubItems[1]='aaa' then begin
Canvas.Font.Color := clRed;
Canvas.Brush.Color := clYellow;
end
else begin
Canvas.Font.Color := clBtnText;
Canvas.Brush.Color := clWindow;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Item.Caption);
ColumnStart := 0;
for Index := 0 to Item.SubItems.Count - 1 do
begin
ColumnStart := ColumnStart + Columns[Index].Width;
Canvas.TextOut(Rect.Left+ColumnStart+1, Rect.Top+1, Item.SubItems[Index]);
end;
if odFocused in State then
begin
if Item.SubItems[1]='aaa' then Canvas.Font.Color := clRed
else Canvas.Font.Color := clWhite;
Canvas.Brush.Color := clHighlight;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Item.Caption);
ColumnStart := 0;
for Index := 0 to Item.SubItems.Count - 1 do
begin
ColumnStart := ColumnStart + Columns[Index].Width;
Canvas.TextOut(Rect.Left+ColumnStart+1, Rect.Top+1, Item.SubItems[Index]);
end;
end;
end;
텍스트가 출력되면서 (TextOut) 배경을 덮어 버리기 때문입니다.
TextOut 바로 위에 ..
Brush.Style := bsClear;
이 구문을 넣어 주시면 글자만 출력이 되서 배경 색을 유지 할 수 있습니다.
물론 문자열 출력후에 Brush.Style := bsSolid 였나. 암튼 원래 모드로
되돌려 주셔야 그 다음 드로잉 작업에 영향이 없습니다.