使我的form TopMost(100分)

  • 主题发起人 主题发起人 control
  • 开始时间 开始时间
C

control

Unregistered / Unconfirmed
GUEST, unregistred user!
<br>我有两个Form-- form1,form2<br>form1是主form<br>我想使form2 成为 TopMost的窗口 应该如何实现 ?<br>而且form1的最小化也不要影响form2,也不能把form2<br>设成主form<br>
 
FormStyle设置为fsStayOnTop
 
蚯蚓: 你试验了没有? 你的方法不行,一旦form1最小化,form2就不见了.<br><br>原因是delphi对SC_MINIMIZE这个系统消息进行了加工,一旦收到这个消息,<br>就将整个application最小化,代码摘抄如下:<br>procedure TCustomForm.WMSysCommand(var Message: TWMSysCommand);<br>begin<br>&nbsp; with Message do<br>&nbsp; begin<br>&nbsp; &nbsp; if (CmdType and $FFF0 = SC_MINIMIZE) and (Application.MainForm = Self) then<br>&nbsp; &nbsp; &nbsp; &lt;font color=red&gt;Application.Minimize&lt;/font&gt;<br>&nbsp; &nbsp; else if ....以下略<br>end;<br>所以要实现control兄的功能,必需自己截获SC_MINIMIZE来处理,实现方法如下:<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;<br>&nbsp; &nbsp; //自己截获系统消息<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br><br>procedure TForm1.WMSysCommand(var Message: TWMSysCommand);<br>begin<br>&nbsp; with Message do<br>&nbsp; begin<br>&nbsp; &nbsp; if (CmdType and $FFF0 = SC_MINIMIZE) and (Application.MainForm = Self) then<br>&nbsp; &nbsp; &nbsp; &nbsp;&lt;font color=red&gt;WindowState:=wsMinimized&lt;/font&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp;//如果是最小化消息,直接设置WindowState即可<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; inherited; //否则,继承原来的消息处理<br>&nbsp; end;<br>end;<br><br>现在form1最小化不会影响form2显示了.当然,别忘了将form2设为fsStayOnTop. :-)<br><br><br>
 
你厉害,你厉害,<br><br>天底下你最厉害
 
<br>还不行<br><br>虽然form2不与form1一起最小化了,但自己也不是topmost的了,一切换就没了<br><br>而且form1的最小化窗口也显示在左下脚
 
我觉得你这么做有意义码?FORM1作为主FORM,它都最小花了,<br>form2作为应用程序的一部分,stayontop似乎没意义<br>如果form2是一个类似帮助或参考之类的东西,不妨另外将form2<br>做个应用程序,在启动form1的时候启动,在form1关闭时结束<br><br>
 
对的,可以按lhxu这么做的<br><br>好像有种方法是做成多个线程,两个线程互相不干扰,把两个窗口都打开就可以了<br>(据说FoxMail就是这么做的)
 
&gt;&gt;自己也不是topmost的了<br>Delphi的程序就这样,就算不用我的方法也一样.<br><br>&gt;&gt;一切换就没了而且form1的最小化窗口也显示在左下脚<br>那么你希望form1最小化后显示在什么地方呢? 隐藏在windows的工具条上?<br>那么当form2也最小化时呢? 工具条上的那个按钮到底控制哪个窗口呢?<br><br>总觉得你的想法有些问题.
 
我觉得他的意图是做个像网络蚂蚁一样的东西,呵呵。
 
试试我的,能满足你的要求,在form1中方一个按钮<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, <br>Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; &nbsp;procedure FMin(var msg:twmsyscommand);message wm_syscommand;<br>&nbsp; &nbsp; &nbsp;{ Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br>var<br>&nbsp; Form1: TForm1;<br>implementation<br>uses Unit2;<br>{$R *.DFM}<br>procedure tform1.fmin(var msg:twmsyscommand);<br>begin<br>&nbsp; if msg.CmdType=SC_MINIMIZE then form1.hide<br>&nbsp; else &nbsp;inherited;<br>end;<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>form2.show;<br>end;<br>end.
 
不用老是老师动众的用Message嘛,干嘛,干嘛呢。<br>只有把主form设置为一个隐含的就可以了吗<br>project文件里加个form设为主form,然后<br>&nbsp;Application.ShowMainForm:=False;<br>然后你想show哪个form就show哪个,<br>只要主form 不最小话,没事的吗!(因为没法最小化,hide了)<br>
 
<br>最近搬家,上不了网,一直都没回应,不好意思.<br>另因为我原来是使用vc的,所以提的问题可能有些不对劲.<br><br>最后我的解决方案是:<br>1.重载form2的CreateParams<br>&nbsp; &nbsp;inherited;<br>&nbsp; &nbsp;// 使form不在任务栏中<br>&nbsp; &nbsp;Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW;<br>&nbsp; &nbsp;// 把父窗口设为0<br>&nbsp; &nbsp;Params.WndParent := GetDeskTopWindow;<br><br>2.把form2显示为TopMost<br>&nbsp; SetWindowPos(......)<br><br>最后的分大家分了吧 :)<br>
 
多人接受答案了。
 
后退
顶部