如何实现移动窗体不抖动?(100分)

  • 主题发起人 枫之叶
  • 开始时间

枫之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现窗体从右到左移动,我用一个Timer去控制Form的Left,但是当我移动时,窗体会发生
抖动闪烁现象,请问如何解决?
 
你每次移动大点,比如12,移动间隔小一点
 
procedure FormCreate(Sender: TObject);
procedure AppMessage(var Msg: TMsg;var Handled: Boolean);

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=AppMessage;
end;procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_LButtonDown then
begin
if DefWindowProc(Panel2.Handle,WM_NCHitTest,0,GetMessagePos)=HTClient then
begin
SendMessage(Handle,WM_NCLButtonDown,HTCaption,GetMessagePos);
Handled:=true;
end;
end;
end;
 
不行,因为这样会造成移动的时候不是平滑移动,而是跳跃移动.
 
注意的是Timer1.interval不能小于50, 一般设在100以上.
看http://www.delphibbs.com/delphibbs/dispq.asp?lid=224991有些参考价值
 
我的程序是这样的
Timer.interval:=30;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Left:=Form1.Width;//初始化Form在最右边
end;
procedure TForm1.TimerTimer(Sender: TObject);
begin
if Form1.Left>0 then
begin
Form1.Left:=Form1.Left-1;
end
else
begin
Timer.Enabled:=False;
end;
end;
现在问题是在OnTimer中Form.Left每次只能减1,不然会出现跳跃现象,并且Timer.interval不能
大于100,因为我要保证移动的速度够快,但是这样会造成在移动过程中,屏幕会一直闪烁,不知
各位大侠有什么办法解决.如果分不够,我可以再加.
 
我实验了一下,没有你说的抖动现象。我是每次移动一点,Timer.interval设的是10。
不同的是我的窗体上有一个IMAGE,BorderStyle设为bsNone.
 
应该向窗体Post鼠标在标题栏拖动的消息来实现窗体的移动
具体为:发送鼠标在标题栏按下的消息,发送鼠标拖动的消息,发送鼠标起来的消息。

相关的消息TWMNCHitTest,具体的应用在"不在标题栏拖动窗口"等文章中都有的,
或者自己用WinSight跟踪一下。
 
我试了你的代码,一点都不闪烁,我还特地在form上放了很多控件,平滑得很,是不是你
的机器太慢了?我的是P4 1.6G的,呵呵。
 
或者你把系统中的“拖动时显示窗口内容”选项去掉再试试。
 
主要是这样的,我的窗体的形状是一串文字的形状,而不是正规的窗体,我的程序是根据文本的
内容而改变窗体的形状,也就是当程序运行起来时,你看上去是一串文字.
 
应该是机器太慢了吧?我也这样试过,但是我最后只有让他每次移动只有1,时间间隔设置
为100-200之内,还可以。
不过,记得以前好象别人有说过是窗体重画方式,我没有试过,不知道效果。
-------------------------------------------------------------------
-----------------------------------------------------------------
-----------------------------------------------------------------
那应该没有问题吧,我的机器还是c366,内存196,显存32的,效果还可以,
没有明显的抖动呀。
 
我的配置是
CPU:pIII450MHZ
RAM:128M
显存:8M
应该可以吧!
 
顶部