我的做法是在一个MDI窗体里,子窗体显示在一个Picture控件,子窗体无边框,通过如下过程显示子窗体:Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As LongPublic Sub loadChildForm(mForm As Form)
  Dim slng As Long
  'FrmMaster.PicForm(MDI主窗体.Picture控件)
  slng = SetParent(mForm.hwnd, FrmMaster.PicForm.hwnd)
  mForm.Move 0, 0
End Sub子窗体调用:Private Sub Form_Load()
  Call loadChildForm(Me)
End Sub现在问题来了:
当MsgBox "aaa"后,Text1.Setfocus焦点怎么也无法设置回来,我观察到,焦点转移到MDI窗体了,请问我如何强制设置焦点到Text1上?奇怪,我想给300不让给,只能给100分!

解决方案 »

  1.   

    Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
    说明 
    指定一个窗口的新父(在vb里使用:利用这个函数,vb可以多种形式支持子窗口。例如,可将控件从一个容器移至窗体中的另一个。用这个函数在窗体间移动控件是相当冒险的,但却不失为一个有效的办法。*************************如真的这样做,请在关闭任何一个窗体之前,注意用SetParent将控件的父设回原来的那个) ***************************
    返回值 
    Long,前一个父窗口的句柄 
    参数表 
    参数 类型及说明 
    hWndChild Long,子窗口的句柄 
    hWndNewParent Long,hWndChild的新父 
    注解 
    可用这个函数在运行期将vb控件置入容器控件内部(比如将一个按钮设成图象或窗体控件的子窗口),或者将控件从一个容器控件移至另一个。控件移至另一个父后,它的位置将由新父的坐标系统决定。这样一来,有必要重新规定控件的位置,使其能在目标位置显示出来
     
      

  2.   

    //现在问题来了:
    当MsgBox "aaa"后,Text1.Setfocus焦点怎么也无法设置回来MsgBox "aaa"的代码在哪里?另外Text1是哪个窗体的
      

  3.   

    当MsgBox "aaa"后,Text1.Setfocus焦点怎么也无法设置回来全部在子窗体运行,Text1也是子窗体里的。我这个是一个收费程序,当收费完毕写入数据库、打印后,输入框初始化,最后想返回第一个输入框。如果没有用MsgBox或载入其他窗体,焦点可以正确设置。我想过自己做一个提示框的,然后用 Form1.show vbmodal,ChildForm 设置从属窗体,但是子窗体不允许设置从属窗体,没辙了。谢谢aalei我再研究一下那个函数看看。
      

  4.   

    。*************************如真的这样做,请在关闭任何一个窗体之前,注意用SetParent将控件的父设回原来的那个) ***************************
    是不是重新调用一次Call loadChildForm(Me)?
    刚试了一次,不行,我理解不是这样的,因为我的窗体并未移动或关闭呀。
      

  5.   

    你可以试一下将你放置text1的窗体不要设置成MDI窗体的子窗体,也就是用一般窗体,然后用SetParent函数,我以前好像是这样解决的,不过代码在单位,现在查不了。
      

  6.   

    什么系统,用api函数Setfocus试试
      

  7.   

    Setfocus函数无效,这个有点特殊的,可能是用了SetParent 的关系
    你可以试一下将你放置text1的窗体不要设置成MDI窗体的子窗体,也就是用一般窗体,然后用SetParent函数,我以前好像是这样解决的,不过代码在单位,现在查不了我的父窗体还是需要标题栏的,不用MDI窗体,当子窗体获得焦点时,父窗体就没有焦点了,很难看的。