如何拖动窗体上的控件?

mast 2003-01-06 05:22:53
如何拖动窗体上的Image控件,就想用户在C++Builder设计窗口界面一样,可以任意拖动控件.
...全文
123 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2003-01-08
  • 打赏
  • 举报
回复
To zjqc:
好好看看我在上面写的,怎么只学到第一点,没有学到第二点啊。
zjqc 2003-01-08
  • 打赏
  • 举报
回复
我在这边试验!发现是可以拖动!不过是把控件变成了一个小窗体一样!就是控件可以关闭的!根本不是正常的拖动哦!大侠!
mustang_zr 2003-01-08
  • 打赏
  • 举报
回复
gz
yuanque 2003-01-08
  • 打赏
  • 举报
回复
呵呵,
我用的就是handler,感觉不错
大大怪老张 2003-01-08
  • 打赏
  • 举报
回复
关注
jishiping 2003-01-07
  • 打赏
  • 举报
回复
一样啊。

static int name=2;
TImage *tmp=new TImage(this);
tmp->Name.printf("Image%d",name++);
//tmp->WindowProc=MyWindowProc;
tmp->OnEndDock =Image1EndDock;
tmp->DragKind= dkDock;
tmp->DragMode= dmAutomatic; //要设成dmAutomatic
tmp->Transparent=true;
tmp->Center=true;
tmp->Stretch=true;
tmp->Canvas->TextOutA(3,5,tmp->Name);
tmp->Picture= Image1->Picture ;
tmp->Parent=this; //注意这儿,尽量用this,而不要用Form1
DockSite = true;

void __fastcall TForm1::Image1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
痞子酷 2003-01-07
  • 打赏
  • 举报
回复
to jishiping(JSP 季世平)
自定义申请得Timage控件怎么实现拖动??
static int name=2;
TImage *tmp=new TImage(this);
tmp->Name.printf("Image%d",name++);
tmp->WindowProc=MyWindowProc;
// tmp->OnEndDock =Image1EndDock;
tmp->DragKind= dkDock;
tmp->DragMode= dmManual;
tmp->Transparent=true;
tmp->Center=true;
tmp->Stretch=true;
tmp->Canvas->TextOutA(3,5,tmp->Name);
tmp->Picture= Image1->Picture ;
tmp->Parent=Form1;
void __fastcall TForm1::MyWindowProc(Messages::TMessage &Message)
{
//怎么写呀,给个提示吧,有源代码更能好,谢谢!!!
}
2001xwc 2003-01-07
  • 打赏
  • 举报
回复
454
yuanque 2003-01-07
  • 打赏
  • 举报
回复
如果想做成像CB里控件托动的样子,JSP的方法不算太好
痞子酷 2003-01-07
  • 打赏
  • 举报
回复
jishiping(JSP 季世平)
更好!!!!
myy 2003-01-07
  • 打赏
  • 举报
回复
真要象BCB的设计Form那样,同意用第三方控件,如 Handler 就不错。
痞子酷 2003-01-07
  • 打赏
  • 举报
回复
谢谢1!!!
是我搞错啦,
我从image1 属性copy时没有注意,copy成啦dmManual而不是dmAutomatic啦
我双击全选,则copy啦dmManual,我还一位是dmAutomatic呢,image1双击时自动选择啦另一个:)
gk0205 2003-01-06
  • 打赏
  • 举报
回复
我记下了
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)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
RomanticProgrammer 2003-01-06
  • 打赏
  • 举报
回复
对于没有窗口句柄的控件,比如Image,用设置它的坐标的方法来拖动.
而对于有窗口句柄的控件,比如Edit,可以用这样的方法拖动:
在它的OnMouseMove中:
void __fastcall TForm1::Edit1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
ReleaseCapture();
(dynamic_cast<TEdit*>(Sender))->Perform(WM_SYSCOMMAND,0xF012, 1);
}


}
yuanque 2003-01-06
  • 打赏
  • 举报
回复
在mousemove,mouseup,mousedown写基本可以做到,但不如做成一个通用的控件比较好,这有一个外国人用delphi写的,1000行,贴不上,有邮箱可以发给你:)
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;
}
//---------------------------------------------------------------------------
实现按牛的移动
yuyulily 2003-01-06
  • 打赏
  • 举报
回复
你怎么提2个一样的问题啊?
yuyulily 2003-01-06
  • 打赏
  • 举报
回复
private:
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;
}
}
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);
}



加载更多回复(1)

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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