当前位置:编程学习 > C#/ASP.NET >>

c#画图问题

如何用鼠标画一个长方形,并且可以按需要拖动改变大小,像许多软件中一样有一个边框,有八个方向可以拖动的那样子。。给点思路也行 谢谢。 --------------------编程问答--------------------   private bool m_Mouser = false;
        private Point m_MouserPoint = new Point();
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (m_Mouser)
            {
                panel1.Refresh();
                Rectangle _Rectangle = new Rectangle();
                _Rectangle.X = m_MouserPoint.X;
                _Rectangle.Y = m_MouserPoint.Y;
                _Rectangle.Width = e.Location.X - m_MouserPoint.X;
                _Rectangle.Height = e.Location.Y - m_MouserPoint.Y; 
                ControlPaint.DrawReversibleFrame(GetUprightRectangle(_Rectangle), Color.White, FrameStyle.Thick);
            }

        }

        /// <summary>
        /// 根据矩形 如果Width是正直接返回 如果使-会转换成正的矩形 保证大小位置不变
        /// </summary>
        /// <param name="p_Rectangle">矩形</param>
        /// <returns>正矩形</returns>
        public static Rectangle GetUprightRectangle(Rectangle p_Rectangle)
        {
            Rectangle _Rect = p_Rectangle;
            if (_Rect.Width < 0)
            {
                int _X = _Rect.X;
                _Rect.X = _Rect.Width + _Rect.X;
                _Rect.Width = _X - _Rect.X;
            }
            if (_Rect.Height < 0)
            {
                int _Y = _Rect.Y;
                _Rect.Y = _Rect.Height + _Rect.Y;
                _Rect.Height = _Y - _Rect.Y;
            }
            return _Rect;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                m_Mouser = true;
                m_MouserPoint = e.Location;
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            m_Mouser = false;
        }
坐标自己换算下把. --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Point p = new Point();
        Rectangle rect;
        ArrayList al = new ArrayList();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.DoubleBuffered = true;
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                p = e.Location;
                rect = new Rectangle();
            }
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                rect.X = e.X > p.X ? p.X : e.X;
                rect.Y = e.Y > p.Y ? p.Y : e.Y;
                rect.Width = e.X - p.X > 0 ? e.X - p.X : p.X - e.X;
                rect.Height = e.Y - p.Y > 0 ? e.Y - p.Y : e.Y - p.Y;
                this.Invalidate();
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            al.Add(rect);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = new Pen(Color.Red, 3);
            e.Graphics.DrawRectangle(pen, rect);
            foreach (Rectangle re in al)
            {
                e.Graphics.DrawRectangle(pen, re);
            }
            pen.Dispose();
        }
    }
}
--------------------编程问答-------------------- 楼上确定能八个方向拖动吗……
8个方向得分8种情况讨论了,举个例子:
矩形的左上角的点是x0,y0。那么当mousedown事件的(e.x==x0 && e.y==y0),此时设置flag1=true;
picturebox1.refresh(); 此时对矩形进行重绘。
其他几种情况类似,分别重绘即可。
如果嫌四个顶点不好点中,可用四个小的GraphicsPath,然后用g.isvisible判断是否点中。
(至于四条边,也可以用粗一些的四个GraphicsPath进行判断) --------------------编程问答-------------------- 高手。。。学习中 --------------------编程问答-------------------- 这个简单 鼠标按下 记下起点  拖动  左键谈起 
生成一个自定义的usercontrol

在user control 里面编写鼠标 事件  支持4个边框 拖拽

就是离某个边只有3个像素的时候 就改变鼠标图形 然后可以拖动这边 --------------------编程问答-------------------- 这个简单 鼠标按下 记下起点  拖动  左键谈起 
生成一个自定义的usercontrol

在user control 里面编写鼠标 事件  支持4个边框 拖拽

就是离某个边只有3个像素的时候 就改变鼠标图形 然后可以拖动这边 --------------------编程问答-------------------- 这个简单 鼠标按下 记下起点  拖动  左键谈起 
生成一个自定义的usercontrol

在user control 里面编写鼠标 事件  支持4个边框 拖拽

就是离某个边只有3个像素的时候 就改变鼠标图形 然后可以拖动这边 --------------------编程问答-------------------- UP楼上的,这个方法可取 --------------------编程问答-------------------- 我做过这样的组件,需要的话,联系我。

附带源码!
补充:.NET技术 ,  .NET技术前瞻
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,