哪位大虾知道如何捕获 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;

解决方案 »

  1.   

    这样定义看看:
    procedure WndProc(var Message: TMessage); message WM_MDIMAXIMIZE;
      

  2.   

    呵呵,都不行的话,就捕获线程的,用Application.OnMessage来试试!?
      

  3.   

    建议楼主仔细研究一下VCL的消息机制。。给你做了一个例子:FORM1是MDI主窗体,FORM2,FORM3为MDI子窗体。在主窗体上放一个菜单,分别有完成两个postmessage任务。
    主窗体代码如下:
    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看看效果。
      

  4.   

    貌似MDI子窗体的最大化(右上角按钮和左上角菜单)不是发送WM_MDIMAXIMIZE消息来实现,而是发送WM_SYSCOMMAND,wParam为SC_MAXIMIZE的消息,像普通窗体那样来实现。这个消息用Application.OnMessage和重载WndProc都可以截获的。但不是VCL不能处理WM_MDIMAXIMIZE消息。wudi用PostMessage(Form1.Handle,WM_MDIMAXIMIZE,0,0);不能最大化,是发送消息的参数搞错了,应该用SendMessage(ClientHandle, WM_MDIMAXIMIZE, Form2.Handle, 0);