在父窗体的picturebox上显示子窗体 (一)

 

如果按照层次结果来推理的话,我提出的这个问题是不可能解决的。原因在于子窗体位于MDIClient里。也就是说子窗体的父窗体是MDIClient,而放置在MDI中的PictureBox和MDIClient是同一级的。

 当然只要有问题出现就会有解决问题的方法:

 方法一:我们先来了解一下这种方法的根源:系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。也就是说我们通过调用句柄来来破坏其程序本身的消息循环。

 

此方法用到的为setparent函数。

函数功能:该函数改变某个子窗口的父窗口。 

函数原型:HWND SetParent(HWND hWndChild,HWND hWndNewParent);

参数:

     hWndChild:子窗口句柄。

     hWndNewParent:新的父窗口句柄。如果该参数是NULL,则桌面窗口就成为新的父窗口。

 

我们可以这样应用:

frmmain中(注:不可为frmmain窗体,为一般窗体,否则会发生冲突)

 

Option Explicit

Private Declare Function SetParentLib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long)As Long

Private Sub frmmain _click()

SetParent  from2.hwnd, frmmain.PictureBox1.hwnd

Form2.Show

End Sub

 

Form2

Option Explicit

Private Declare FunctionSetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Form_Activate()

SetForegroundWindow frmmain.hwnd

End Sub

当然这也有不足之处就是有一个闪动的过程.,要完美解决,可能要用子类化从消息里处理。大家还有什么好的办法一起分享一下吧

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值