http://www.delphibbs.com/keylife/iblog_show.asp?xid=25364
控件的Canvas的使用
关键字: Canvas 画布 BOOK II计划
分类: 资料收集
密级: 公开
(评分: , 回复: 0, 阅读: 1389) »»
**********************************************************************************
声明:本模块基本为yzhshi所做,为了富翁Book II 计划整理成一篇Blog
欢迎大家补充
**********************************************************************************
利用Canvas可以实现很多特效,这里仅仅列出在Canvas上更改字体以及背景的方法。
1、DBGrid不同行/单元格显示不同颜色
2、StatusBar上面字体的颜色显示
3、StringGrid中文字右对齐
4、ListBox改变字体颜色
5、ComboBox显示字体列表,同时各字体名称使用其本身来显示
6、TreeView改变字体颜色
==========================================
1、DBGrid不同行/单元格显示不同颜色(注释掉的部分为显示前景颜色)
procedure TForm1.DBGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
{
if Query1.FieldByName('Col1').AsString <> '' then
if (gdSelected in State) and (DBGrid1.Focused = True) then
DBGrid1.Canvas.Font.Color := clWhite
else
DBGrid1.Canvas.Font.Color := clTeal;
}
if query1.FieldByName('Col1').AsString <> '' then
dbgrid1.Canvas.Brush.Color := $00E0FFFF
else
dbgrid1.Canvas.Brush.Color := clWhite;
if gdSelected in State then
begin
dbgrid1.Canvas.Brush.Color := clNavy;
dbgrid1.Canvas.Font.Color := clWhite;
end;
dbgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
==========================================
2、StatusBar上面字体的颜色显示
StatusBar1的每一个TStatusPanel的Style为psOwnerDraw,然后在OnDrawPanel中写代码自己写画布
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
case Panel.ID of
0: StatusBar.Canvas.Font.Color := clred;
1: StatusBar.Canvas.Font.Color := clBlue;
2: StatusBar.Canvas.Font.Color := ClYellow;
end;
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Panel.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StatusBar1.Panels[0].Text := 'aaaaaaaaaa';
StatusBar1.Panels[1].Text := 'aaaaaaaaaa';
StatusBar1.Panels[2].Text := 'aaaaaaaaaa';
end;
==========================================
3、StringGrid中文字右对齐
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
l_Left, l_Top: Integer;
begin
l_Left := (StringGrid1.Colwidths[ACol] - StringGrid1.Canvas.Textwidth(StringGrid1.Cells[ACol, ARow]) - 2); //右对齐
l_Top := (StringGrid1.Rowheights[ARow] - StringGrid1.Canvas.Textheight(StringGrid1.Cells[ACol, ARow])) div 2;
StringGrid1.Canvas.Textrect(Rect, Rect.Left + l_Left, Rect.Top + l_Top, StringGrid1.Cells[ACol, ARow]);
end;
=========================================
4、ListBox改变字体颜色
设置ListBox的ListBox1.Style := lbOwnerDrawVariable;
然后在他的OnDrawItem中写代码:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
if Index = 1 then
ListBox1.Canvas.Font.Style := [fsBold];
ListBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;
==========================================
5、ComboBox显示字体列表,同时各字体名称使用其本身来显示
Style设成csOwnerDrawFixed
FormOnShow:
for i := 0 to Screen.Fonts.Count - 1 do
ComboBox1.Items.Add(Screen.Fonts[i]);
ComboBox1OnDrawItem:
ComboBox1.Canvas.Font.Name := Screen.Fonts[Index];
ComboBox1.Canvas.FillRect(Rect);
ComboBox1.Canvas.TextOut(Rect.Left, Rect.Top, Screen.Fonts[Index]);
==========================================
6、TreeView改变字体颜色
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
var
NodeRect: TRect;
p: integer;
s: string;
begin
DefaultDraw := False;
with TreeView1.Canvas do
begin
NodeRect := Node.DisplayRect(True);
p := Pos(' ', Node.Text);
if p > 0 then
begin
if cdsSelected in State then
begin
SetTextColor(Handle, clWhite);
TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
end
else
begin
s := Copy(Node.Text, 1, p);
SetTextColor(Handle, clBlue);
TextOut(NodeRect.Left, NodeRect.Top, s);
SetTextColor(Handle, clRed);
TextOut(NodeRect.Left + TextWidth(s), NodeRect.Top, Copy(Node.Text, p + 1, Length(Node.Text) - p));
end
end
else
TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
end;
end;
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
const
deltaX = 2;
deltaY = 1;
var
NodeRect: TRect;
p: integer;
s: string;
begin
//DefaultDraw := False;
if Stage <> cdPostPaint then exit;
with TreeView1.Canvas do
begin
NodeRect := Node.DisplayRect(True);
p := Pos(' ',Node.Text);
if p>0 then
begin
s := Copy(Node.Text,1,p);
SetTextColor(Handle,clBlue);
TextOut(NodeRect.Left + deltaX, NodeRect.Top + deltaY, s);
SetTextColor(Handle,clRed);
TextOut(NodeRect.Left + deltaX + TextWidth(s), NodeRect.Top + deltaY, Copy(Node.Text,p+1,Length(Node.Text)-p));
end;
end;
end;