如何在某一个背景有图的地方输出文字而不破坏背景?

pascal_lee_tw 2004-12-24 08:04:51
我要在一个背景有图的地方输出文字,
若是使用 Canvas.TextOut 来输出文字,
则在输出周围会有一个方形区域被Canvas.Brush的颜色遮盖掉。

但是如果使用 TLabel,
并且设定 Transparent:=True,
则不会有这个问题。

由于我在设计某个功能的组件,
不能直接使用 TLabel,
而必须使用类似TCanvas画出文字,
我要使用什么技巧(技朮),
才能在某一个背景有图的地方输出文字而不破坏背景﹖
...全文
69 点赞 收藏 9
写回复
9 条回复
xiaoxiao197821 2004年12月25日
一楼正确
回复 点赞
wfhlxl 2004年12月25日
with canvas do
begin
brush.style:=bsclear;
font.color:=youwantcolor;
texout...
end;
回复 点赞
Iamfish 2004年12月25日
楼上都说了.

Canvas.Brush.Style := bsClear;
回复 点赞
constantine 2004年12月25日
一句就可以了
Canvas.Brush.Style := bsClear;
回复 点赞
XuDunYu 2004年12月25日
procedure TCustomLabel.DoDrawText(var Rect: TRect; Flags: Longint);
var
Text: string;
begin
Text := GetLabelText;
if (Flags and DT_CALCRECT <> 0) and ((Text = '') or FShowAccelChar and
(Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' ';
if not FShowAccelChar then Flags := Flags or DT_NOPREFIX;
Flags := DrawTextBiDiModeFlags(Flags);
Canvas.Font := Font;
if not Enabled then
begin
OffsetRect(Rect, 1, 1);
Canvas.Font.Color := clBtnHighlight;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
OffsetRect(Rect, -1, -1);
Canvas.Font.Color := clBtnShadow;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
end
else
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
end;
回复 点赞
XuDunYu 2004年12月25日
1给你一段TcustomLabel的paint源码

procedure TCustomLabel.Paint;
const
Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
var
Rect, CalcRect: TRect;
DrawStyle: Longint;
begin
with Canvas do
begin
if not Transparent then
begin
Brush.Color := Self.Color;
Brush.Style := bsSolid;
FillRect(ClientRect);
end;
Brush.Style := bsClear;
Rect := ClientRect;
{ DoDrawText takes care of BiDi alignments }
DrawStyle := DT_EXPANDTABS or WordWraps[FWordWrap] or Alignments[FAlignment];
{ Calculate vertical layout }
if FLayout <> tlTop then
begin
CalcRect := Rect;
DoDrawText(CalcRect, DrawStyle or DT_CALCRECT);
if FLayout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom)
else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
end;
DoDrawText(Rect, DrawStyle);
end;
end;
回复 点赞
nyf1220 2004年12月24日
由于我在设计某个功能的组件,
不能直接使用 TLabel,

那你可以动态的创建啊
回复 点赞
zdq801104 2004年12月24日
我觉得你要的这个功能很难实现,看看高手怎么解决,只能帮你UP了
回复 点赞
nhconch 2004年12月24日
Canvas.Brush.Style := bsClear;
Canvas.TextOut(......
回复 点赞
发动态
发帖子
GAME,图形处理/多媒体
创建于2007-08-02

644

社区成员

1.4w+

社区内容

Delphi GAME,图形处理/多媒体
社区公告
暂无公告