我想在一个窗口最大化之前知道窗口要最大化,借此改变窗口的一些属性。开始通过WindowState是否等于wsMaximized来判断,但是只有窗口最大化完毕WindowState才等于wsMaximized。后来通过拦截WM_SYSCOMMAND消息,可以通过参数SC_MAXIMIZ来判断。代码如下Unit1.hclass TForm1 : public TForm
{
...
private:
void __fastcall OnSysCommand(TMessage & Msg);
...
protected:
  BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, OnSysCommand)
  END_MESSAGE_MAP(TForm)
};
Unit1.cppvoid __fastcall TForm1::OnSysCommand(TMessage & Msg)
{
  //判断窗体是否要最大化
  if(Msg.WParam == SC_MAXIMIZE)
  {
    //做一些窗体属性的设定
  }
}但是拦截了这个消息后窗体的所有单击事件就不能正常响应了,问怎样解决这个问题?或者有其它方法实现这个功能吗?

解决方案 »

  1.   

    form有个onresize事件,是当窗口发生变化是触发的。
      

  2.   

    form有个onresize事件,是当窗口大小发生变化是触发的。
      

  3.   

    请问ysai(蓝色忧郁) :
    如何Inherited?
    我用BCB编程,对Delphi中的Inherited不太熟悉,能给段代码吗?
      

  4.   

    你的方法是正确的,只要在void __fastcall TForm1::OnSysCommand(TMessage & Msg) 结束之前加上inherited把消息继续传递就可以了。
      

  5.   

    楼上正解。就跟PEEKMESSAGE里的参数一样的作用。PM_REMOVE是屏蔽截取的消息,PM_NOREMOVE反之。其实完全可以用PEEKMESSAGE来做,也挺简单。
      

  6.   

    再次请教楼上的大侠们!我用的是BCB, BCB中可没有Inherited。这时用什么样的方法才能把消息继续传递下去呢?
    请教 DemonLoveLizzy(魑魅魍魉):该怎么使用PEEKMESSAGE呢?我的消息是TMessage型的,而PEEKMESSAGE的消息是MSG型的
      

  7.   

    呵呵,截取第1、2个参数就可以了。那个来得比这个全面,就好象DELPHI的ONMESSAGE
      

  8.   

    在按下最大化按钮,MESSAGE是161,WPARAM是9。
    还有,你的代码。在你处理事件的最后,你可以SENDMESSAGE(HWND,WM-SYSCOMMAND,SC_MAXIMIZE,0),来让它最大化不就完了么?或者SELF。WINDOWSTATE=XX(记不住了。)
      

  9.   

    请教 DemonLoveLizzy(魑魅魍魉):
       截取哪两个参数就可以了?能给个例子吗?
       另外:我用OnMessage事件的确可以拦截WM_NCLBUTTONDOWN(值为161)消息,但是只能判断点击了最大化按钮,而鼠标双击标题栏时也会最大化的,所以还应该拦截WM_NCLBUTTONDBLCLK消息判断wParam是否为HTCaption。这样是否有些麻烦?仍拦截WM_SYSCOMMAND消息可不可以呢?利用OnMessage为什么不能拦截WM_SYSCOMMAND消息呢?
      

  10.   

    type
      TFormMain = class(TForm)
      private
        procedure OnSysCommand(var message: TMessage); message WM_SYSCOMMAND;//==============================================================================
    //Form.系统指令(最小化、最大化、恢复、关闭)***********************************
    //==============================================================================
    procedure TFormMain.OnSysCommand(var message: TMessage);
    begin
      case message.WParam of
        SC_MINIMIZE, SC_CLOSE: ShowWindow(Handle, SW_HIDE);
        SC_MAXIMIZE:           ShowWindow(Handle, SW_SHOWMAXIMIZED);
        SC_RESTORE:            ShowWindow(Handle, SW_SHOWNORMAL);
        else inherited;
      end;
    end;
      

  11.   

    就是拦截MESSAGE和WPARAM这2个参数。我现在不关心这些了,我想知道的是,你在你的处理代码最后加SENDMESSAGE(HWND,WM-SYSCOMMAND,SC_MAXIMIZE,0)能不能行?用PEEKMESSAGE要截取WM-SYDCOMMAND也很简单啊。你点点系统菜单里的“最大化”选项就可以了。我记得是274(274就是WM-SYSCOMMAND的值了吧?),顺便看看WPARAM的值是否SC_MAXIMIZE就行了。