.net,C#如何在运行时通过鼠标拖动改变控件的大小

转载 2007年10月11日 08:42:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsApplication2
...{
    
class ResizeAction
    
...{
        
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 Form frm;
        
public ResizeAction(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);
        }

        
public void MouseMove(object 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 < this.frm.DesktopLocation.X + this.Wtap)
                        locationX 
= this.frm.DesktopLocation.X + this.Wtap;
                    
if (locationY < this.frm.DesktopLocation.Y + this.Htap)
                        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.Windows.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);
            }

        }

        
public void MouseDown(object sender, MouseEventArgs e)
        
...{
            
if (frm == null)
                
return;
            
if (e.X < this.ctrl.Width - 10 || e.Y < this.ctrl.Height - 10)
            
...{
                
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);
        }

        
public 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();
        }


    }

}


调用:
 
private void Form1_Load(object sender, EventArgs e)
        
...{
            
//WindowsApplication2.ResizeAction rs = new WindowsApplication2.ResizeAction(this.label1,this);
            WindowsApplication2.ResizeAction rs = new WindowsApplication2.ResizeAction(this.button1, this);   
        }

参考:http:
//www.cnblogs.com/DS-CzY/archive/2007/06/30/801377.aspx
 

利用C#更专业的实现运行时调整控件大小和位置

  • 2008年08月22日 10:34
  • 44KB
  • 下载

利用C#更专业的实现运行时调整控件大小和位置

从Delphi、VB到现在的Visual Studio .Net可视化的控件式编程越来越简化我们的开发过程,对于控件的可视化操作必不可少。在Visual Studio .Net的IDE中开发桌面应用程...
  • MYsce
  • MYsce
  • 2017年05月24日 00:25
  • 1432

新打开窗口可拖动调整大小和关闭代码

  • 2013年04月16日 12:56
  • 47KB
  • 下载

无边框窗体的拖动以及大小改变的实现方式

目前,界面流行扁平化,对于传统的window窗体,我们经常需要去掉窗体的边框,以求视角扁平化的效果。去掉窗体的边框很容易,关键是对于无边框的窗体,我们无法对其进行拖动,也无法通过拖动窗体边缘来改变窗体...
  • lwsas1
  • lwsas1
  • 2014年07月31日 14:20
  • 492

C# 实现拖拉控件改变位置与大小

前言:   很多时候我们需要在运行时,动态地改变控件的位置以及大小,以获得更好的布局。比如说实际项目中的可自定义的报表、可自定义的单据等诸如此类。它们有个特点就是允许客户或者二次开发人员设计它们...
  • hugo20
  • hugo20
  • 2016年05月30日 00:30
  • 4061

C#更专业的实现运行时调整控件大小和位置

从Delphi、VB到现在的Visual Studio .Net可视化的控件式编程越来越简化我们的开发过程,对于控件的可视化操作必不可少。在Visual Studio .Net的IDE中开发桌面应用程...
  • pepsisoft
  • pepsisoft
  • 2010年08月28日 14:53
  • 2189

textarea 在浏览器中固定大小和禁止拖动

HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...
  • CsethCRM
  • CsethCRM
  • 2013年07月03日 10:45
  • 185589

无边框对话框拖动改变大小的实现总结

同样是项目遇到的问题,要求是无边框的对话框要实现鼠标的拖动改变大小。无边框对话框跟有边框的实现肯定不一样喽。 我上网搜到一种方法是: 需要处理以下这三个消息:   ...
  • lyh03601
  • lyh03601
  • 2014年08月21日 08:53
  • 1741

c# winform 一个可以用鼠标改变控件位置和大小的类,调用即可

using System;   using System.Collections.Generic;   using System.Text;   using System.ComponentMo...
  • SunCherryDream
  • SunCherryDream
  • 2014年03月11日 12:15
  • 1143

Winform鼠标拖动改变控件大小、移动控件位置

基本逻辑: 1、鼠标移动过程(未按下鼠标左键)进行边界检测,当移动到控件边界时(某范围内),改变显示的光标; 2、此时,若按下鼠标左键(也可是右键),记录鼠标的位置和控件的大小; 3、按下鼠标左键移动...
  • beibeisong
  • beibeisong
  • 2015年12月28日 15:26
  • 1549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net,C#如何在运行时通过鼠标拖动改变控件的大小
举报原因:
原因补充:

(最多只允许输入30个字)