ToolBar的闪烁问题,很奇怪,实在没辙了,高分求教

csdn_tw 2006-03-13 05:08:05
有一个ToolBar,在其上放置两个ToolButton,将ToolBar的Flat属性设为true,在OnCustomDrawButton事件中有如下代码:

TPoint P;
GetCursorPos(&P);

if(PtInRect(&(Button->BoundsRect),ToolBar->ScreenToClient(P)))
Sender->Canvas->Brush->Color=clRed;
else
Sender->Canvas->Brush->Color=clBtnFace;

Sender->Canvas->FillRect(Button->BoundsRect);

DefaultDraw=false;

大致就是这样子,目的是当鼠标在ToolBar上移动时,因为Flat属性设为true,会引发OnCustomDrawButton事件,在事件句柄中判断鼠标位置,以此改变按钮颜色,即当鼠标移到按钮上时,用红色填充按钮框,移开时用clBtnFace填充.

现在的问题是:当鼠标移动时,两种颜色的交替变换时,总会有闪烁,尤其在配置低的机器上,可以看见有一个白色的填充区域一闪而过,也就是说在黄色和灰色变换时,不是直接变换,中间有一个步骤是用白色填充了一次,从而造成闪烁.我试了许多方法,包括响应WM_ERASEBKGND消息都不能解决,好像画刷的背景色始终是白色.各位有何高见,帮我指点指点,不胜感激

...全文
350 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueDeepOcean 2006-04-11
  • 打赏
  • 举报
回复
我重申以下,由于以下原因可以形成ToolBar中的按钮图片的闪烁:
1、重画(这种情况我没有试验过,因此此条我只能根据楼主的描述提出);
2、手动处理诸如(OnStartDock()、OnGetSiteInfo()、OnDockOver、和OnDockDrop()以及OnEndDock()事件时);
3、其他的手动处理(诸如CustomDrawButton())事件。

建议楼主自己仔细检查上述事件的处理并进行代码跟踪。
3996906 2006-04-07
  • 打赏
  • 举报
回复
怪事到处有啊。。。
UFOBH 2006-04-07
  • 打赏
  • 举报
回复
系统问题
tianshu888 2006-04-07
  • 打赏
  • 举报
回复
在我的机器上两种方法都没有闪烁。
constantine 2006-04-07
  • 打赏
  • 举报
回复
一般用控件的状态判断就行了,没有见过闪烁的
我不懂电脑 2006-04-07
  • 打赏
  • 举报
回复
在我的机器上老妖和搂主的两种方法都没有闪烁。
BlueDeepOcean 2006-04-07
  • 打赏
  • 举报
回复
对,老妖说的对!
ccrun.com 2006-03-14
  • 打赏
  • 举报
回复
楼主的代码需要改进一下:
void __fastcall TForm1::ToolBar1CustomDrawButton(TToolBar *Sender,
TToolButton *Button, TCustomDrawState State, bool &DefaultDraw)
{
Sender->Canvas->Brush->Color = State.Contains(cdsHot)? clRed: clBtnFace;
Sender->Canvas->FillRect(Button->BoundsRect);
DefaultDraw = false;
}
csdn_tw 2006-03-14
  • 打赏
  • 举报
回复
Form和ToolBar都加了,不管用.还有什么其他意见,着急呀
ssyqcwj 2006-03-13
  • 打赏
  • 举报
回复
对,打开双缓冲试试!
seeyou1997 2006-03-13
  • 打赏
  • 举报
回复
ToolBar->DoubleBuffered=true,试一试!!

13,824

社区成员

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

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