【求助】关于DBCtrlGrid控件在双缓冲模式下循环WM_PAINT的问题

fantasy51 2017-03-01 10:10:42
本人在做一个项目,需要使用到双缓冲模式,大家应该知道,双缓冲模式本身是为了避免大量控件重绘时闪烁而使用的,使用此模式确实解决了控件绘制时的闪烁问题,但有一个控件似乎与此模式有冲突,就是delphi自带的DBCtrlGrid控件。
DBCtrlGrid是一款数据库控件,可以将数据以Panel面板的形式展现出来。但此控件在双缓冲模式下,一旦加载数据(动态绘制Panel)后,整屏控件就会不断闪烁。
经过跟踪控件源代码,发现procedure TDBCtrlGrid.WMEraseBkgnd(var Message: TMessage);、procedure TDBCtrlGrid.WMPaint(var Message: TWMPaint);这两个函数不断被调用,推测是Windows不断发送重绘消息,然后擦除背景和绘制的函数就一直被调用。研究了很长时间,没有找到根源所在,据网上有资料说是Windows不断发送重绘消息一般是由于调用了begin paint没有end paint导致,但delphi自带控件应该不会犯这么低级的错误吧...从Delphi7到最新的XE10,都是这个问题。
以下是Demo代码:放置了数据库ado控件,然后dbctrl1的数据源配好,在其panel上放一个TDBText控件展示数据,btn1Click写入调用sql语句,Form上再放置一个TImage图片,以便闪烁问题能够清晰的展现。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, dbcgrids, DB, ADODB, DBCtrls, ExtCtrls,
pngimage;

type
TForm1 = class(TForm)
ds1: TDataSource;
qry1: TADOQuery;
con1: TADOConnection;
dbctrl1: TDBCtrlGrid;
dbtxt1: TDBText;
btn1: TButton;
img1: TImage;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Self.Handle, GWL_EXSTYLE, GetWindowLong(Self.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED); //启用双缓冲
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
with qry1 do
begin
Close;
SQL.Clear;
SQL.Add('select top 10 * from goods');
Open;
end;
end;




运行结果是:点击btn1,dbctrl1加载了数据并动态生成panel,当点击第二个panel时,整屏控件就不断闪烁。



求各路大神指点...小弟不胜感激!
...全文
1051 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
santiaodahan 2017-03-07
  • 打赏
  • 举报
回复
这恐怕不是DBCtrlGrid的问题,而是Windows的问题,其他语言也有类似情况。WS_EX_COMPOSITED扩展样式强制改变界面绘制顺序,能解决闪烁问题,但有严重的副作用。比如一个空窗体,在经典主题下非客户区的图标点击动画效果消失。最大化窗体重绘有问题,CPU使用率特别高,和DWM不兼容等。你也可以尝试用FMX库的界面组件或设置DoubleBuffered属性。 窗体和DBCtrlGrid控件都有DoubleBuffered属性,可以设为True试试。这是和WS_EX_COMPOSITED不同的一种组件级别的双缓冲方案,它是先把控件画在内存位图中,再拷贝到窗口上来防闪烁的。

1,183

社区成员

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

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