请问如何响应窗体的最小化和最大化事件?(10分)

  • 主题发起人 icysword
  • 开始时间
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何响应窗体的最小化和最大化事件? 一定要用 wm_syscommand 消息吗?
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
是的,在application.onmessage判断最大最小化消息。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
application.onmessage ? 在哪里呀? 不能在form事件里面实现吗?
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=842898
这里有介绍,OnMessage的用法和OnException的用法一样。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
applicatio_OnMmessage 的参数是什么呢? 也跟OnException的参数一样吗?
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
试过了, 但好像不行. 也许是代码有问题, 请指教:
procedure AppMessage(var Msg:TMsg;var Handled:boolean);
procedure tform1.AppMessage(var Msg:TMsg;var Handled:boolean);
begin
if msg.wParam=sc_minimize then
showmessage('最小化');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage:=AppMessage;
end;

把form最小化, 但那个"最小化"消息却怎么也出不来, ^-^
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
不一样,你在帮助中输入TApplication可以看到application的帮助
选里面的Events后,会看到OnMessage事件,看OnMessage就可以看到它有些哪些参数了。
对了,你知道要截哪些消息吗?我想知道,如果你知道请告诉我。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
"要截哪些消息?" 不好意思, 我不太明白你的意思, 你是问我要截哪些消息吗? 还是说能截
哪些消息呀? 如果我知道一定附上, 呵呵,,~~
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经找到用 WM_SYSCOMMAND 消息实现最小化按钮的触发事件, 代码如下:
procedure wmsyscommand(var msg: TMessage);
message WM_SYSCOMMAND;
procedure tform1.wmsyscommand(var msg: TMessage);
begin
if msg.WParam = sc_icon then
showmessage('kfdlsajf')
else
inherited;
end;

但我还想知道用 Application.OnMessage 事件来实现, 能说说具体怎么做吗?
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure AppMessage(var Msg: TMsg;
var Handled: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.AppMessage(var Msg: TMsg;
var Handled: Boolean);
begin
if msg.wParam = WM_SYSCOMMAND then
showmessage('kfdlsajf')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage :=AppMessage;
end;

end.
代码是这样,可程序最小化的时候,没有对话框,确信用WM_SYSCOMMAND 这个消息吗?
我上面的问题也是这个,哪个消息判断是用于最小化的。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
好像有点收获, 但还是有问题, 把上面那段代码的 msg.wParam = WM_SYSCOMMAND 改为
msg.message = WM_SYSCOMMAND (因为 Application.OnMessage 拦截的是消息(Message))
, 这样可以显示对话框.. 但也只是在form 恢复的时候显示, 最小化的时候还是不显示的,
不知道为什么??
哦, 对了, 其实最小化触发的事件还有 Application.OnMinimize , 谢谢你告诉我看 delphi
中的帮助, 我才发现了这个, 呵呵~~~ thx
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
更改我上面的代码的AppMessage为:
procedure TForm1.AppMessage(var Msg: TMsg;
var Handled: Boolean);
begin
if Msg.message = WM_SYSCOMMAND then
if Msg.wParam = SC_MINIMIZE then
label1.caption := 'Miniing';
end;
就OK了。
看FORMS里源码可以知道OnMinimize由Minimize调用,而Minimize过程由
TApplication.WndProc调用。
在代码6278行可以看到:
6278 WM_SYSCOMMAND:
6279 case WParam and $FFF0 of
6280 SC_MINIMIZE: Minimize;先判断消息是否WM_SYSCOMMAND,再判断其wParam是否为SC_MINIMIZE,是则为FORM将要最小化。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
我好像试过了, 但是不行呀!?
 

影 子

Unregistered / Unconfirmed
GUEST, unregistred user!
//真的不想答这种问题,问问题之前可以不可以想想?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
procedure AppMessage(var Msg:TWMSYSCOMMAND);message WM_SYSCOMMAND;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure tform1.AppMessage(var Msg:TWMSYSCOMMAND);
begin
if msg.CmdType=sc_minimize then
showmessage('最小化')
else
if Msg.CmdType = SC_Maximize then
showmessage('最大化');
inherited;
end;
end.
 
C

cxx1997

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi-> addinational->applicationevents控件专门做这个的,很简单的
你把它放到窗体上,看它的事件就行了
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
影子的代码只有当用户按最小化按钮时才可以SHOWMESSAGE。
而我的代码只有在 当程序在最前时,再按一下任务栏这个程序的按钮才会最小化。
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
如果直着用这功能的话就不要用application.onmessage改用onminimize吧
然后再研究要capture哪些消息。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵, 算了, 不想引起太多争议, 这个问题我已经解决了, 谢谢大家, 谢谢 yhaochuan
 
Y

yhaochuan

Unregistered / Unconfirmed
GUEST, unregistred user!
实现代码贴出来看看。
 
I

icysword

Unregistered / Unconfirmed
GUEST, unregistred user!
不是用 AppMessage.OnMessage 实现的, 我是 WM_SYSCOMMAND 实现的, 像上面我贴出来的代码.
还有用 AppMessage.OnMinimize 更简单..
最后, 我发现用 AppMessage.OnMessage 是拦不了窗体最小化的(是指点那个最小化按钮),
只能拦截任务栏右键出来的"最小化"或"最大化"什么的, 不是吗??
 

Similar threads

S
回复
0
查看
616
SUNSTONE的Delphi笔记
S
S
回复
0
查看
694
SUNSTONE的Delphi笔记
S
顶部