在使用MDI技术的软件中,这样使主程序调用mdiChild窗体时,闪烁不至于那么厉害? ( 积分: 100 )

  • 主题发起人 主题发起人 ypluo
  • 开始时间 开始时间
Y

ypluo

Unregistered / Unconfirmed
GUEST, unregistred user!
我的mdiChild窗体在生成前都是fsNormal窗体,并且不可见,我一般都在MdiChild内部设置formStyle,根据需要改为mdiChild。这样在主程序调用时,闪烁很厉害。谁有解决方法?
 
我的mdiChild窗体在生成前都是fsNormal窗体,并且不可见,我一般都在MdiChild内部设置formStyle,根据需要改为mdiChild。这样在主程序调用时,闪烁很厉害。谁有解决方法?
 
一, 在LOADED的时候更改FORMSTYLE
二, 用LockWindowsUpdate API
 
闪烁是因为操作系统设定的动画效果
 
有 N 个人问过这个问题了,我想解决它的根本办法是先关闭系统的动画效果,处理完后再开启,至于 LockWindowsUpdate,是以讹传讹、没有效果。
//得到当前系统是否设定为动画显示
function GetAnimation: Boolean;
var
Info: tagANIMATIONINFO;
begin
Info.cbSize := SizeOf(tagANIMATIONINFO);
if SystemParametersInfo(SPI_GETANIMATION, SizeOf(Info), @Info, 0) then
Result := Info.iMinAnimate <> 0
else
Result := False;
end;
//设定当前系统的动画显示效果
procedure SetAnimation(const Value: Boolean);
var
Info: tagANIMATIONINFO;
begin
Info.cbSize := SizeOf(tagANIMATIONINFO);
LongBool(Info.iMinAnimate) := Value;
SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;

var
Animation: Boolean;
begin
Animation := GetAnimation;
if Animation then
SetAnimation(False);
try
你的调用子窗体的过程...
finally
if Animation then
SetAnimation(True);
end;
end;
 
vvyang的方法不错, LockWindowsUpdate(0)常常会刷新桌面图标,根本不是个办法,但论坛有人最先提了出来,然后很多人在抄, 没有人去搞清楚这是操作系统设定的动画效果
 
vvyang的方法也不行啊。在创建MDIChild时,创建后是一个正常模式的form,
当设为mdichild并windowstate设为最大时,就有一个比较明显的闪烁
 
你把这部分代码都写到try...finally...里了么?
或者你干脆用 SetAnimation(False) 把系统的动画效果关掉,再试试你的程序,如果这样也闪的话那我也没辙了 - _-
 
“我也没辙了”这句太精了,如果楼主愿意把代码贴出来,有空就来跟一下
 
在vvyang兄的基础上,再设置窗口(主窗口、子窗口)为双缓冲。
form1.DoubleBuffer := true;
 
后退
顶部