在執行時使用滑鼠移動控制元件和改變控制元件的大小 (轉)
在執行時使用滑鼠移動和改變控制元件的大小:namespace prefix = o ns = "urn:schemas--com::office" />
我寫了一個類,使用它可以透過滑鼠自由移動所有放到窗體上的控制元件,也可以自由的改變其大小。這個類只可以處理窗體上的控制元件,如果你有興趣,可以補充一點程式碼,使得這個類可以處理更復雜的情形,比如,在Panel控制元件上的控制元件。
類程式碼
public class Resize
{
bool IsMoving=false;
int ctrlLastWidth=0;
int ctrlLastHeight=0;
int ctrlWidth;
int ctrlHeight;
int ctrlLeft;
int ctrlTop;
int cursorL;
int cursorT;
int ctrlLastLeft;
int ctrlLastTop;
int Htap;
int Wtap;
bool ctrlIsResizing=false;
System.Drawing.Rectangle ctrlRectangle = new System.Drawing.Rectangle();
private Control ctrl;
private Fofrm;
public Resize(Control c,Form frm)
{
ctrl=c;
this.frm=frm;
this.Htap=this.frm.Height-this.frm.ClientRectangle.Height;
this.Wtap=this.frm.Width-this.frm.ClientRectangle.Width;
ctrl.MouseDown+=new MouseEventHandler(MouseDown);
ctrl.MouseMove+=new MouseEventHandler(MouseMove);
ctrl.MouseUp+=new MouseEventHandler(MouseUp);
}
private void MouseMove( sender,MouseEventArgs e)
{
if (frm==null)
return;
if (e.Button==MouseButtons.Left)
{
if(this.IsMoving)
{
if (ctrlLastLeft == 0)
ctrlLastLeft = ctrlLeft;
if (ctrlLastTop==0)
ctrlLastTop = ctrlTop;
int locationX=(Cursor.Position.X-this.cursorL+this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Location.X);
int locationY=(Cursor.Position.Y-this.cursorT+this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Location.Y);
if(locationX locationX=this.frm.DesktopLocation.X+this.Wtap; if(locationY locationY=this.frm.DesktopLocation.Y+this.Htap; this.ctrlLeft=locationX; this.ctrlTop=locationY; ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLastLeft,this.ctrlLastTop); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System..Forms.FrameStyle.Dashed); ctrlLastLeft = ctrlLeft; ctrlLastTop = ctrlTop; ctrlRectangle.Location = new System.Drawing.Point(ctrlLeft,ctrlTop); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); return; } int sizeageX = (Cursor.Position.X-this.frm.DesktopLocation.X-this.Wtap-this.ctrl.Location.X); int sizeageY = (Cursor.Position.Y-this.frm.DesktopLocation.Y-this.Htap-this.ctrl.Location.Y); if (sizeageX < 2) sizeageX = 1; if (sizeageY < 2) sizeageY = 1; ctrlWidth = sizeageX; ctrlHeight = sizeageY; if (ctrlLastWidth == 0) ctrlLastWidth = ctrlWidth; if (ctrlLastHeight==0) ctrlLastHeight = ctrlHeight; if (ctrlIsResizing) { ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.ctrl.Left+this.Wtap,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top); ctrlRectangle.Size = new System.Drawing.Size(ctrlLastWidth,ctrlLastHeight); } ctrlIsResizing = true; ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); ctrlLastWidth = ctrlWidth; ctrlLastHeight = ctrlHeight; ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); } } private void MouseDown(object sender,MouseEventArgs e) { if (frm==null) return; if (e.X { this.IsMoving=true; this.ctrlLeft=this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left; this.ctrlTop=this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top; this.cursorL=Cursor.Position.X; this.cursorT=Cursor.Position.Y; this.ctrlWidth=this.ctrl.Width; this.ctrlHeight=this.ctrl.Height; } ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLeft,this.ctrlTop); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); } private void MouseUp(object sender,MouseEventArgs e) { if (frm==null) return; ctrlIsResizing = false; if (this.IsMoving) { ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLeft,this.ctrlTop); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); this.ctrl.Left=this.ctrlLeft-this.frm.DesktopLocation.X-this.Wtap; this.ctrl.Top=this.ctrlTop-this.frm.DesktopLocation.Y-this.Htap; this.IsMoving=false; this.ctrl.Refresh(); return; } ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top); ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight); ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed); this.ctrl.Width = ctrlWidth; this.ctrl.Height = ctrlHeight; this.ctrl.Refresh(); } } } 如何使用這個類 假設窗體上有兩個控制元件listBox1和toolBar1,你可以在適當的時機(一般在窗體的Load事件中)加入下面的語句就可以了。 Resize r1=new Resize(this.toolBar1,this); Resize r4= new Resize(this.listBox1,this); 其他 你也可以新增一些方法,使得在需要的時候可以停止滑鼠移動控制元件的功能,比如: public void Stop() { ctrl.MouseDown- =new MouseEventHandler(MouseDown); ctrl.MouseMove- =new MouseEventHandler(MouseMove); ctrl.MouseUp- =new MouseEventHandler(MouseUp); }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992955/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java實現控制元件的移動及使用滑鼠改變控制元件大小Java控制元件
- 實現控制元件的移動、改變大小(DELPHI實現) (轉)控制元件
- 一勞永逸讓VB自動改變控制元件大小控制元件
- 在BCB中陣列的妙用和紀錄和改變控制元件的狀態 (轉)陣列控制元件
- 動態移動控制元件 (轉)控制元件
- 動態新增控制元件時,計算控制元件大小的解決方法控制元件
- [VB.net][WinForm]Panel控制元件移動\滑鼠拖動ORM控制元件
- 滑鼠移動到button顏色改變的實現
- Android 動態佈局 動態生成 銷燬控制元件 改變控制元件的位置等Android控制元件
- 關於使用ADOQuery控制元件動態執行SQL查詢 (轉)控制元件SQL
- 使用工廠方法在執行時動態建立不同型別的列表行專案控制元件試讀版型別控制元件
- js 改變 控制元件的屬性值JS控制元件
- 按enter時,控制元件焦點自動移動控制元件
- 改變滑鼠指標 (轉)指標
- 關於gridview改變行內容事件需要點選別的行或控制元件才能執行View事件控制元件
- 在Delphi中使用IP控制元件 (轉)控制元件
- 在delphi中使用flash控制元件 (轉)控制元件
- Solaris 執行等級的改變(轉)
- WPF執行緒中獲取控制元件的值和給控制元件賦值執行緒控制元件賦值
- Qt 判斷滑鼠在某一控制元件上QT控制元件
- 控制元件treeview的使用 (轉)控制元件View
- tkinter中scale拖拉改變值控制元件(十一)控制元件
- 使用hint改變執行計劃
- android 獲取控制元件大小和設定調整控制元件的位置XYAndroid控制元件
- 改變自定義UIButton裡子控制元件的位置UI控制元件
- Android之改變控制元件的背景及形態Android控制元件
- 解決 Retrofit 多 BaseUrl 及執行時動態改變 BaseUrl ?
- vb窗體中控制元件自動隨窗體變化大小(原始碼)控制元件原始碼
- GridView滑鼠移動變色View
- 在VB程式中,透過程式碼改變Combo控制元件只讀屬性Style值 (轉)控制元件
- 在BCB中輕鬆使用ActiveX控制元件 (轉)控制元件
- 在repeater、datalist控制元件中使用分頁功能 (轉)控制元件
- 如何在滑鼠單擊Edit控制元件時全選text控制元件
- 解決Retrofit多BaseUrl及執行時動態改變BaseUrl(二)
- 使用委託及控制元件的invoke方法處理窗體控制元件的跨執行緒訪問控制元件執行緒
- Silverlight Rectangle控制元件滑鼠移入時的提示框控制元件
- easysize_動態調整對話方塊控制元件位置和大小控制元件
- combo box控制元件的使用 (轉)控制元件