如何实现一窗体处于某一指定窗体的上面?注意不是置顶功能(特急) ( 积分: 100 )

  • 主题发起人 主题发起人 blockhead
  • 开始时间 开始时间
B

blockhead

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序分别有两部分,一部分用VC++开发(实现大部分比较难的功能),一部分用DELPHI开发(主要用于界面,图像效果的实现)。实现原理是:<br>VC++的程序调用DELPHI的程序,并且使DELPHI显示的窗体处于VC++某一指定窗体的上面(注意不是所有窗体,不是实现置顶功能),并且当我移动VC++窗口的时候,DELPHI的窗体同步移动。(我用WINDOWS的消息实现了)。现在的问题就是:如何实现使DELPHI显示的窗体处于VC++某一指定窗体的上面,这部门功能是在CV++实现还是在DELPHI中。我试着用API的SetWindowPos不知道怎么实现。<br>部分原代码:<br>在VC++中<br>int CStudyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) <br>{<br> if (CDialog::OnCreate(lpCreateStruct) == -1)<br> return -1;<br> <br> // TODO: Add your specialized creation code here<br><br> WinExec(&quot;Skin.exe&quot;, SW_HIDE);//调用执行DELPHI图像窗体<br> CWnd *hwnd = FindWindow(NULL,&quot;Skin&quot;);//获取DELPHI图像窗体句柄<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(hwnd!=NULL)<br> {<br> hwnd-&gt;PostMessage( WM_POSITION, 0 ,1 );//向DELPHI窗体发送控制消息;<br> }<br> hwnd-&gt;SetWindowPos(this,0,0,0,0,SWP_NOACTIVATE);这里如何实现<br> return 0;<br>}<br>DELPHI中的代码:<br>procedure TCurve.FormCreate(Sender: TObject);<br>var Hwnd:Thandle;<br>begin<br> &nbsp;Curve.Hide;<br> &nbsp;SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//使窗体不在任务栏出现<br> &nbsp;Hwnd:=FindWindow(0,'Cmain');//查找CV++的主窗体<br> &nbsp;{if Hwnd&lt;&gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;SetWindowPos                 (Application.Handle,Hwnd,Curve.Left,Curve.Top,Curve.Width,Curve.Height,SWP_NOACTIVATE);//这里怎么办<br> &nbsp; &nbsp;SetActiveWindow(Hwnd);<br> end;
 
我的程序分别有两部分,一部分用VC++开发(实现大部分比较难的功能),一部分用DELPHI开发(主要用于界面,图像效果的实现)。实现原理是:<br>VC++的程序调用DELPHI的程序,并且使DELPHI显示的窗体处于VC++某一指定窗体的上面(注意不是所有窗体,不是实现置顶功能),并且当我移动VC++窗口的时候,DELPHI的窗体同步移动。(我用WINDOWS的消息实现了)。现在的问题就是:如何实现使DELPHI显示的窗体处于VC++某一指定窗体的上面,这部门功能是在CV++实现还是在DELPHI中。我试着用API的SetWindowPos不知道怎么实现。<br>部分原代码:<br>在VC++中<br>int CStudyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) <br>{<br> if (CDialog::OnCreate(lpCreateStruct) == -1)<br> return -1;<br> <br> // TODO: Add your specialized creation code here<br><br> WinExec(&quot;Skin.exe&quot;, SW_HIDE);//调用执行DELPHI图像窗体<br> CWnd *hwnd = FindWindow(NULL,&quot;Skin&quot;);//获取DELPHI图像窗体句柄<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(hwnd!=NULL)<br> {<br> hwnd-&gt;PostMessage( WM_POSITION, 0 ,1 );//向DELPHI窗体发送控制消息;<br> }<br> hwnd-&gt;SetWindowPos(this,0,0,0,0,SWP_NOACTIVATE);这里如何实现<br> return 0;<br>}<br>DELPHI中的代码:<br>procedure TCurve.FormCreate(Sender: TObject);<br>var Hwnd:Thandle;<br>begin<br> &nbsp;Curve.Hide;<br> &nbsp;SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//使窗体不在任务栏出现<br> &nbsp;Hwnd:=FindWindow(0,'Cmain');//查找CV++的主窗体<br> &nbsp;{if Hwnd&lt;&gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;SetWindowPos                 (Application.Handle,Hwnd,Curve.Left,Curve.Top,Curve.Width,Curve.Height,SWP_NOACTIVATE);//这里怎么办<br> &nbsp; &nbsp;SetActiveWindow(Hwnd);<br> end;
 
用SetParent函数试一试
 
有两个程序A和B,A调用B,B的窗口始终在A的前面,但是不是在所有程序的最上面?<br>首先需要修改A程序,在调用B之前,传递A窗口句柄为参数给B或者在B中使用FindWindow也可以。<br>然后重载B窗体的CreateParams,类似下面:<br>procedure TFormB.CreateParams(var P: TCreateParams);<br>begin<br> &nbsp;inherited;<br> &nbsp;P.WndParent := FindWindow('TFormA','FormA');<br> &nbsp;//P.WndParent := StrToInt(ParamStr(1));<br> &nbsp;P.ExStyle := P.ExStyle or WS_EX_TOOLWINDOW;<br>end;
 
从问题说明,就事论事看的代码,首先是dephi的窗体先激活(它的z-order是参照了一个未激活的窗体),然后SetWindowPos了vc的窗体。<br>因为不知道:你的要求是一直让delphi的窗体处于覆盖状态,还只一次就够了,而且也不知道是否需要它处于active的状态,所以怕说多了都是废话,建议是不是把SetWindowPos在win32.hlp里的Remarks再看看,是否能够符合你心中的那个需求
 
其实我的本意就是CV++编制的窗体(简称为C窗体)作为主界面(控制体),而用DELPHI编置的窗体(简称D窗体)仅仅是实现一个功能(由于用VC++编写个人能力有限,无法实现,而用DELPHI比较容易),D窗口是一个没有标题栏的窗口,它的效果是象嵌入到C窗体一样(即看到C窗体就一定能看到D显示的效果,不管C是激活的,还在没有激活的情况下被其他窗体遮蔽了一半),而不能让用户知道它们是两个不同的窗体组合而成的。
 
后退
顶部