怎么刷新自定义Panel中的子控件

kingeboy 2009-06-23 01:16:41
我自定义了一个继承至TCustomControl 的Panel控件,并添加了两个属性ColorBegin和ColorEnd来做Panel 的颜色过渡填充,但当我改变颜色值后Panel控件重绘正常,但是Panel中的子控件并不知父控件已经重绘,所以没办法正常重绘背景.
我试了用C++ Builder6自带的TPanel改变其Color属性后会导致子控件重绘,查看了VCL的源码后知道TPanel的Color属性是继承了TControl的Color的属性,在TControl的SetColor函数中调用了Perform(CM_COLORCHANGED, 0, 0);导致控件重绘,而我自己添加了此行代码后控件却仍然不能导致子控件重绘,该怎么办啊??

void __fastcall TColorPanel::SetPanelBeginColor(TColor Value)
{
if(m_clPnlColorBegin != Value)
{
m_clPnlColorBegin = Value;
Perform(CM_COLORCHANGED, 0, 0);
}
}

VCL的原代码

procedure TControl.SetColor(Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
FParentColor := False;
Perform(CM_COLORCHANGED, 0, 0);
end;
end;
procedure TControl.CMColorChanged(var Message: TMessage);
begin
Invalidate;
end;
...全文
173 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mazhichao84 2010-06-03
  • 打赏
  • 举报
回复
学习学习...
padiu01 2009-06-24
  • 打赏
  • 举报
回复
嗯。。。
那就来接分好了
yefu2000 2009-06-24
  • 打赏
  • 举报
回复
这个分要接。。。
fairchild811 2009-06-23
  • 打赏
  • 举报
回复
学习,接分
hemiya 2009-06-23
  • 打赏
  • 举报
回复
学习
wg961423 2009-06-23
  • 打赏
  • 举报
回复
自问自答的习惯很好啊!接分。
ccrun.com 2009-06-23
  • 打赏
  • 举报
回复
楼主可以啊,自问自答,还挺详细的。喜欢混水摸鱼的,赶紧来接分吧。
kingeboy 2009-06-23
  • 打赏
  • 举报
回复
解决办法:(替换上面说的方法)
在需要刷新子控件的时候使用

Perform(CM_COLORCHANGED, 0, 0);

在自定义控件里面映射消息

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_COLORCHANGED,TMessage ,WMDoColorChanged);
END_MESSAGE_MAP(TCustomControl)
//处理CM_COLORCHANGED事件
MESSAGE void __fastcall WMDoColorChanged(TMessage &Msg)
{
Repaint(); //重绘自己(不是必须)
Broadcast(&Msg);//这里是关键,吧消息广播出去
};
kingeboy 2009-06-23
  • 打赏
  • 举报
回复
问题又来了,使用上面的代码后只能导致第一个子控件更新,真是晕!!!

TControl::Color属性的设置函数却不存在这个问题

问题继续讨论
kingeboy 2009-06-23
  • 打赏
  • 举报
回复
自己搞定,在要刷新的地方用

TMessage msg;
msg.Msg = CM_COLORCHANGED;
msg.WParam = 0;
msg.LParam = 0;
Broadcast(&msg);

就可以了

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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