如何做拖拽FORM上的控件位置[在线等]

微笑的水 2005-09-08 09:14:32
举个例子:
一个窗体上有 几个 Label。

我想实现,选择Form上的一个 label 并且让他能随着鼠标移动。

类似我们在IDE中调整控件位置一样。不过要求是在运行的程序中,选取,并移动某个控件。

谢谢,在线等。马上结贴。
...全文
160 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
微笑的水 2005-09-08
  • 打赏
  • 举报
回复
正是: jinjazz(近身剪(充电中...)) 的 方法 可如何。十分感谢!!
leonkim 2005-09-08
  • 打赏
  • 举报
回复
在D e l p h i的集成开发环境中,可以用鼠标在窗体上拖动控件进行界面设计。在程序的运行
期间也可以通过拖动实现控件的移动。可以使用函数P e r f o r m来传递Wi n d o w s消息给控件,用
来完成控件的移动。
P e r f o r m函数的原型如下:
function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
其中参数M s g传递一个消息的I D号。消息通过W p a r a m、L p a r a m传递给进程。
下面的例程S 4 _ 1 0对运行时控件的移动进行了说明。在例程S 4 _ 1 0的窗体中,有一个E d i t组
件和一个用来说明的L a b e l组件,可以使用鼠标使E d i t组件在窗体中移动。
具体实现过程如下:
1) 通过File | New Application创建一个新工程。
2) 在窗体F o r m 1中添加一个E d i t组件和一个L a b e l组件。
3) 在E d i t 1组件的O n M o u s e D o w n事件的处理过程中添加以下代码:
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
c o n s t
SC_DragMove=$F012;
b e g i n
R e l e a s e C a p t u r e ;
(Sender as TWi n C o n t r o l ) . P e r f o r m ( W M _ S y s C o m m a n d , S C _ D r a g M o v e , 0 ) ;
e n d ;
4) 编译、链接和运行程序,测试效果。
说明:
• 读者可以将常数S C _ D r a g M o v e的数值改成其他数值,如改成:
SC_DragMove=$F020;
运行后测试效果。
• 上面的拖动只能对窗口控件进行。
• 上面拖动的实际用途可以让用户改变C o n t r o l B a r中各组件的位置。
118基本第二部分Delphi 编程的核心技能
微笑的水 2005-09-08
  • 打赏
  • 举报
回复
窗口上会有 N 个控件, 要选定某个。 控件不是固定的。

楼上的回答,是固定了 label1 那 label2 ,edit1,..... 怎么办?

谢谢,请在帮忙。
jinjazz 2005-09-08
  • 打赏
  • 举报
回复
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Button1.PerForm(WM_syscommand,$F012,0);
end;


zhangheaaa 2005-09-08
  • 打赏
  • 举报
回复
通过MouseMove事件、DragOver事件、EndDrag事件实现,例如在PANEL上的LABEL:
var xpanel,ypanel,xlabel,ylabel:integer;
PANEL的MouseMove事件:xpanel:=x;ypanel:=y;
PANEL的DragOver事件:xpanel:=x;ypanel:=y;
LABEL的MouseMove事件:xlabel:=x;ylabel:=y;
LABEL的EndDrag事件:label.left:=xpanel-xlabel;label.top:=ypanel-ylabel;
在用C#桌面程序时,有时后会碰到要修改WinForm 窗体的系统边框样式(系统镶边样式)。如,改变标题栏 的背景,系统图标,系统按钮,或者要一个自己的 窗体,有自己的背景。那么直接调用win32内部c语言函数 很不方便。怎样才能有自己的系统边框的C#窗体呢? 我想就是有几年工作经验的程序员,也会觉得那是很麻烦的事。那么,为什么不把这个工作封装成一个控件呢? 下面,是我自己根据以往的经验,了一个自定义系统边框控件。 使用方法是,自己用图形编辑软件画好窗体背景,然后把此图片作为窗体的背景图片。 再把form窗体的FormBorderStyle属性设置成None; 然后,在窗体代码文件中定义一个控件类对象:public partial class Form1 : Form { CustomBorder.CustomBorderEx cbe = null; public Form1() { InitializeComponent(); cbe = new CustomBorder.CustomBorderEx(this); } } 就可以定义能实现窗体拖动功能的边框。 public partial class Form1 : Form { CustomBorder.CustomBorderEx cbe = null; public Form1() { InitializeComponent(); cbe = new CustomBorder.CustomBorderEx(this, true,new Size(100,100)); } } 上面可以定义一个带拖动,拉伸窗体,调整大小的边框。 有时候需要在关联的窗体上放一些可以随窗体大小改变而自动调整成合适大小位置控件容器,如,Panel控件。 那么应该把它的大小和位置定为一个客户区内。 得到客户区的方法是 Rectangle rt = cbe.ClientRegion;下面是一个可以正常工作的自定义窗体。 public partial class Form1 : Form { CustomBorder.CustomBorderEx cbe = null; public Form1() { InitializeComponent(); cbe = new CustomBorder.CustomBorderEx(this, true,new Size(100,100)); Rectangle rt = cbe.ClientRegion; this.panel1.Location = new Point(rt.X, rt.Y); this.panel1.Size = new Size(rt.Width, rt.Height); } //窗体的Resize事件处理程序 private void Form1_Resize(object sender, EventArgs e) { cbe.InvalidateCompute(); Rectangle rt = cbe.ClientRegion; this.panel1.Location = new Point(rt.X, rt.Y); this.panel1.Size = new Size(rt.Width, rt.Height); } } 上面代码是从边框控件得到可用客户区的位置和大小。 然后,在窗体Resize事件相应方法中把panel1容器的 位置和大小设置成客户区的值。 注意,在调用cbe.ClientRegion之前,最好先调用cbe.InvalidateCompute();方法一下,重新计算一下边框和客户区的位置和大小。 那么,之后我们只要在窗体设计器中,注意把我们的其他一些控件(如,Button 等),放到panel1里面就行。(如果不用上面办法,panel1的大小和位置覆盖住整个winform窗体的话,会导致边框的事件捕捉不到,出现,不能拖动,不能调整大小的情况。) //------------------ 那么自定义系统边框的控件主要的方法有如下几个: 1构造方法: new CustomBorder.CustomBorderEx(this, true,new Size(100,100)); 第一个参数,要关联的winform窗体;第二个参数,表示是否可以改变窗体的 大小;第三个参数,窗体的最小宽和高值。 2属性: cbe.ClientRegion 用来得到窗体从新计算后的客户区大小。 3成员方法: cbe.InvalidateCompute();从新计算调整窗体后的边框位置和大小,客户区位置和大小。 //----------------- 这个控件的版本是v1.0版的,由于工作忙,业余时间少,可能还不够完美。相信以后的版本会好些。

5,402

社区成员

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

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