拖动的问题

xxl713930 2004-12-15 11:52:57
我将两个文本框和一个按钮紧挨着,按钮在两个文本框中间,当我左右移动按钮时,文本框的宽度也变化,即一个变小一个变大,但总宽度不变,不只应用什么事件,我用了窗体的dragdrop和按钮的mousemove都不能很好的实现。请大侠们指点一二:)
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxl713930 2004-12-15
  • 打赏
  • 举报
回复
好复杂啊,有没有简单一些的
tztz520 2004-12-15
  • 打赏
  • 举报
回复
用API吧,你试一下这个效果.(要一个模块,一个窗体)

模块代码:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_MENUSELECT = &H11F

Public preWinProc As Long

Public Function wndproc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo acd
Select Case Msg
Case 534
Form1.Text1.Width = Form1.Command1.Left - Form1.Text1.Left
Form1.Text2.Width = (Form1.Text2.Width + Form1.Text2.Left) - (Form1.Command1.Left + Form1.Command1.Width)
Form1.Text2.Left = Form1.Command1.Left + Form1.Command1.Width
Case Else '否则送到原来的处理函数
wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)
End Select
Exit Function
acd:
wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)
End Function



'窗体代码(一个command控件,名为Command1,两个textbox控件,名分别是Text1和Text2)
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 HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1


Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Command1.hWnd, GWL_WNDPROC) '记录原本的Window Procedure的位址
ret = SetWindowLong(Command1.hWnd, GWL_WNDPROC, AddressOf wndproc) '将处理的函数地址改为自己的处理函数地址
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Command1.hWnd, GWL_WNDPROC, preWinProc) '取消Message的截取,而使之又只送往原来的Window Procedure
End Sub


Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
ReleaseCapture
SendMessage Command1.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End If
End Sub
cindytsai 2004-12-15
  • 打赏
  • 举报
回复
帮等高手解答 :)
seraph2 2004-12-15
  • 打赏
  • 举报
回复
在窗体中移动控件你总会做吧?
如果上面我说的你会的话,用CMD的LEFT和WIDTH指定两个TEXT的宽度和LEFT不就可以了吗?
还有啊!我说的东西最好写在MOVE事件下!
我和他们不一样,我不太喜欢给代码!
别找我要!做人靠自己。我只能给你思路
xxl7102 2004-12-15
  • 打赏
  • 举报
回复
哈哈,自己解决了,直接用moveup改变他们的wdith和left就行了,简单好多,但还是很谢谢tztz520老兄。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧