在编写MDI应用程序时遇到一个奇怪的问题!(200分)

  • 主题发起人 主题发起人 tnndusa
  • 开始时间 开始时间
T

tnndusa

Unregistered / Unconfirmed
GUEST, unregistred user!
type<br>&nbsp; TAppHandler = class<br>&nbsp; public<br>&nbsp; &nbsp; class procedure MessageHandler(var Msg:TMsg;var Handled:boolean);<br>&nbsp; end;<br><br>class procedure TAppHandler.MessageHandler(var Msg: TMsg;var Handled: boolean);<br>begin<br>&nbsp; case Msg.wParam &nbsp;of<br>&nbsp; &nbsp; SC_MINIMIZE :<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; //这里我要处理一些事情,如果是MDI子窗体就不管它<br>&nbsp; &nbsp; &nbsp; &nbsp; //问题是,MDI子窗体在普通状态时最小化不会执行这里的代码<br>&nbsp; &nbsp; &nbsp; &nbsp; //但把MDI子窗体最大化后,再最小化,就会执行这里的代码,而且<br>&nbsp; &nbsp; &nbsp; &nbsp; //Msg.hwnd是主窗体的句柄,我想就算MDI子窗体最大化后点最小化也不执行<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; end;<br>&nbsp; Handled:=false;<br>end;<br><br>initialization<br>&nbsp; Application.OnMessage := &nbsp;TAppHandler.MessageHandler;<br><br>end.<br><br>我该怎么解决???
 
利用Application.MainForm.Handle 来判断<br>if Application.MainForm.Handle = YourHandle then ShowMessage('主窗体');
 
不在这里处理,到MDIChild窗体的OnResize事件里<br>if WindowState=wsMinimized then<br>&nbsp; //Do Something
 
TO lightstar,LeeChange:<br>&nbsp; 并不止处理主窗体,要处理所有非MDI子窗体的最小化事件,包括MDI主窗体和其它普通窗体,<br>还有Application对象!如果不处理Application对象,我可以通过继承解决,但我要求点击任<br>务栏上的应用程序按钮最小化程序时也要处理.<br><br>解决方法已经找到,不过太麻烦了,感觉写了不少重复代码.....不管了,不过~~~<br>还是想知道,为什么MDI子窗体在普通状态最小化没问题,在最大化后最小化,用我的过程处理<br>那个句柄会是MDI主窗口的?或者我的程序不对?
 
是不是消息有点问题 换WM_SIZE这个试试看
 
“MDI子窗体在普通状态时最小化”是在OnClose事件中设置<br>Action:=caMinimize;
 
同意LeeChange的做法。
 
"解决方法已经找到,不过太麻烦了" :怎么解决的给小弟讲讲我也学学!谢谢!
 
解决方法是不用Application.OnMessage,而是用继承
 
继承 ???具体怎么写啊?!谢谢!
 
非MDI子窗体一个基类,MDI子窗体一个基类,MDI子窗体不处理这些消息就是了
 
后退
顶部