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