C#實現GDI+基本圖的縮放、拖拽、移動


public Form1()//窗體構造函數
{
InitializeComponent();
//窗體中控件的事件晚期綁定
for (int i = 0; i < this.Controls.Count; i++)
{
this.Controls[i].MouseDown += new MouseEventHandler(MyMouseDown);
this.Controls[i].MouseLeave += new EventHandler(MyMouseLeave);
this.Controls[i].MouseMove += new MouseEventHandler(MyMouseMove);
}
}
///


/// 有關鼠標樣式的相關枚舉
///

private enum EnumMousePointPosition
{
MouseSizeNone = 0, //無
MouseSizeRight = 1, //拉伸右邊框
MouseSizeLeft = 2, //拉伸左邊框
MouseSizeBottom = 3, //拉伸下邊框
MouseSizeTop = 4, //拉伸上邊框
MouseSizeTopLeft = 5,//拉伸左上角
MouseSizeTopRight = 6,//拉伸右上角
MouseSizeBottomLeft = 7,//拉伸左下角
MouseSizeBottomRight = 8,//拉伸右下角
MouseDrag = 9 //鼠標拖動
}
const int Band = 5;//范圍半徑
const int MinWidth = 10;//最低寬度
const int MinHeight = 10;//最低高度
private EnumMousePointPosition m_MousePointPosition; //鼠標樣式枚舉
private Point m_lastPoint; //光標上次移動的位置
private Point m_endPoint; //光標移動的當前位置
//鼠標按下事件
private void MyMouseDown(object sender, MouseEventArgs e)
{
m_lastPoint.X = e.X;
m_lastPoint.Y = e.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y;
}

    //鼠標離開控件的事件
    private void MyMouseLeave(object sender, System.EventArgs e)
    {
        m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;
        this.Cursor = Cursors.Arrow;
    }

    //鼠標移過控件的事件
    private void MyMouseMove(object sender, MouseEventArgs e)
    {
        Control lCtrl = (sender as Control);//獲得事件源
        //左鍵按下移動
        if (e.Button == MouseButtons.Left)
        {
            switch (m_MousePointPosition)
            {
                case EnumMousePointPosition.MouseDrag:
                    lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
                    lCtrl.Top = lCtrl.Top + e.Y - m_lastPoint.Y;
                    break;
                case EnumMousePointPosition.MouseSizeBottom:
                    lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
                    m_endPoint.X = e.X;
                    m_endPoint.Y = e.Y; //記錄光標拖動的當前點                      
                    break;
                case EnumMousePointPosition.MouseSizeBottomRight:
                    lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;
                    lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
                    m_endPoint.X = e.X;
                    m_endPoint.Y = e.Y; //記錄光標拖動的當前點                       
                    break;
                case EnumMousePointPosition.MouseSizeRight:
                    lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;
                    //lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
                    m_endPoint.X = e.X;
                    m_endPoint.Y = e.Y; //記錄光標拖動的當前點
                    break;
                case EnumMousePointPosition.MouseSizeTop:
                    lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
                    lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
                    break;
                case EnumMousePointPosition.MouseSizeLeft:
                    lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
                    lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
                    break;
                case EnumMousePointPosition.MouseSizeBottomLeft:
                    lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
                    lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
                    lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
                    m_endPoint.X = e.X;
                    m_endPoint.Y = e.Y; //記錄光標拖動的當前點
                    break;
                case EnumMousePointPosition.MouseSizeTopRight:
                    lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
                    lCtrl.Width = lCtrl.Width + (e.X - m_endPoint.X);
                    lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
                    m_endPoint.X = e.X;
                    m_endPoint.Y = e.Y; //記錄光標拖動的當前點                       
                    break;
                case EnumMousePointPosition.MouseSizeTopLeft:
                    lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
                    lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
                    lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
                    lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
                    break;
                default:
                    break;
            }
            if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth;
            if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight;
        }
        else
        {
            //'判斷光標的位置狀態 
            m_MousePointPosition = MousePointPosition(lCtrl.Size, e);
            switch (m_MousePointPosition)  //改變光標
            {
                case EnumMousePointPosition.MouseSizeNone:
                    this.Cursor = Cursors.Arrow;//箭頭
                    break;
                case EnumMousePointPosition.MouseDrag:
                    this.Cursor = Cursors.SizeAll;//四方向
                    break;
                case EnumMousePointPosition.MouseSizeBottom:
                    this.Cursor = Cursors.SizeNS;//南北
                    break;
                case EnumMousePointPosition.MouseSizeTop:
                    this.Cursor = Cursors.SizeNS;//南北
                    break;
                case EnumMousePointPosition.MouseSizeLeft:
                    this.Cursor = Cursors.SizeWE;//東西
                    break;
                case EnumMousePointPosition.MouseSizeRight:
                    this.Cursor = Cursors.SizeWE;//東西
                    break;
                case EnumMousePointPosition.MouseSizeBottomLeft:
                    this.Cursor = Cursors.SizeNESW;//東北到南西
                    break;
                case EnumMousePointPosition.MouseSizeBottomRight:
                    this.Cursor = Cursors.SizeNWSE;//東南到西北
                    break;
                case EnumMousePointPosition.MouseSizeTopLeft:
                    this.Cursor = Cursors.SizeNWSE;//東南到西北
                    break;
                case EnumMousePointPosition.MouseSizeTopRight:
                    this.Cursor = Cursors.SizeNESW;//東北到南西
                    break;
                default:
                    break;
            }
        }
    }
    //坐標位置判定
    private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e)
    {
        if ((e.X >= -1 * Band) | (e.X <= size.Width) |
            (e.Y >= -1 * Band) | (e.Y <= size.Height))
        {
            if (e.X < Band)
            {
                if (e.Y < Band)
                {
                    return EnumMousePointPosition.MouseSizeTopLeft;
                }
                else
                {
                    if (e.Y > -1 * Band + size.Height)
                    {
                        return EnumMousePointPosition.MouseSizeBottomLeft;
                    }
                    else
                    {
                        return EnumMousePointPosition.MouseSizeLeft;
                    }
                }
            }
            else
            {
                if (e.X > -1 * Band + size.Width)
                {
                    if (e.Y < Band)
                    { return EnumMousePointPosition.MouseSizeTopRight; }
                    else
                    {
                        if (e.Y > -1 * Band + size.Height)
                        { return EnumMousePointPosition.MouseSizeBottomRight; }
                        else
                        { return EnumMousePointPosition.MouseSizeRight; }
                    }
                }
                else
                {
                    if (e.Y < Band)
                    { return EnumMousePointPosition.MouseSizeTop; }
                    else
                    {
                        if (e.Y > -1 * Band + size.Height)
                        { return EnumMousePointPosition.MouseSizeBottom; }
                        else
                        { return EnumMousePointPosition.MouseDrag; }
                    }
                }
            }
        }
        else
        { return EnumMousePointPosition.MouseSizeNone; }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM