用showwindow函数显示窗体,不能显示按钮,且无法关闭,为什么???(200分)

  • 主题发起人 主题发起人 ZHC
  • 开始时间 开始时间
Z

ZHC

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写了一个可程序,希望显示一个子窗口,但并不激活它(即不获得输入焦点), <br>这可以用showwindow(form2.handle,SW_SHOWNA)达到目的,但是我发现<br>用这个函数现实的窗体,其上的按钮没有显示出来,<br>我改用 &nbsp;setwindowpos(form2.handle,0,0,0,0,0,swp_showwindow or swp_nosize or swp_nomove);<br>也无法显示按钮。<br>并且用鼠标点击关闭按钮没有任何作用,不知为何?是否有其他办法可以达到<br>不激活显示窗体的目的。 <br><br>以下是我的程序代码。<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls,unit2;<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; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; setwindowpos(form2.handle,0,0,0,0,0,swp_showwindow or swp_nosize or swp_nomove);<br>end;<br><br>end.<br>以上是主窗体,点击button1显示子窗体。<br><br>unit Unit2;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm2 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Label1: TLabel;<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form2: TForm2;<br><br>implementation<br><br>{$R *.DFM}<br><br>end.<br>以上是子窗体,其上有一个按钮button1,用showwindow时无法显示出来。
 
为什么非要用这种方式显示窗口呢?
 
改为ShowWindow(Form2.Handle,SW_SHOWNOACTIVATE),我试过,没有问题。
 
把,0,0,0,0,0,中的(x,y)坐标取非零值,则按钮就出现了!
 
lml和Janms的方法我都试过了,但是结果都一样,我的开发环境是<br>windows95os2+dlephi3.0
 
我又试了一下,在win2000的环境下可以,在win98下不行。<br>可能是操作系统的bug吧。<br>
 
To lml: 在win2000的环境下可以吗?<br>
 
这个问题有人提过:<br>&lt;a href="DispQ.asp?LID=386017"&gt;二次运行的问题?&lt;/a&gt;<br>我想问题出在 API 和 VCL 的接口上。<br>&nbsp; 比如:调用 API 把窗口显示出来,由于仅仅指定了 Form2 的句柄,所以只把 Form2 显示出来了。<br>而且这个显示操作并没有通知 VCL ,所以 VCL 仍然认为 Form2 为关闭状态,再点关闭就没用了。<br>&nbsp; 上面的问题是一样的,不妨看一看,窗口被最小化之后,用 SetForeGrndWindow 和 ShowWindow<br>把窗口还原之后,再点最小化没有反应,因为窗口还原是 API 操作,还原后状态没有通知 VCL ,<br>所以 VCL 认为窗口仍然是最小化的,所以再点最小化没有反应了。<br>&nbsp; 这个问题我测试了很久,没有找到答案,现在先回去吃饭,吃饭后继续实验。<br>&nbsp; 希望有高手能够搞定之。
 
Sorry,我太粗心了,经过反复测试,使用ShowWindow只能够show出<br>Label,因为我在Win2000下在Form2上放了一个Lable,在98下放了一个<br>button,所以得到的结果有差别。<br>这个问题我过去也发现过,也是在程序的二次运行问题的解决上,<br>是VCL和WinApi的配合问题,我已经有了解决的办法,而且效果挺好,<br>BaKuBaku,我马上就去回答那个问题,去看吧。<br>针对这个问题,我想到了一个解决方法,并已经测试成功,但有些繁杂,<br>大家可以以此为突破口,看看能不能找到更好的方法:<br>Form2上放一个按钮,里面将所有的本Form上的Button之类的控件Show一遍,<br>当然也包括Form2,但不要包括自己,<br>procedure TForm2.Button1Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;ShowWindow(Handle,SW_SHOWNOACTIVATE);<br>&nbsp; &nbsp; &nbsp;ShowWindow(Form2.Button2.Handle,SW_SHOWNOACTIVATE);<br>end;<br>然后在Form1的buttonClick事项里面调用这个方法,就可以达到目的:<br>Form2.Button1Click(self);<br>
 
干嘛不 form.visible:=true这样呢?
 
To Pipi:<br>&nbsp; &nbsp; &nbsp;Zhc: 希望显示一个子窗口,但并不激活它(即不获得输入焦点).
 
To PiPi: form.visible:=true 会激活这个 Form 。<br>To lml: 这就是你想出来的办法吗?把所有控件都 Show 一遍?
 
To BaKuBaKu:<br>&nbsp; 小的脑子笨,这就是我的办法。
 
先 form.visible:=true <br>再激活回原来的form,怎么样?<br>
 
To PiPi : 这样不好,有闪烁效果。<br>To lml : &nbsp;本人也很惭愧,没办法解决这个小问题,只不过觉得你提出的办法太有意思了。
 
我想这样已经可以完成提问着的所有要求了,虽然笨了点:<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>i : Integer;<br>begin<br>&nbsp; ShowWindow(Form2.Handle,SW_SHOWNOACTIVATE);<br>&nbsp; for i := 0 to Form2.ControlCount-1 do<br>&nbsp; begin<br>&nbsp; &nbsp; ShowWindow((TWinControl (Form2.Controls)).Handle,SW_SHOW);<br>&nbsp; end;<br>end;<br>procedure TForm2.FormActivate(Sender: TObject);<br>begin<br>&nbsp; Show();<br>end;<br>
 
lml 大虾:本人对你的佩服之情又加深了一层。(纯属 Joking )<br><br>&nbsp; 难道没有想过,如果 Form 的控件又是其他控件的容器怎么办?总不成写一个递归的控件树<br>遍历算法去 Show 吧,如果是那样的话,只好 Faint and Faint 了。
 
To BaKuBaKu 大侠:<br>别叫我大虾,我学习用Delphi写程序的时间不到1月,不论您<br>是否Joking,这个称号都让我汗颜。<br>没想到您果然发现了这个问题,我只是提供一个思路而已,<br>要解决问题,当然可以用递归了,逮住老鼠的就是好猫,<br>解决问题的就是好办法,我也不想让您晕倒,依然希望<br>您继续指教:<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; ShowWindow(Form2.Handle,SW_SHOWNOACTIVATE);<br>&nbsp; ShowWinControl(Form2);<br>end;<br>procedure TForm1.ShowWincontrol(Control1 : TWinControl);<br>var<br>&nbsp; i:Integer;<br>begin<br>&nbsp; for i:= 0 to Control1.ControlCount-1 do<br>&nbsp; begin<br>&nbsp; &nbsp; if (TWinControl (Control1.Controls)).ControlCount &gt; 0 then<br>&nbsp; &nbsp; &nbsp; ShowWincontrol(TWinControl (Control1.Controls)); //递归调用<br>&nbsp; &nbsp; ShowWindow((TWinControl(Control1.Controls)).Handle,SW_SHOW);<br>end;<br>end;<br>
 
大侠不敢当,还是等真正的高手发话吧。
 

Similar threads

后退
顶部