在主窗体的Panel中显示另一个窗体,用setparent函数的问题??? ( 积分: 50 )

  • 主题发起人 主题发起人 huzhuqing
  • 开始时间 开始时间
H

huzhuqing

Unregistered / Unconfirmed
GUEST, unregistred user!
要求:主窗体Frmmain有一个Bitbtn按键和一个Panel,要求在这个Panel上显示另一个窗体Form1,(在同一个应用程序下).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;想用Setparent函数,定义:hwndfrm,hwndoldparent:HWND;<br>procedure&nbsp;TForm1.FormActivate(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;hwndfrm:=form1.Handle;<br>&nbsp;&nbsp;&nbsp;hwndoldparent:=getparent(hwndfrm);<br>&nbsp;&nbsp;&nbsp;windows.SetParent(hwndfrm,frmmain.panel12.Handle);<br>end;&nbsp;<br>procedure&nbsp;TForm1.FormDestroy(Sender:&nbsp;TObject);<br>begin<br>windows.SetParent(hwndfrm,hwndoldparent);<br>end;&nbsp;&nbsp;&nbsp;&nbsp;然后<br>&nbsp;&nbsp;&nbsp;procedure&nbsp;Tfrmmain.BitBtn1Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;form1.show;<br>end;<br>&nbsp;&nbsp;这样不行,奇怪问题出在哪里?
 
来个简单的方法:<br>form2属性设置<br>&nbsp;&nbsp;Align&nbsp;=&nbsp;alClient<br>&nbsp;&nbsp;BorderStyle&nbsp;=&nbsp;bsNone<br><br>调用<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>begin<br>Form2:=TForm2.Create(Panel1);<br>Form2.Parent:=Panel1;<br>Form2.Show;<br>end;<br>显示OK。
 
procedure&nbsp;TForm1.BitBtn1Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;windows.SetParent(form2.handle,panel1.handle);<br>&nbsp;&nbsp;form2.Show;<br>&nbsp;&nbsp;form2.BoundsRect&nbsp;:=&nbsp;rect(0,0,200,150);<br>end;<br>//这是不规范的做法,先不论代码有什么问题,或者有什么副作用,就这样的程序界面肯定是不伦不类的。
 
dinglj1760,kinneng:谢谢你们这么晚还坚守在大富翁上,回答我的提问.并且上面的问题已解决!<br>kinneng,&nbsp;我的目的就是在左侧做一个导航栏,在右侧显示窗体.<br>&nbsp;&nbsp;现在问题是按导航栏另外的按键时,怎么关闭右侧原来的窗体,加入新窗体.因为窗体是动态加入的??
 
觉得自己喜欢delphi就来delphi-qq群:23981160
 
继续前面的问题,请高手看过来:<br><br>windows.SetParent(FrmSendMail.Handle,pnlClient.Handle);<br>SetWindowPos(FrmSendMail.Handle,HWND_TOP,0,0,pnlClient.Width,pnlClient.Height,SWP_SHOWWINDOW);<br>我用如下语句可以把另外一个form放入panel中<br>但如果双击标题栏最大化或者还原时<br>嵌入的form大小不会跟着主界面的大小进行变化<br>请解释,感谢!!!
 
Form2:=TForm2.Create(....);<br>Form2.BorderStyle:=bsNone;<br>Form2.Align:=alClient;<br>Form2.ParentWindows:=Panel.Handle;<br>windows.SetParent(Form2.Handle,Panel.Handle);//这句好像不用,你试试吧。<br>Form2.Show;
 
Form2.ParentWindows:=Panel.Handle;<br>windows.SetParent(Form2.Handle,Panel.Handle);//这句好像不用,你试试吧。<br>上一句是用delphi来设置ParentWindow,没有s的,后一句是用API来设置,<br>功能一样,后一句灵活些。但别指望Align:=alClient有什么用<br><br>to&nbsp;yonghua530<br>嵌入的form大小不会跟着主界面的大小进行变化<br>系统没当它什么回事,所以没给它发wm_size消息,自己在主窗口resize事件内调整,<br>或者自己发消息给它。<br><br>to&nbsp;huzhuqing<br>按导航栏另外的按键时,怎么关闭右侧原来的窗体<br><br>form2.free;<br><br>动态窗口创建,可以先做一个form2,里面控件、功能做齐,加上这个<br>procedure&nbsp;TForm2.FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>begin<br>&nbsp;&nbsp;Action:=&nbsp;caFree;<br>end;<br><br><br>在form1里面定义<br><br>private<br>&nbsp;&nbsp;formx&nbsp;:&nbsp;array&nbsp;of&nbsp;tform2;<br><br>setlength(formx,10);//十个窗<br>for&nbsp;i:=0&nbsp;to&nbsp;9&nbsp;then<br>begin<br>&nbsp;&nbsp;formx:=tform2.create(self);<br>&nbsp;&nbsp;formx.ParentWindows:=Panel.Handle;<br>&nbsp;&nbsp;formx.BoundsRect&nbsp;:=&nbsp;rect(0,0,Panel.width,Panel.height);<br>end;<br><br>formx.close;就可以关掉,比free好,因为有机会保存数据
 
感谢:kinneng<br><br>我的问题已经解决<br>在主界面的resize事件写如下语句,重新调整它的大小<br>SetWindowPos(FrmSendMail.Handle,HWND_TOP,0,0,pnlClient.Width,pnlClient.Height,SWP_SHOWWINDOW);
 
用delphi语句去写<br>FrmSendMail.BoundsRect&nbsp;:=&nbsp;rect(0,0,pnlClient.Width,pnlClient.Height);
 
多人接受答案了。
 
后退
顶部