哪位大虾知道如何捕获 WM_MDIMAXIMIZE 的事件?
兄弟在MDI主窗体和MDI子窗体中都试过以下的方法,为什么都无法捕获到该消息?
TFMain = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Create1: TMenuItem;
N1: TMenuItem;
exit1: TMenuItem;
procedure exit1Click(Sender: TObject);
procedure Create1Click(Sender: TObject);
private
{ Private declarations }
protected
FOldGridWnd: TWndMethod;
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
blnFormMaxed:boolean;
end;procedure TFMain.WndProc(var Message: TMessage);
begin
if Message.Msg=WM_MDIMAXIMIZE then
begin
showmessage('收到 WM_MDIMAXIMIZE');
Inherited WndProc(Message);
end
else if Message.Msg=WM_MDIRESTORE then
begin
showmessage('收到 WM_MDIRESTORE');
Inherited WndProc(Message);
end
else
Inherited WndProc(Message);
end;
兄弟在MDI主窗体和MDI子窗体中都试过以下的方法,为什么都无法捕获到该消息?
TFMain = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Create1: TMenuItem;
N1: TMenuItem;
exit1: TMenuItem;
procedure exit1Click(Sender: TObject);
procedure Create1Click(Sender: TObject);
private
{ Private declarations }
protected
FOldGridWnd: TWndMethod;
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
blnFormMaxed:boolean;
end;procedure TFMain.WndProc(var Message: TMessage);
begin
if Message.Msg=WM_MDIMAXIMIZE then
begin
showmessage('收到 WM_MDIMAXIMIZE');
Inherited WndProc(Message);
end
else if Message.Msg=WM_MDIRESTORE then
begin
showmessage('收到 WM_MDIRESTORE');
Inherited WndProc(Message);
end
else
Inherited WndProc(Message);
end;
解决方案 »
- 在 Delphi 中,如何将获取字符串后三位数字并进行自动增加?
- 求代码:将指定文件夹及文件夹下的子文件夹和文件属性设为隐藏
- 寻Delphi高手写书
- 简单dat视频文件播放问题
- Excel如果屏蔽提示窗口,解决了问题多少分都可以
- @@@@@@@@@@@@@@@@@@一个简单的问题,当场给分◎◎◎◎◎◎◎◎◎◎◎
- 请教:怎样把Word文件存入SQL server2000数据库中,在需要时可以取出重新编辑?
- 如何让listbox在显示长句的时候能根据listbox的宽度自动换行?
- 关于delphi的数据类型问题
- 如何在一个 application 中调用一个dos 程序
- 求助:使用BDE的问题,Query在执行的时候都提示要输入用户和密码?
- 请教一个adoquery和dbgrid的问题
procedure WndProc(var Message: TMessage); message WM_MDIMAXIMIZE;
主窗体代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, AppEvnts;type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
send1: TMenuItem;
a1: TMenuItem;
b1: TMenuItem;
procedure a1Click(Sender: TObject);
procedure b1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WndProc(var Message: TMessage); override;
procedure Myonmessage(var Msg: tagMSG;
var Handled: Boolean) ;
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.WndProc(var Message: TMessage);
begin
//在wndproc中截获消息
if Message.Msg=WM_MDIMAXIMIZE then
begin showmessage('在WndProc中收到 WM_MDIMAXIMIZE'); end
else if Message.Msg=wm_mdinext then
begin
showmessage('在WndProc中收到 WM_MDIRESTORE'); end;
Inherited WndProc(Message);
end;procedure TForm1.a1Click(Sender: TObject);
begin
PostMessage(Form1.Handle,WM_MDIMAXIMIZE,0,0);{程序执行这段代码后,你会发现无论是wndproc还是onmessage都截获了这个消息,但子窗体没有最大化,为此,你可以看一下vcl源码,forms.pas,你会发现,VCL根本就没有对这个消息处理。如果你通过点击子窗体右上角的最大化按钮,你会发现程序会出现你所谓的情况,就是截获不到这个消息,那是因为,根本就不是这个消息。你可以做个例程,试一试。在onmessage中截取,将消息都显示在一个memo中。}
end;procedure TForm1.b1Click(Sender: TObject);
begin
PostMessage(ClientHandle,WM_MDINEXT,0,0);//此代码执行后,你会发现onmessage截获到了消息,并且子窗体进行了相应的操作。至于为什么,建议你找本书看看,了解一下VCL的消息机制,看看消息的流程是如何的。
end;procedure TForm1.Myonmessage(var Msg: tagMSG; var Handled: Boolean);
begin
//在onmessage中截获消息
if msg.message = WM_MDINEXT then
begin
showmessage('在onMessage中收到 WM_MDINEXT');
end;
if msg.message = WM_MDIMAXIMIZE then
showmessage('在onMessage中收到 WM_MDIMAXIMIZE');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := Myonmessage;
end;end.最后,你还可以把两个postmessage都换成sendmessage看看效果。