我想在一个窗口最大化之前知道窗口要最大化,借此改变窗口的一些属性。开始通过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)
{
//做一些窗体属性的设定
}
}但是拦截了这个消息后窗体的所有单击事件就不能正常响应了,问怎样解决这个问题?或者有其它方法实现这个功能吗?
{
...
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)
{
//做一些窗体属性的设定
}
}但是拦截了这个消息后窗体的所有单击事件就不能正常响应了,问怎样解决这个问题?或者有其它方法实现这个功能吗?
如何Inherited?
我用BCB编程,对Delphi中的Inherited不太熟悉,能给段代码吗?
请教 DemonLoveLizzy(魑魅魍魉):该怎么使用PEEKMESSAGE呢?我的消息是TMessage型的,而PEEKMESSAGE的消息是MSG型的
还有,你的代码。在你处理事件的最后,你可以SENDMESSAGE(HWND,WM-SYSCOMMAND,SC_MAXIMIZE,0),来让它最大化不就完了么?或者SELF。WINDOWSTATE=XX(记不住了。)
截取哪两个参数就可以了?能给个例子吗?
另外:我用OnMessage事件的确可以拦截WM_NCLBUTTONDOWN(值为161)消息,但是只能判断点击了最大化按钮,而鼠标双击标题栏时也会最大化的,所以还应该拦截WM_NCLBUTTONDBLCLK消息判断wParam是否为HTCaption。这样是否有些麻烦?仍拦截WM_SYSCOMMAND消息可不可以呢?利用OnMessage为什么不能拦截WM_SYSCOMMAND消息呢?
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;