在Vb中,设置一个FORM为模态窗口,该如何让它的子窗口显示哪?
Private Sub FrmFather_Load()
    Me.show vbModal
    FrmChild.show vbModaless , Me
End Sub
大致就是这种意思,但出现的结果是FrmChild无法显示&&FrmFather无法关闭。
有什么方法可以使FrmFather为模态的同时还可以让FrmChild正常运行吗?
或者有什么方法可以实现下面代码的效果,(即焦点切换以后,FrmChild还是显示
在最前,但并不影响FrmFather(模态)上的操作)
Private Sub FrmFather_Load()
    FrmChild.show vbModaless , Me
End Sub

解决方案 »

  1.   

    那样的话, FrmChild启不是还是无法操作?
    有没有别的方法,我也怀疑用两个FORM是不可行的。
    我主要就是想实现一个类似于可以拖动的工具条,总在最前,
    又可以拖出FORM的范围。
      

  2.   

    TopMost这个词也许你很陌生,但具有TopMost窗口的软件你应该早就接触过,如Office97、网络吸血鬼、IE等。
      我们可以通过调用Windows API函数SetWindowPos来实现。
     
      一、SetWindowPos函数介绍 
      SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可。要想在VB中使用SetWindowPos函数,必须在程序的代码模块中进行如下的函数声明: 
      Declare Function SetwindowPos Lib "user32.dll" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags as Long)As Long 
      SetWindowPos函数各个参数的含义见表1。 
    表1 SetWindowPos函数的参数解释 参数名 参数含义 
    hwnd 要移动的窗口的句柄(可以用窗体的hwnd属性) 
    hWndInsertAfter 关于如何在Z轴上放置窗口的标记(具体见表2) 
    x 相当于窗口的Left属性 
    y 相当于窗口的Top属性 
    cx 相当于窗口的Right属性 
    cy 相当于窗口的Bottom属性 
    wFlags 关于如何移动窗口的标记(具体见表3) 表2 HWndInsertAfter参数的可能取值及含义 hWndInsertAfter的可能取值 功能 
    某一窗口的句柄 将窗口放在该句柄指定的窗口后面 
    HWND_BOTTOM(1) 把窗口放在Z轴的最后,即所有窗口的后面 
    HWND_TOP(0) 将窗口放在Z轴的前面,即所有窗口的前面 
    HWND_TOPMOST(-1) 使窗口成为“TopMost”类型的窗口,这种类型 
    的窗口总是在其它窗口的前面,真到它被关闭 
    HWND_NOTOPMOST(-2) 将窗口放在所有“TopMost”类型 
    窗口的后面、其它类型窗口的前面 表3 wFlags参数的可能值及含义 wFlags参数的可能值 功能 
    SWP_DRAWFRAME(&H20) 移动窗口后重画窗口及其上的所有内容 
    SWP_HIDEWINDOW(&H80) 隐藏窗口,窗口隐藏后既不出现在屏幕上也不出现在任 
    务栏上,但它仍然处于激活状态 
    SWP_NOACTIVATE(&H10) 窗口移动后不激活窗口,当然,如果窗口在移动前就是 
    激活的则例外 
    SWP_NOCOPYBITS(&H100) 当窗口移动后,不重画它上面的任何内容 
    SWP_NOMOVE(&H2) 不移动窗口(即忽略X和Y参数) 
    SWP_NOSIZE(&H1) 不改变窗口尺寸(即忽略Cx和Cy参数) 
    SWP_NOREDRAW(&H8) Do not remove the image of the window in its former position 
    from the screen. In other words,leave behind a ghost image 
    of the window in its old position 
    SWP_NOZORDER(&H4) 不改变窗口听Z轴位置(即忽略hWndInsertAfter参数) 
    SWP_SHOWWINDOW(&H40) 显示窗口(之前必须使用过SWP_HIDEWINDOW 
    隐藏窗口)     前面已提到,利用SetWindowPos函数可以决定窗口在Z轴中的位置,具体如何放置,需根据表2给hWndInsertAfter参数赋予合适的值。 
    另外,wFlags参数为SetWindowPos函数移动窗口提供了附加的特性,我们可以通过or运算将表3中若干个wFlags结合在一起使用,如SWP_NOMOVE Or SWP_NOSIZE既不移动窗口又不改变窗口的尺寸。但是要注意不要将功能冲突的值结合使用,如SWP_HIDEWINDOW Or SWP_SHOWWINDOW。    下面,我以一个简单的例子说明SetWindowPos函数的用法及如何实现TopMost类型窗口。新建工程,在普通窗体Form1上放置两个命令按钮cmdNormal和cmdTopMost,命令按钮的Caption属性分别为“变成普通窗口”和“变成TopMost窗口”。cmdNormal的Enabled属性为False。为工程添加代码模块Moudall,在其中放置如下声明代码: 
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long, ByVal cx As Long, ByVal cy As Long,ByVal wFlags As Long) As Long 
    Public Const SWP_NOMOVE= &H2 '不移动窗体 
    Public Const SWP_NOSIZE=&H1 '不改变窗体尺寸 
    Public Const Flag=SWP_NOMOVE Or SWP_NOSIZE 
    Public Const HWND_TOPMOST=-1 '窗体总在最前面 
    Public Const HWND_NOTOPMOST=-2 '窗体不在最前面 
    为窗体添加代码如下: 
    Private Sub cmdNormal_Click() 
    cmdTopMost.Enabled=True 
    cmdNormal. Enabled= False 
    Form1.Captio = "现在是普通窗口" 
    SetWindowPos Form1.hwnd,HWND_NOTOPMOST,0,0,0,0,Flag 
    End Sub 
    Private Sub cmdTopMost_Click() 
    cmdTopMost.Enabled = False 
    cmdNormal.Enabled = True 
    Form1.Caption = "现在是TopMost窗口" 
    SetWindowPos Form1.hwnd,HWND_TOPMOST,0,0,0,0,Flag 
    End Sub 
    按下F5,运行程序,单击“变成TopMost窗体”命令按钮,此时窗口即成为TopMost类型。随意打开桌面上的其它窗口,Form1总是处在其它窗口的前面;如果单击“变成普通窗体”按钮。则一切又恢复正常,一旦打开了其它窗口,则其它窗口会将Form1窗口覆盖。 
    。