C#窗体上绘制矩形

先上效果图

鼠标三个事件

private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            //记录开始点
            this.mousedown = true;
            this.startpoint = e.Location;

        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            //记录结束点。绘制到窗口上
            if (mousedown)
            {
                this.endpoint = e.Location;
                this.Refresh();
                gform.DrawImage(this.bmsave, new Point(0, 0));
                Rectangle rect = new Rectangle();
                this.rect_play(ref rect);

                gform.DrawRectangle(new Pen(Color.Black), rect);
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            //记录结束点。绘制到bitmap上
            this.endpoint = e.Location;
            this.mousedown = false;
            Rectangle rect = new Rectangle();
            this.rect_play(ref rect);
            g.DrawRectangle(new Pen(Color.Black), rect);
            gform.DrawImage(this.bmsave, new Point(0, 0));
        }

根据startpoint和endpoint两个点去确定要画的矩形Location和width,heigth

        private void rect_play( ref Rectangle rect)
        {
            //根据两个点确定矩形的左上角点Location
            if (this.startpoint.X > this.endpoint.X && this.startpoint.Y < this.endpoint.Y)
            {
                rect.Location = new Point(this.endpoint.X, this.startpoint.Y);
            }
            else if (this.startpoint.X < this.endpoint.X && this.startpoint.Y > this.endpoint.Y)
            {
                rect.Location = new Point(this.startpoint.X, this.endpoint.Y);

            }
            else if (this.startpoint.X > this.endpoint.X && this.startpoint.Y > this.endpoint.Y)
            {
                rect.Location = this.endpoint;
            }
            else
            {
                rect.Location = this.startpoint;
            }
            //获取两点的X,Y距离
            rect.Width = Math.Abs(this.startpoint.X - this.endpoint.X);
            rect.Height = Math.Abs(this.startpoint.Y - this.endpoint.Y);

            if (rect.Width == 0 && rect.Height == 0)
            {
                //防止误点的时候进行绘制
            }
            else if (rect.Width == 0)
            {
                rect.Width = 1;

            }
            else if (rect.Height == 0)
            {
                rect.Height = 1;
            }
        }

完整实例代码链接:http://pan.baidu.com/s/1sjkpic1

画的时候窗口闪的特别厉害啊,因为大量的Refresh和Draw,开双缓冲也不起多大作用

迟点有时间用QT c++做一个,QT写出来的应该是不会闪烁的

时间: 2024-12-15 01:57:05

C#窗体上绘制矩形的相关文章

7.2.2 在窗体上显示绘图

绘图与第四章的示例类似.因为绘图需要一定的时间,我们将在内存中创建位图,绘制好文档,然后,在窗体上显示位图,而不是每次窗体失效时都绘制文档.我们先看一下非常有用的函数式编程模式,这一节就将使用. "Hole in the Middle(中间有洞)"模式 [真心不知道,Hole in the Middle 是什么意思?] 写代码的一个常见情形,是首先进行初始化,然后,是函数的核心部分,最后,是一些清理工作:在程序中的多个位置,重复执行类似的操作,初始化和清理部分没有变化,而只有核心部分不

C#在pictureBox上绘制直线

1.在pictureBox上添加鼠标响应事件: this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown); this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove); 2.添加Bitmap作为画布,用于保存图形(

怎样绘制矩形

有三种方法: 1. ctx.fillRect(x, y, width, height); 2. ctx.strokeRect(x, y, width, height); 3. ctx.clearRect(x, y width, height); 方法1. ctx可以认为是一支画笔, 所有的和绘图有关的方法都在ctx上, 绘制矩形需要使用: ctx.fillRect(), 参数有四个, 分别为左上角xy坐标和矩形宽高. function draw() { var canvas = document

窗体上打个矩形的洞

step1 在窗体上打个矩形的洞{鼠标可以穿透这个窗体} procedure MakeRectHole(Ctrl:TWinControl;Form:TForm);var  Rgn1, Rgn2: HRGN;begin  Rgn1 := CreateRectRgn(0,0, Form.Width, Form.Height);  Rgn2 := CreateRectRgn(Ctrl.Left, Ctrl.Top,Ctrl.Left+ Ctrl.Width,Ctrl.Top+ Ctrl.Height)

OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标

涉及到两方面的内容:1. 用鼠标画出矩形.2.在图像上绘制出点的坐标 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍.需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback. 当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点. void CvMouseCallback(int event,int x,int y,int flags,void * param); event 为鼠标事件类型

【MFC】父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的,直接在对话框的类向导中的虚函数里边添加PreCreateWindow函数,但是实际上有没有用就没有试过.望试验的告知,谢谢.) 在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中添加下面的代码可以固定窗口大小 cs.style = WS_OVERLAPPE

js在web页面上绘制圆形

在web页面上,想要画出一个圆形,方法有很多,SVG.canvas都可以绘图.但是本文不采用这两种方式,而是使用一个div.div一般是一个矩形,但是如果设置一个圆角样式border-radius就可以将div变成圆形. 圆的位置需要在画布中绝对定位(position: absolute),也就是通过设置X.Y坐标在定位,对应的css样式是left.top.想要圆的绝对定位起效,画布就要设置position:relative. <!DOCTYPE html> <html> <

窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

WS_CLIPCHILDREN,使得父窗体在绘制时留出其上的子窗体的位置不去画它,而那片区域留着子窗体去画.WS_CLIPSIBLINGS,必须用于子窗体,使得该子窗体在收到WM_PAINT时同时令其共父的诸多子窗体(MSDN讲必须不在该区域,即不与之重叠)也会被PAINT. //下面也是对WS_CLIPSIBLINGS的理解所有的overlapped窗口和popup窗口,都有WS_CLIPSIBLINGS 属性,这些窗口不能在它的sibling窗口上绘图 对于child窗口,如果没有这个属性,

PHP 使用GD库生成验证码 在图像上绘制汉字

PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像. 更加方便的是,PHP 可以直接将图像数据流输出到浏览器. 要想在 PHP 中使用图像处理功能,你需要连带 GD 库一起来编译 PHP. GD 库和 PHP 可能需要其他的库, 这取决于你要处理的图像格式. 你可以使用 PHP 中的图像函数来获取下列格式图像的大小: JPEG, GIF, PNG, SWF, TIFF 和 JPEG2000.如果联合 ex