如何拖动窗体上的Image控件?

mast 2003-01-06 05:22:06
如何拖动窗体上的Image控件,就想用户在C++Builder设计窗口界面一样,可以任意拖动控件.
...全文
98 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsdgs 2003-01-06
  • 打赏
  • 举报
回复
收藏了,CSDN真好,我才来不久就给了我很多帮助,可惜就是可用分太少了
jishiping 2003-01-06
  • 打赏
  • 举报
回复
我也是查找源程序才知道这个(TWinControl*)0xFFFFFFFF的。在源程序里,定义了一个常量 NullDockSite = TWinControl($FFFFFFFF); 表示控件的DockSite为空白的。如果没有上面的一行代码,用户也可以拖动控件,第一次和现在的一样,但是再次拖动时,控件会出现在一个窗口里。上面的代码,就是避免出现上面的情况。
Dock 就是控件可以拖拉到别的DockSite=true的控件上。拖拉时有被拖拉控件的外形。而Drag类似于资源管理器里的拖拉文件的情形。
weibz0525 2003-01-06
  • 打赏
  • 举报
回复
还是斑竹狠,佩服!能解释一下?
Image1->HostDockSite = (TWinControl*)0xFFFFFFFF;//???
另外Dock和Drag什么区别啊?
jishiping 2003-01-06
  • 打赏
  • 举报
回复
其实很简单,不需要写什么程序:
1. 设定Image的属性DragKind=dkDock; DragMode=dmAutomatic; 设定Form
的属性DockSite=true。
2. 在Image的事件OnEndDock里写一行代码就可以了:
void __fastcall TForm1::Image1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
Image1->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
windcsn 2003-01-06
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Button1MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall Button1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
private: // User declarations
POINT CurPos,LastPos;
bool MouseIsDown;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(MouseIsDown)
{
DoubleBuffered = true;
if(Shift.Contains(ssLeft)==true)
{
GetCursorPos(&CurPos);
if(LastPos.x != CurPos.x ||LastPos.y != CurPos.y)
{
Button1->Top = CurPos.y - LastPos.y +Button1->Top;
Button1->Left = CurPos.x - LastPos.x+Button1->Left;
LastPos.x = CurPos.x;
LastPos.y = CurPos.y;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button == mbLeft)
{
GetCursorPos(&LastPos);
MouseIsDown = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button == mbLeft)
MouseIsDown = false;
}
//---------------------------------------------------------------------------
将Button1改为Image1即可
netsys2 2003-01-06
  • 打赏
  • 举报
回复
去搜索一下吧,已经解决了。

用OnMouseDown记录鼠标位置,用SetCapture函数使鼠标处于被捕获状态,用OnMouseMove跟踪鼠标移动,一直移动到OnMouseUp事件发生。

int MouseX,MouseY;
bool xCapture;
TFrmMain::Image1MouseDown(...)
{
SetCapture(Image1->Handle);
xCapture = true;
MouseX = x;
MouseY = y;
}
TFrmMain::Image1MouseMove(...)
{
if( xCapture)
{
Image1->Left = Image1->Left-(MouseX - x);
Image1->Top = Image1->Yop-(MouseY - y);
}
}
TFrmMain::Image1MouseUp(...)
{
ReleaseCapture();
xCapture = false;
Image1->Left = Image1->Left-(MouseX - x);
Image1->Top = Image1->Yop-(MouseY - y);
}

牧牛人软件 2003-01-06
  • 打赏
  • 举报
回复
同意
yuyulily 2003-01-06
  • 打赏
  • 举报
回复
rivate:
int iX0 ;
int iY0 ;




void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
int iDeltaX, iDeltaY;
if(Shift.Contains(ssLeft))
{
iDeltaX = X - iX0;
iDeltaY = Y- iY0;
if(iDeltaY)
Image1->Left += iDeltaX;
if(iDeltaY)
Image1->Top += iDeltaY;
}
}

13,873

社区成员

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

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