在解决fsMDIChild窗口"闪"的问题后,又出现主窗口镂空(锁定过程中)的问题
解决"闪"的过程如下:
procedure MDIChildshow(FrmName: string;Frmmain: TForm; mForm: TForm;fForm: TFormClass;App: TApplication);
begin
Frmmain.Perform(WM_SETREDRAW,0,0);
if Application.FindComponent(FrmName)=nil then
try
App.CreateForm(fForm,mForm);
except
showmessage(FrmName+'创建不成功!');
end;
mForm.Show;
Frmmain.Perform(WM_SETREDRAW,1,0);
RedrawWindow(Frmmain.Handle,nil,0,RDW_FRAME+RDW_INVALIDATE+RDW_ALLCHILDREN+RDW_NOINTERNALPAINT);
end;
解决"闪"的过程如下:
procedure MDIChildshow(FrmName: string;Frmmain: TForm; mForm: TForm;fForm: TFormClass;App: TApplication);
begin
Frmmain.Perform(WM_SETREDRAW,0,0);
if Application.FindComponent(FrmName)=nil then
try
App.CreateForm(fForm,mForm);
except
showmessage(FrmName+'创建不成功!');
end;
mForm.Show;
Frmmain.Perform(WM_SETREDRAW,1,0);
RedrawWindow(Frmmain.Handle,nil,0,RDW_FRAME+RDW_INVALIDATE+RDW_ALLCHILDREN+RDW_NOINTERNALPAINT);
end;
解决方案 »
- delphi 写的dll 和java交互 问题
- 请各位高手帮忙解决一上,我用DBGRID,1,2列输完之后,怎么在第三列中马上显示出第一列*第二列的值呀!
- 在电脑上装了一个输入设备,类型于健盘一样的东西,不过只有一个健,现在我想当按
- 救命啊!!! IWMenu的下拉单怎么被form上的IWComboBox覆盖掉了!!!!
- 怎么样才能把键盘上的3个电源功能键的功能屏蔽掉啊?
- Delphi拨号上网的例子?
- Socket错误问题
- 今天收到一北京律师事务所的来信,要求对我的软件进行版权登记保护,大家认为有必要吗?
- 急!!怎么在一个窗口,给另一个窗口的控件通过SENDMESSAGE发送信息?
- 为什么我新映射了驱动器后,drivecombobox1没有显示出来!除非重新关掉应用程序然后打开才有用!drivecombobox1.refresh没有作用!!实际上已经映射了!为什么drivecombobox1不刷新!!
- 帮忙翻译下列oracle查询语句为一般的sql语句并顺便解释下
- 如何用程序关闭WebBrowser中的网页(javascript)弹出的对话框
这是一个通用函数,我们公司的代码就是这样写的,它就不闪烁,而我做的这个例子就会出现这种情况,很迷惑!有没有碰到这个问题并解决的高人
procedure RunMDIChild( MDIChildFormClass: TFormClass ;var Reference);
var
MDIChildForm: TForm;
i:Integer;
begin
with Application.MainForm do
begin
for i:=0 to MDIChildCount-1 do
begin
//假如所调用的窗体存在,显示该窗体
if MDIChildren[i].ClassType = MDIChildFormClass then
begin
RestoreWindow(MDIChildren[i].Handle);//API IT 者
Exit;
end;
end;
try
LockWindowUpdate(GetDeskTopWindow);//锁定屏幕,API
Application.CreateForm(MDIChildFormClass,Reference);//创建子窗体
finally
Screen.Cursor:=crDefault;
end;
try
LockWindowUpdate(GetDeskTopWindow);//锁定屏幕
MDIChildForm:=TForm(Reference);
MainForm.AddToWindowList(MDIChildForm);//不用管这行代码
MDIChildForm.WindowState:= wsMaximized;
finally
LockWindowUpdate(0);//解除锁定API
end;
end;
end;
网友回复:LockWindowUpdate似乎是指,锁定屏幕的数据刷新,并不是屏幕的图形不刷新
网友回复://先禁止客户区更新,隐藏子窗口创建和显示细节,然后一次性更新客户区及其所有子窗口 www.itzhe.cn
SendMessage(ClientHandle,WM_SETREDRAW,0,0);
……//创建窗口代码
SendMessage(ClientHandle,WM_SETREDRAW,1,0);
ReDrawWindow(ClientHandle,nil,0,RDW_INVALIDATE or RDW_ALLCHILDREN); 网友回复: 问题是我们公司的产品系统架构就是这样写的,却一点都不会发生闪烁,假如非要用ockWindowUpdate,问题出在哪里?
网友回复:LockWindowUpdate不但闪烁,而且有可能引起桌面闪烁。因为LockWindowUpdate并不忽略消息,只是暂时不响应,所以有可能积聚多个重画消息,并在使用LockWindowUpdate(0)之后依次响应。
而使用SendMessage(ClientHandle,WM_SETREDRAW,0,0)之后,控件根本不接收重画消息,除非使用SendMessage(ClientHandle,WM_SETREDRAW,1,0)之后; LockWindowUpdate的意思是暂时禁止某控件或窗口所在的区域更新(这个区域可能有多个窗口),LockWindowUpdate(0)的意思是有更新消息就更新屏幕上所有该更新的窗口吧。所以LockWindowUpdate(0)之后,若此前有重画消息积聚,会马上重画。所以使用LockWindowUpdate会在不同的时候有不同的表现,比如屏幕上窗口多少、堆放情况等等,所以有时不闪有时却闪个不停。
itzhe.cn
SendMessage(ClientHandle,WM_SETREDRAW,0,0)的意思是不接收任何重画消息;
SendMessage(ClientHandle,WM_SETREDRAW,1,0)的意思是可以接收并响应重画消息了,但并不立即重画,所以必须附加 ReDrawWindow(ClientHandle,nil,0,RDW_INVALIDATE or RDW_ALLCHILDREN);
本篇文章来源于 www.itzhe.cn 原文链接:http://www.itzhe.cn/html/Programme/Delphi/20071121/20934.html
HWND hWnd, // handle to window
CONST RECT *lprcUpdate, // 指定这个矩形区域
HRGN hrgnUpdate, // handle to update region
UINT flags // 重画的一些选项,你看MSDN上面吧,讲得很清楚CONST RECT *lprcUpdate, //不用说了就是你要更新的矩形区域 第四个参数简单说下:
RDW_ERASE 擦除背景
RDW_FRAME 如果你的矩形包括了非客户区,会更新客户区即常用的nc消息
RDW_INTERNALPAINT 会强迫触发WM_PAINT消息,会走到OnPaint函数里如果你写了
RDW_INVALIDATE 如果你只是想更新部分区域,用这个参数,否则就会全都更新了,会闪的。
RDW_ALLCHILDREN 包括子窗口。
还有就是RDW_NOXXXX的和上面的意思基本相反。