在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
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
解决方案 »
- 日期段截断
- 庆祝图表组件wsChart升级到4.5(DLL版)散分100!
- VB6.0在XP里写的一个小程序,那到其他机子上无论什么系统一小部分机子可以运行,其他的一运行就是非法操作.大家帮帮
- ComboBox如何快速排序?(半夜还在弄程序哦:-(
- 有扩展名是asa的数据库吗?
- 用VB与ACCESS开发的日期格式的奇怪问题
- [在线]这是我用反编译软件读出来的请问怎么写成VB代码?
- 谁编译过能带参数的程序?
- VB有没有类似电驴的源代码??
- 重贴:为何我通过Adodc和DataGrid增加更新数据时,数据并没有保存在DB中?
- 一个打包问题
- 用VB开发的MTS组件,移到另一台Server上不能直接用,需要重新编译!Why?
有没有别的方法,我也怀疑用两个FORM是不可行的。
我主要就是想实现一个类似于可以拖动的工具条,总在最前,
又可以拖出FORM的范围。
我们可以通过调用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窗口覆盖。
。