自定义组件画图残影问题

银点 2012-09-10 10:47:16
我有一个自定义的组件,背景是透明的,在组件上用TPicture画一个幅含alpha通过的Png图片。
组件有一个drawstyle属性,值可为Normal、Stretch、和Tile三种。
我在DrawStyle属性的SetDrawStyle方法最后调用了,Repaint方法。可是在切换DrawStyle属性值是,会有图片残影,非得用鼠标点一下组件,才正常,该怎么解决?
下边是Paint方法代码:

void __fastcall TJTImagePanel::Paint()
{

//画图片
if(FPicture->Graphic != NULL)
{
//FPicture->Graphic->
if(FDrawStyle == jtStretch)
Canvas->StretchDraw(ClientRect,FPicture->Graphic);
else if(FDrawStyle == jtTile)
TileDraw(Canvas,FPicture,ClientRect);
else
Canvas->Draw(0,0,FPicture->Graphic);
}
//画文字
int FontHeight;
int Flags;

TRect Rect = GetClientRect();
if (Fborder || ComponentState.Contains(csDesigning))
{
Canvas->Brush->Color = clBtnShadow;
Canvas->FrameRect(Rect);
}
Canvas->Brush->Style = bsClear;
Canvas->Font = Font;
FontHeight = Canvas->TextHeight('W');
Rect.Top = ((Rect.Bottom + Rect.Top) - FontHeight) / 2;
Rect.Bottom = Rect.Top + FontHeight;

Flags = DT_EXPANDTABS | DT_VCENTER | DT_CENTER;
Flags = DrawTextBiDiModeFlags(Flags);
DrawText(Canvas->Handle, Caption.t_str(), -1, &Rect, Flags);


TCustomControl:: Paint();
}
void __fastcall TJTImagePanel::SetDrawStyle(const TJTDrawStyle style)
{
FDrawStyle = style;

Repaint();


}
...全文
198 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘中人 2012-09-10
  • 打赏
  • 举报
回复

Canvas->Brush->Style =bsClear;
Canvas->FillRect(Rect );
画之前,填充一下试试

银点 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

将 Repaint() 换成 Invalidate() 试试。
[/Quote]

在发贴之前试过了,也不行。
缘中人 2012-09-10
  • 打赏
  • 举报
回复
画之前,先填充一下试试

Canvas->Brush->Style =bsClear;
Canvas->FillRect(Rect)
ccrun.com 2012-09-10
  • 打赏
  • 举报
回复
将 Repaint() 换成 Invalidate() 试试。
银点 2012-09-10
  • 打赏
  • 举报
回复
搞定。强制该组件的父窗口Repaint一下即可。
银点 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

C/C++ code

Canvas->Brush->Style =bsClear;
Canvas->FillRect(Rect );

画之前,填充一下试试
[/Quote]

如果不指定画笔颜色,没有效果,但是指定了画笔颜色,我的背景透明就没了

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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