窗体处于最前端,但还不完全是最前端,因为要位于开始状态条的后边效果类似于Foxmail中收、发邮件时候右下角弹出的窗体~~
解决方案 »
- vb执行sql语句能不能像java一样用占位符方式?="select * from tab where name=?"
- 心乱如麻。。。。唉。。。。。。。
- vb怎么实现自动编译?
- 急问:关于控件下载与用户权限的问题(在线等)。来者有分,不够再追加!
- 用vb怎样调用用db2数据库编写的存储过程?
- 如何检验两个数据库的结构是否一致?
- 请问在窗体中没有mci控件,如只调用mcisendstring函数是否也可以在窗体中播放视频文件
- 利用VB执行已有的exe文件,可以控制其窗口的位置吗?
- 有谁知道哪里有下载VB6.0的??
- 请问 能在.dll应用timer控件 急急急急急急!!
- 求不规则文本框控件
- 截取封包问题,急,(在线等)。。。。
你需要的可能是这个函数。
SetForegroundWindow VB声明
Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
说明
将窗口设为系统的前台窗口。这个函数可用于改变用户目前正在操作的应用程序
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,带到前台的窗口
注解
不应随便使用它,因为一旦程序突然从后台进入前台,可能会使用户产生迷惑
详细说明:Private Sub Form_Load()
'设置窗体为最上层
Me.Top = CurSysFrm.Height + 100
Me.Left = CurSysFrm.Width - Me.Width
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, 3'取消:SetWindowPos(OnTop.hwnd, -2, 0, 0, 0, 0, 3)
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Me.Top = Me.Top - 100
If Me.Top <= CurSysFrm.Height - Me.Height Then
Timer1.Enabled = False
End If
End Sub开始的时候,窗体在右下角不可见的位置,一点点移动上来,移动的时候,要求在所有窗体之上,但是在任务栏之下,上边的程序作出来,是在所有的,包括任务栏之上拉
'设置窗体为最上层
Me.Top = Screen.Height
Me.Left = Screen.Width - Me.Width'取消:SetWindowPos(OnTop.hwnd, -2, 0, 0, 0, 0, 3)
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Me.Top = Me.Top - 100
If Me.Top <= Screen.Height - Me.Height Then
Timer1.Enabled = False
End If
End Sub
网络上给得让任务栏保持最顶端的Api并不好用,郁闷~~
但是任务栏是固定的,也是置顶的窗体,这时候我需要这两个置顶的窗体:
任务栏和我的程序窗体有个次序,也就是说,任务栏更在我窗体的前边!!SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, 3hTaskBar = FindWindow("Shell_TrayWnd", vbNullString)
SetWindowPos hTaskBar, -1, 0, 0, 0, 0, 3但是这样子写了之后,我一旦让我的程序获得焦点,任务栏就跑到后边去了,SetWindowPos第三个参数是z序列,怎么能让任务栏的位置在程序之前呢?
----------------------------------------------------------------
原贴内容:
帖子我看了,可是还是不明白,你具体要实现的效果
----------------------------------------------------------------
原贴内容:
http://expert.csdn.net/Expert/topic/2692/2692011.xml?temp=.3427851
谢谢~~
' 在Form1中添加一个按钮Command1。
' 在Form2中添加两个定时器,一个Timer1,一个Timer2。
' 运行后单击Form1中的按钮,会看到一个黑色的窗口缓缓滚出。符合楼主的要求!!!' Form1中的代码:
Option ExplicitPrivate Sub Command1_Click()
Form2.Show
End Sub' Form2中的代码:Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private 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
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)Private Const HWND_NOTOPMOST = -2
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypeDim hTaskbar As Long, TaskbarHeight As LongPrivate Sub Form_Load()
Dim rctTaskbar As RECT
Me.BackColor = vbBlack
Me.Top = Screen.Height
Me.Left = Screen.Width - Me.Width
hTaskbar = FindWindow("Shell_TrayWnd", vbNullString)
GetWindowRect hTaskbar, rctTaskbar
TaskbarHeight = (rctTaskbar.Bottom - rctTaskbar.Top) * Screen.TwipsPerPixelY
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
SetWindowPos hTaskbar, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
Timer1.Interval = 1
Timer1.Enabled = True
End SubPrivate Sub Timer1_Timer()
Me.Top = Me.Top - 100
SetForegroundWindow hTaskbar
If Me.Top <= Screen.Height - TaskbarHeight - Me.Height + 60 Then
Timer1.Enabled = False
Sleep 2000
Timer2.Interval = 1
Timer2.Enabled = True
End If
End SubPrivate Sub Timer2_Timer()
Me.Top = Me.Top + 100
If Me.Top >= Screen.Height Then
Timer2.Enabled = False
SetWindowPos hTaskbar, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
Unload Me
End If
End Sub
2、下移后依旧在状态栏之前循环使用SetForegroundWindow~~??昨天我们几个朋友实现的方法是利用鼠标移动的时候,使用SetWindowPos;就是不知道SetWindowPos的第三个参数,那个z序列能否对程序有所帮助~~
'设置鼠标按下,页面下移
Timer1.Enabled = True
SetForegroundWindow hTaskBar
InfoFrm.Enabled = False
Timer1.Interval = 1
MoveSize = -100
End SubPrivate Sub Timer1_Timer()
Me.Top = Me.Top - MoveSize
If MoveSize > 0 Then
If Me.Top <= CurSysFrm.Height - Me.Height Then
Timer1.Enabled = False
End If
Else
SetForegroundWindow hTaskBar
If Me.Top > CurSysFrm.Height Then
Unload Me
End If
End If
End Sub
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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
说明
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,欲定位的窗口
hWndInsertAfter Long,窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:
HWND_BOTTOM 将窗口置于窗口列表底部
HWND_TOP 将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序
HWND_TOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的前面
HWND_NOTOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的后面
x Long,窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
y Long,窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
cx Long,指定新的窗口宽度
cy Long,指定新的窗口高度
wFlags Long,包含了旗标的一个整数
SWP_DRAWFRAME 围绕窗口画一个框
SWP_HIDEWINDOW 隐藏窗口
SWP_NOACTIVATE 不激活窗口
SWP_NOMOVE 保持当前位置(x和y设定将被忽略)
SWP_NOREDRAW 窗口不自动重画
SWP_NOSIZE 保持当前大小(cx和cy会被忽略)
SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略)
SWP_SHOWWINDOW 显示窗口
SWP_FRAMECHANGED 强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变
注解
窗口成为最顶级窗口后,它下属的所有窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有下属和物主窗口也会转为非最顶级。Z序列用垂直于屏幕的一根假想Z轴量化这种从顶部到底部排列的窗口顺序