可以设置背景图的DBGrid做出来了,但是还有问题.eYes兄在吗?(30分)

  • 主题发起人 主题发起人 popeye
  • 开始时间 开始时间
P

popeye

Unregistered / Unconfirmed
GUEST, unregistred user!
设置背景图的功能实现了,用重载paint方法.但是还有问题,
按PageUp,PageDown上下翻页时正常,按向下箭头逐条滚动时
网格的记录依次向上移动,恢复改掉原来的背景.反向亦然.
如果重载Scroll方法,
procedure TImageDBGrid.Scroll(Distance);
begin
inherited Scroll(Distance);
refresh;
end;
这样倒是可以解决滚动时的问题,可是闪烁感又太强.我试图把
TCustomDBGrid的Scroll过程的内容copy到重载的Scroll中,
但向上滚动时会滚进标题条,向下只能到倒数第二行.它是用
ScrollWindowEx这个api把下一行滚动到上一行的.
我现在没有办法了,向各位大虾请教.特别是Another_eYes兄.
分数我一再前面关于这个问题的提问中给了100分,至今无人回答
斑竹还给我好吗?那位大虾的建议可行,做出来后免费奉送
ImageDBGrid.
 
改refresh 为Invalidate或update.(刷新局部)
 
在原来的scroll中用的就是invalidate,我把原来的拷过来改了一下,为什么
我重载scroll中ftitleoffset,findicatoroffset都等于0?导致重载后滚动
向上错了一位,强行改为1后正常,可是原来的等于零就没问题.
去掉scrollwindowex后,加大invalidate的区域滚动问题也解决了.现在剩下
水平方向上的滚动,并不调用scroll过程,谁知道它调用哪个过程处理水平方向
上滚动时的重绘?
 
会不会与窗口刷新速度不一样?
 
重绘会调用以下几个virtual方法, 愿意的话你可以重载, 按调用顺序:
procedure TWinControl.paintwindow(dc: HDC);
virtual;
// 重画背景
(子control)
function TWinControl.GetClientRect: TRect;
virtual // 获取clientrect 包括clientheight, clientwidth
procedure TWinControl.AdjustClientRect(var Rect: TRect);
virtual // 调整client区域: 用于计算align
procedure TWinControl.AlignControls(AControl;
var Rect: TRect);
virtual// 调整AControl中所有control的位置
procedure TCustomControl.Paint;
virtual // 不是所有控件都有该方法.
 
我觉得做个有背景的wincontrol很容易的. 做两件事:
1. 自己写个WM_PAINT消息处理过程(不要inherited原来的).
2. 截断WM_ERASEBKGND消息.
procedure TMyWinControl.WMEraseBkgnd(var Message: TMessage);
begin
Message.Result := 1;
end;

procedure TMYWinControl.WMPaint(var Message: TWMPaint);
var
dc: HDC;
ps: TPaintStruct;
begin
if Message.DC <> 0 then
dc := Message.DC
else
dc := begin
Paint(Handle, ps);
bitblt(dc, 0, 0, clientwidth, clientheight, 背景图.canvas.handle, 0, 0, SRCCOPY);
setBkMode(DC, Windows.TRANSPARENT);
painthandler(Message);
if message.DC = 0 then
EndPaint(Handle, ps);
end;
 
刷新虽然有些闪烁感,还可以忍受.垂直滚动正常了,如果网格宽度小于
字段的总宽度,会有水平滚动条,这时水平滚动的重绘就会出现部分图像
被覆盖,背景图像不正常.水平滚动时重绘用的是哪个过程?
 
滚动时delphi调用TControl.Scrollby(x, y);
 
Scrollby不是一个虚函数,不能重载.左右滚动时,它也使用scrollwindow(...)
来使DBGrid画布上的内容水平滚动DeltaX,其余部分重绘.怎样才能让他左右滚动后重绘整个客户区域,或者就不要滚动?我真的没有办法.!! :-((
 
多人接受答案了。
 
后退
顶部