还是动态创建窗体的闪烁问题,有请各位知道的朋友。(50分)

  • 主题发起人 主题发起人 340340
  • 开始时间 开始时间
3

340340

Unregistered / Unconfirmed
GUEST, unregistred user!
我是这样做的,先在Option中去掉自动创建的所有非主窗体MainFrm的窗体,然后在MainForm的OnCreate事件中写
begin
MyTestFrm1 := TMyTestFrm1.Create(Self);
MyTestFrm1.Parent := MainFrm.PanelMain;
MyTestFrm1.BorderStyle := bsNone;
MyTestFrm1.Align := alClient;

MyTestFrm2 := TMyTestFrm2.Create(Self);
MyTestFrm2.Parent := MainFrm.PanelMain;
MyTestFrm2.BorderStyle := bsNone;
MyTestFrm2.Align := alClient;
……
end;
在主窗体MainFrm的implementation下加Uses语句加入对MyTest1、MyTest2的引用。
但是问题来了,即使在MainFrm的OnCreate事件中加入DoubleBuffered := True;或是PanelMain.DoubleBuffered := True;一样会闪烁,没有任何改善,请问要如何做才能使之不闪烁呢?谢谢~分不多了。。。还望海涵。
 
DoubleBuffered设置了也没用。。。还望知道的朋友帮忙啊,谢谢了。
 
顶到问题解决。。。不好意思了。。
 
不是吧?。。。哪位好心人帮帮忙啊。。。我真的没办法了。。。
 
begin
LockWindowUpdate(Handle);
try
MyTestFrm1 := TMyTestFrm1.Create(Self);
MyTestFrm1.Parent := MainFrm.PanelMain;
MyTestFrm1.BorderStyle := bsNone;
MyTestFrm1.Align := alClient;

MyTestFrm2 := TMyTestFrm2.Create(Self);
MyTestFrm2.Parent := MainFrm.PanelMain;
MyTestFrm2.BorderStyle := bsNone;
MyTestFrm2.Align := alClient;
……
finally
LockWindowUpdate(0);
end;
end;
 
好的,谢谢轻舞肥羊,我试试看,解决了就来散分,还有其它做法吗?搜索了下大富翁离线论坛,似乎锁定不太好(虽然不明白哪不好。。。?)。我现在的做法是不动态创建了,把
MyTestFrm1.Parent := MainFrm.PanelMain;
MyTestFrm1.BorderStyle := bsNone;
MyTestFrm1.Align := alClient;
放到各窗体的创建事件里了。。。但一样会闪烁。。。郁闷。等我试试你的解决方法,再次感谢。
 
你的思路有问题,既然“去掉自动创建的所有非主窗体MainFrm的窗体”,可是又在主窗体的 OnCreate 中一次性创建所有非主窗体MainFrm的窗体,有何必要呢。如果那样的话,还不如全部静态创建。正确做法应该是在需要的时候逐个创建,不需要时及时释放。这样也不会闪烁了。
 
to 轻舞肥羊:
仍然是启动exe就闪烁啊。。。为什么会这样呢。。郁闷
 
to kaida:
一开始我就是以树节点点击触发的方式来的,可依然是点哪个闪哪个。。。都要闪的。。。所以就改成主窗体创建时动态创建所有非主窗体,然后节点点击触发时只需要Visible:=True就行。但是两种做法都会闪烁啊。。。
 
问题还没解决!?
 
to Johnny_du:
对啊,前次那贴你们说的方法都试过来了,还是没解决。。。郁闷哦。。。
 
试试这样:
...
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
...
procedure TForm1.WMPaint(var Message: TWMPaint);
begin
if blRefresh then //blRefresh是是否刷新标志
inherited;
end;
行的话别忘给我加分!呵呵:)
 
blRefresh未描述。。。
 
to 340340:
我做了个简单的DEMO看了一下,象你那样做并不会闪烁啊,我的子窗体创建好之后都是看不见的,只有show的时候才会在Panel里显示出来,主窗体在创建时显示正常,你查看下你的代码,把切换显示子窗体的那部分屏蔽掉看是否还闪烁,看是否是在创建时切换了N个子窗体引起的闪烁。
 
to 楼上,切换那只是Show,闪烁是出现在一开始运行的时候,应该就是在OnCreate时的闪烁。
 
TO 340340:
当然你要自己定义这个Boolean类型的变量了啊!呵呵:)看来楼主都被这个问题给折腾糊涂了...
加载窗体过程中将blRefresh设置为False,加载完毕后设置为True,然后在Show和Update一下应该就可以了。
 
还是会闪。。。天哦。。。晕死,已经照Johnny_du说的做了啊。。。我是在Delphi6下做的
 
呵呵,把代码贴部分出来看看吧,不然帮不上忙。
 
应该不会了啊!?我这是拦截了窗口刷新的底层消息了啊,根本不应该再闪烁了才对!我也是用的Delphi6编译的。
那就这样!你把blRefresh标志停顿一定时间在设置为True,比如500ms
 
那就奇怪了。。。代码我已经贴出来了啊,我就在主窗体MainFrm的OnCreate里那么写的啊!郁闷哦!你们的怎么都没闪烁,我的就有啊?晕死。。。
 
后退
顶部