高手赐教,怎样自动实现拖放功能?

qybao 2003-12-30 03:19:57
窗体的控件可以随意拖放,而且所有容器支持控件拖放(前提),
现在我想通过SendMessage发送消息实现该控件的拖放,
请问如何实现?

比如,窗体中的某个按钮(Button)在一个面板(Panel)上,
我现在知道该按钮(Button)的句柄,Panel的句柄可要可不要(我认为),
我想用SendMessage发送消息,使得按钮(Button)拖动到另一个面板(Panel)上,这个面板(Panel)的句柄也是可要可不要(我认为)。

本人的想法是这样的:
1.先给按钮(Button)发送鼠标左键按下的消息 WM_LBUTTONDOWN
2.然后再发送鼠标移动的消息 WM_MOUSEMOVE 把鼠标移到另一个面板(Panel)上
3.最后再发送鼠标左键释放消息 WM_LBUTTONUP
问题是发送鼠标移动消息的时候,什么反应也没有,不知道 WM_MOUSEMOVE 这个消息是如何发送的,而且我查看过帮助,发送该消息时,可以再带个参数 MK_LBUTTON ,这样可以在移动的时候同时也按住鼠标左键,是这样吗?

本人还想过另一种方法:
就是把按钮剪贴到剪贴板上,然后再从剪贴板复制到另一个面板上,这样会有什么问题吗?不过这样就需要知道目标面板(Panel)的句柄,而根据现有的条件,本人有可能无法获得目标Panel的句柄,因为是别人写的程序,里面的Panel很多,而且也没有相关的字符串标识(text,name或caption没有),但如果是鼠标拖动的话,可以找到位置(因为有相对位置)。

还望各位高手指点一下如何实现,或者给点思路和意见,分不够可以再加!

...全文
103 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
leolan 2003-12-31
  • 打赏
  • 举报
回复
不知樓主所說的是不是--------要像VB裡面設計模式時那樣的拖放功能.
如果是的話,我這收藏了一個,希望能幫得到你~????
rainstormmaster 2003-12-31
  • 打赏
  • 举报
回复
用不着api:
用VB实现拖放功能

  拖放是用鼠标拖动一个文件到其它对象的活动。在图形操作过程中,拖放是最常用的功能之一,下面我们来看看怎样用VB实现拖放功能。
  首先介绍与拖放有关的控件:
  1.属性:DragMode决定拖动操作的初始化是人工方式还是自动方式      DragIcon确定在拖动过程中显示的指针的图标形状
  2.方法:Drag开始,结束或取消拖动控件
  3.事件:MouseDown事件发生于用户按下鼠标按钮时。DragOver事件发生于拖动操作完成时。DragDrop事件发生于拖动操作正在进行时。
  然后编写一个小程序,这个程序能实现在窗口中或窗口间拖动图标的功能。建立窗口Form1和Form2,在窗口中都加入Image1,其中Form1下的Image1.picture为你想显示的图标。
  Form1下程序代码为:
  Option Explicit
  Dim dragx As Single
  Dim dragy As Single
  Const BEGIN_DRAG=1
  Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
    Image1.Picture=Source   ;Sourse为被拖动的控件
  Form2.Image1.Picture=LoadPicture(″″)
  Image1.Move(X-dragx),(Y-dragy); X,Y为鼠标所在目标窗体或控件的当前坐标
  End Sub
  Private Sub Form_Load()
   Load Form2
   Form2.Show 0
  End Sub
  Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,
X As Single,Y As Single)
   dragx=X
   dragy=Y
   Image1.Drag BEGIN_DRAG   ;开始拖动操作
   Image1.DragIcon = LoadPicture(″按下鼠标时想显示的光标″)
  End Sub
   Form2下程序代码为:
  Option Explicit
  Dim dragx As Single
  Dim dragy As Single
  Const BEGIN_DRAG=1
  Private Sub Form_DragDrop(Source As Control,X As Single,Y As Single)
   Image1.Picture=Source
   Form1.Image1.Picture=LoadPicture(″″)
   Image1.Move(X-dragx),(Y-dragy)
  End Sub
  Private Sub Image1_MouseDown(Button As Integer, Shift As Integer,
X As Single,Y As Single)
   dragx=X
   dragy=Y
   Image1.Drag BEGIN_DRAG
   Image1.DragIcon=LoadPicture(″按下鼠标时想显示的光标″)
  End Sub
  本程序在VB5.0,Window95环境下通过。
qybao 2003-12-31
  • 打赏
  • 举报
回复
多谢楼上的兄弟,虽然你们结果不是我想要的
这个问题现在是本人做的项目的一个难点
希望更多的高手来帮忙解决这个问题
qybao 2003-12-31
  • 打赏
  • 举报
回复
我想再说明一下:
我要移动的控件不是自己程序的控件
而是其他程序(别人写好的,而且开发语言是未知的)窗体里的控件
我通过Windows API获得了该控件的句柄
现在我想实现该控件的拖放
拖放的过程及结果也是在其他程序的窗体里
所以自己的程序的各种鼠标事件(MouseDown等等)应该是不适用的
那样只能控制自己程序窗体的控件
而不是其他程序窗体里的控件

我不知道大家明白我的意思吗?
我想通过自己的程序去控制别人的程序
移动的控件在别人的程序里
所以我认为只能通过发送消息来处理
但我发送消息后并没有能实现
鼠标左键按下和释放是可以的
就是鼠标移动的时候没反应
希望高手们帮我看看到底如何发送鼠标移动消息

LanceJin 2003-12-31
  • 打赏
  • 举报
回复
看看这个《VB中用API实现文件拖放》

http://www.yesky.com/SoftChannel/72342371928637440/20030908/1726758.shtml
zsy_good 2003-12-31
  • 打赏
  • 举报
回复
procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Button2.Perform(WM_SYSCOMMAND,$f012,0);
end;
qybao 2003-12-31
  • 打赏
  • 举报
回复
to ch21st(风尘鸟.shannon)
没关系的
这个问题我觉得相当棘手
希望能号召更多的高手来研究一下这个问题
多谢你的热情帮助
道素 2003-12-31
  • 打赏
  • 举报
回复
对不起刚才没看全你的要求,先取消我前面的发言
道素 2003-12-31
  • 打赏
  • 举报
回复
我不大明白你到底要实现的是什么,是过程还是结果,如果只是结果改变一下控件的Container属性就可以了
Option Explicit

Private Sub Command1_Click()
Set Command3.Container = Picture1
Command3.Move Command3.Container.ScaleWidth - Command3.Width / 2, Command3.Container.ScaleHeight - Command3.Height / 2

End Sub

Private Sub Command2_Click()
Set Command3.Container = Frame1
Command3.Move Frame1.Width - Command3.Width / 2, Frame1.Height - Command3.Height / 2

End Sub
qybao 2003-12-30
  • 打赏
  • 举报
回复
怎么没有人回答吗?
有没有高手帮忙帮忙?

1,488

社区成员

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

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