c#可以建立任意控制元件的拖動
{
mouse_offset = new Point(-e.X, -e.Y);
} 是不是非常easy喲. 下面是label1_MouseUp的程式碼: private void label1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
}
} 這個比較複雜,有必要介紹下, Point mousePos = Control.MousePosition;定義一個 Point,它包含滑鼠游標相對於螢幕左上角的座標。此時記錄的是當前滑鼠的位置,也就是最後放控制元件的位置. mousePos.Offset(mouse_offset.X, mouse_offset.Y);
是一個方法,
Point.Offset(Int32,Int32) 將此 Point 平移指定的量。 |
((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
這個裡面的sender大家應該很清楚吧,就是觸發事件的label1嘍,((Control)sender).Location 這句話就是指定label1的位置,((Control)sender).Parent當然就代表當前的Form1了,如果Form1巢狀在另外一個Form1裡面,那麼後面可以在有一個.Parent,即:((Control)sender).Parent.Parent,.......依次類推嘍.......
Control.PointToClient 方法,將指定螢幕點的位置計算成工作區座標。引數是:
要轉換的螢幕座標 Point。
事實工作已經完成了,很簡單吧,覺得汗吧......
下次介紹執行時怎樣動態新增控制元件.
下面把程式碼附上:
form1.desgener////////程式碼
namespace 窗體拖動1
{
partial class Form1
{
/// <summary>
/// 必需的設計器變數。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
/// <param name="disposing">如果應釋放託管資源,為 true;否則為 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗體設計器生成的程式碼
/// <summary>
/// 設計器支援所需的方法 - 不要
/// 使用程式碼編輯器修改此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(92, 86);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(101, 12);
this.label1.TabIndex = 0;
this.label1.Text = "滑鼠拖動控制元件練習";
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
this.label1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(292, 266);