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

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

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

由于我在设计某个功能的组件,
不能直接使用 TLabel,
而必须使用类似TCanvas画出文字,
我要使用什么技巧(技朮),
才能在某一个背景有图的地方输出文字而不破坏背景﹖
...全文
132 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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(......

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧