怎样避免窗体在最大化过程中发生的闪烁现象?(详见内容) (200分)

那么在WM_WINDOWPOSCHANGED里锁屏幕吧。
 
最大化时设背景透明呢!!!!!!!!
我天天用 Editplus 也感觉不出来。

你是不是在窗口上只放一个 TMemo ,并设 align=alClient
好象效果还可以的。
 
有没有试过我的Forms单元修改版呢?
如果试过,给点意见

http://www.playicq.com/dispdoc.php?t=&id=2156

 
问题解决了!!!答案非常简单,说出来真不怕大家笑话 :) 说实在的,我发现我就是个无聊啊! :-(
之所以会出现闪烁,其实都是“Align := alClient”惹的祸 :)
原来,我一直认为在窗体将要最大化之前锁屏幕,最大化完成以后再解锁屏幕,就可以解决问题了。从而
误导了大家,使大家都向着这方面冥思苦想,真是罪过啊!

下面,我做一个简单的例子,大家看了就明白了
新建一工程,在Form1上放置一Panel控件,在Panel中放置一Memo控件,下面是代码
--------------------------------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WM_SIZE(var Msg: TMessage); message WM_SIZE;
procedure WMSysCommand(var Msg: TMessage); Message WM_SYSCOMMAND;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
if Msg.WParam = SC_MAXIMIZE then
begin
LockWindowUpdate(Handle);
Panel1.Align := alNone;
Memo1.Align := alNone;
end;
inherited;
end;

procedure TForm1.WM_SIZE(var Msg: TMessage);
begin
if Msg.WParam = SIZE_MAXIMIZED then
begin
Panel1.Align := alClient;
Memo1.Align := alClient;
LockWindowUpdate(0);
end;
inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.Align := alClient;
Panel1.Color := clGray; //这样做是为了能看清楚一些,这还仅仅是一个小例子,如果Form上控件
//众多,则闪烁十分明显
Memo1.Align := alClient;
end;

end.
--------------------------------------------------------------------------------

特别感谢skyweb,xianjun,jsxjd
 
顶部