zoukankan      html  css  js  c++  java
  • (转)C#如何在运行时通过鼠标拖动改变控件的大小

    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

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yanleigis/archive/2007/10/11/1819447.aspx

  • 相关阅读:
    Linux之间常用共享服务NFS
    linux共享服务Samba配置(Windows使用\访问)
    man alias
    seq awk tree 查看内核 分区 setup diff
    linux之sed用法
    linux下find(文件查找)命令的用法总结
    grep常见用法
    NTP服务及时间同步(CentOS6.x)
    我的pytest系列 -- pytest+allure+jenkins项目实践记录(1)
    软件生命周期&测试流程
  • 原文地址:https://www.cnblogs.com/lancidie/p/1896064.html
Copyright © 2011-2022 走看看