预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9
在线预览结束,喜欢就下载吧,查找使用更方便
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
HYPERLINK"http://www.cnblogs.com/bitzhuwei/archive/2012/05/24/SmileWei_EmbeddedApp.html"C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题)。在codeproject找到了一篇相关的文章(HYPERLINK"http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project"\o"HostingEXEApplicationsinaWinFormproject"\t"_blank"http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project),虽然可用,但是很不方便,于是重新设计编写了一个类库,用一个控件完成内嵌其它应用程序的功能。直接上图先:从打开AdobeReader那张图片可以看出来所谓的“内嵌程序和宿主程序的窗口激活状态问题”。当内嵌程序窗口激活时,表面上将其包裹起来的宿主窗口却处于非激活的状态。想隐藏这一点的话,把窗口的FormBorderStyle属性设为None吧,然后自己在窗口上画关闭、最大化、最小化按钮好了。原作者的实现思路更能暴露本质,所以这里用原作者的代码段解释一下实现过程。1、启动要嵌入的应用程序进程1Processp=null;2try3{4//Starttheprocess5p=System.Diagnostics.Process.Start(this.exeName);67//Waitforprocesstobecreatedandenteridlecondition8p.WaitForInputIdle();910//Getthemainhandle11appWin=p.MainWindowHandle;12}13catch(Exceptionex)14{15MessageBox.Show(this,ex.Message,"Error");16}2、调用WindowsAPI将启动的应用程序窗口嵌入自定义的控件(作者用的是Panel控件)1//Putitintothisform2SetParent(appWin,this.Handle);//this在这里是Panel控件34//Removeborderandwhatnot5SetWindowLong(appWin,GWL_STYLE,WS_VISIBLE);67//Movethewindowtooverlayitonthiswindow8MoveWindow(appWin,0,0,this.Width,this.Height,true);3、设置被嵌入的窗体大小随宿主窗体改变1protectedoverridevoidOnResize(EventArgse)2{3if(this.appWin!=IntPtr.Zero)4{5MoveWindow(appWin,0,0,this.Width,this.Height,true);6}7base.OnResize(e);8}4、设置被嵌入的窗体应用程序在宿主程序关闭时也关闭1protectedoverridevoidOnHandleDestroyed(EventArgse)2{3//Stoptheapplication4if(appWin!=IntPtr.Zero)5{6//Postacolsemessage7PostMessage(appWin,WM_CLOSE,0,0);89//Delayforittogetthemessage10System.Threading.Thread.Sleep(1000);1112//Clearinternalhandle13appWin=IntPtr.Zero;14}15base.OnHandleDestroyed(e);16}原作者的代码实际用起来是很不方便的,具体大家试试就知道,不细说了(反正我只学了学上面的步骤,也不用他的库)。本人开发了一个比较实用的控件,使用起来也很简单,只需三步。首先,在窗体应用程序项目中引用类库SmileWei.EmbeddedApp。然后,在宿主窗体上拖一个AppContain