软件注册站
热情软件屋

 
把我的窗体象oicq那样控制它自由的伸缩
编号: QA004836    
建立日期: 2004年1月1日 最后修改日期: 2004年1月1日
所属类别: Visual Basic - 窗体与菜单
   
    操作系统: win98 win2000 winXP win me
    编程工具: vb
    问题: 老师们 我有个问题:
    就是我想把我的窗体象oicq那样控制它自由的伸缩,就是当窗体的top等于0左右时 鼠标离开就缩回去 鼠标再放上去的时候又伸回来
    我的代码
    '控制隐藏窗体
    MouseEnter = (0 <= X) And (X <= Me.Width) And (0 <= Y) And (Y <= Me.Height) '计算鼠标的移动是否在窗体上
    If MouseEnter Then '鼠标已经进入
     SetCapture Me.hWnd
     If Me.Top < 0 Then
     Do Until Me.Top = 0
     If Me.Top > -30 Then Me.Top = 0 '伸出到 top = 0
     Me.Top = Me.Top + 30
     Loop
     End If
    Else '鼠标已经离开
     If Me.Top = 0 Then
     Do Until Me.Top = 80 - Me.Height '80 是 露一点窗体在外面
     If Me.Top <= 80 - Height Then Me.Top = 80 - Me.Height
     Me.Top = Me.Top - 30
     Loop
     End If
     ReleaseCapture
    End If
    

    运行时控制不好 鼠标在上面的时候还不能伸,就是控制不好鼠标的获取和释放。希望老师指点。
    水平: 刚入门(尘封)
   
    作者的思路基本上是对的,主要是实现方式上不太妥当,应该把窗体的隐藏和显示放在一个计时器内,这样执行的效果就基本上满足需求了,我更改后的源码如下:
    '注意
    1:要使得执行效果最好,请把窗体的BorderStyle=0
    2:计时器的执行频率设为20左右,移动过程较为平滑
    3: 由于窗体隐藏的条件为Me.Top <= 100 所以请自已加上移动窗体的代码,当移动窗体到me.top <=100左右时,再移开鼠标,将开始隐藏窗体.
    Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    Private 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
    Private Const HWND_TOPMOST = -1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    
    Private mybShow As Boolean '模块变量,进行显示还是隐藏
    
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
     Dim MouseEnter As Boolean
     MouseEnter = (0 <= X) And (X <= Me.Width) And (0 <= Y) And (Y <= Me.Height) '计算鼠标的移动是否在窗体上
     If MouseEnter Then '鼠标已经进入,进行显示
     If Me.Top < 0 Then
     mybShow = True
     Timer1.Enabled = True
     End If
     SetCapture Me.hwnd
     Else '鼠标已经离开
     If Me.Top <= 100 Then '如顶部露在外面,则进行隐藏
     mybShow = False
     Timer1.Enabled = True
     End If
     ReleaseCapture
     End If
    End Sub
    
    Private Sub Timer1_Timer()
     If mybShow Then '显示
     If Me.Top < -100 Then
     Me.Top = Me.Top + 100
     Else
     Me.Top = 0
     Timer1.Enabled = False
     End If
     Else
     If Me.Top + Me.Height > 100 Then '底部露在外面,进行隐藏
     Me.Top = Me.Top - 100
     Else
     Me.Top = 10 - Me.Height
     Timer1.Enabled = False
     End If
     End If
    End Sub
    '另外我加了下面的语句,使你的窗体始终置于顶上,这样,当用户在使用其他程序时,还可以响应到鼠标的进入.
    Private Sub Form_Load()
     me.Top =0
     SetWindowPos Me.hwnd, HWND_TOPMOST, Me.Left, Me.Top, Me.Width, Me.Height, SWP_NOMOVE Or SWP_NOSIZE
    End Sub
    

    

此问题由wenejiang回答。

附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 窗体与菜单, form, window, tform

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio