VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 145|回复: 13

[求助] 请教前辈:为什么VB窗体在这种情况下会移动动位置?

[复制链接]
发表于 2018-6-5 09:07:17 | 显示全部楼层 |阅读模式
本帖最后由 bruly 于 2018-6-5 14:59 编辑

请教前辈:
      1、我建立了一个VB窗体,里面有Combo1,添加了若干个选项(Combo1.AddItem "1" ……)
      2、为了方便移动窗体,我写了如下代码(目的是按着窗体本身,后可以拖动窗体):
  1. Dim Xxx1 As Single, Yyy1 As Single
  2. '窗体的公用变量
  3. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  4.     MovedownWind X, Y
  5. End Sub

  6. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  7.     MoveMoveWind Button, X, Y
  8. End Sub

  9. Sub MovedownWind(X As Single, Y As Single)
  10.     Xxx1 = X
  11.     Yyy1 = Y
  12. End Sub
  13. Sub MoveMoveWind(Button As Integer, X As Single, Y As Single)
  14.     If Button <> 1 Then Exit Sub
  15.     Me.Move Me.Left - Xxx1 + X, Me.Top - Yyy1 + Y
  16. End Sub
复制代码

问题来了:
        运行程序,点击Combo1右侧的倒三角形进行选取时(只是滚动查看,还没有来得及点击其中某项):
        如果我不点击任何项,而是点击窗体的其它地方,结果整个窗体发生了位移,用F8查看,就是上面代码的的原因。
      请问能避免窗体这种移动事情发生吗,如何处理呢(我要的是只有按住窗体本身才移动窗体)?
       谢谢。
发表于 2018-6-5 12:54:14 | 显示全部楼层
很难解
点击Combo1右侧的倒三角形进行选取时,如果不选择项目,这时不会激活窗体的任何鼠标事件,不会更新xxx1和yyy1的值

评分

参与人数 1威望 +4 人气 +1 收起 理由
bruly + 4 + 1 赞一个

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-5 15:02:34 | 显示全部楼层
yiziwuya 发表于 2018-6-5 12:54
很难解
点击Combo1右侧的倒三角形进行选取时,如果不选择项目,这时不会激活窗体的任何鼠标事件,不会更新 ...

感谢老师指点。另请问,点击倒三角形,算combo1的获取焦点事件吗?还是有其它方法表示哈
回复 支持 反对

使用道具 举报

发表于 2018-6-5 18:01:30 | 显示全部楼层
试试这样:



  1. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2.     Static IsDown As Boolean
  3.     Static LastX As Single
  4.     Static LastY As Single
  5.     If Button <> 1 Then
  6.         IsDown = False
  7.     ElseIf IsDown Then
  8.         Me.Move Me.Left - LastX + X, Me.Top - LastY + Y
  9.     Else
  10.         LastX = X
  11.         LastY = Y
  12.         IsDown = True
  13.     End If
  14. End Sub

复制代码

评分

参与人数 2威望 +10 人气 +3 收起 理由
bruly + 8 + 1 很给力
yiziwuya + 2 + 2 很给力

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2018-6-5 18:01:53 | 显示全部楼层
电脑卡,发重复了
回复 支持 反对

使用道具 举报

发表于 2018-6-6 07:46:43 | 显示全部楼层
不是电脑卡,是论坛卡。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-6 09:22:37 | 显示全部楼层

太强大了,非常感谢 ~!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-6 09:38:03 | 显示全部楼层

我之前找到过API方法,也可以移动无边框,但后来发现它有所不足,具体原因忘记了,但总的意思是:
       如果窗体使用了比较多的API,其中有的API功能会与这个API发生类似功能上的紊乱,导致窗体运行不佳或是出现问题。当然,也很有可能是我个人水平不高,没有发现其中的奥秘所在。
      下面分享API移动无边窗体的方法:
  1. '无边框:(配合SendMessage)
  2. Private Declare Function ReleaseCapture Lib "user32" () As Long
  3. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

  4. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  5.     ReleaseCapture
  6.     Call SendMessage(Me.hWnd, &H112, &HF010& + 2, 0)
  7. End Sub
复制代码
回复 支持 反对

使用道具 举报

发表于 2018-6-6 10:09:45 | 显示全部楼层
bruly 发表于 2018-6-6 09:38
我之前找到过API方法,也可以移动无边框,但后来发现它有所不足,具体原因忘记了,但总的意思是:
      ...

鼠标按下时,发消息欺骗系统,以为是按下的是非客户区域,因此能移动窗体,下面的代码用宏代替常数,或许你就知道为什么了。

Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbLeftButton Then
        ReleaseCapture
        SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
    End If
End Sub

评分

参与人数 1威望 +3 人气 +1 收起 理由
bruly + 3 + 1 很给力

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-6 10:31:11 | 显示全部楼层
LionCSQ 发表于 2018-6-6 10:09
鼠标按下时,发消息欺骗系统,以为是按下的是非客户区域,因此能移动窗体,下面的代码用宏代替常数,或许 ...


原来还有这么一层关系,受益了。感谢老师~!
            另外由此我发现另一个方法,用我在一楼的代码可以移动无边窗体,而且点击combo1中的倒三角形时,窗体不移动,不知道是不是这样,我尝试过没问题:
                 即在部件中引用控件:microsoft forms 2.0 object library,然后添加新的combo1控件,而不是VB6系统自带的那个combo1。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2018-6-18 06:19

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表