先上效果图

鼠标三个事件

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

根据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);

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

            }
            )
            {
                rect.Height = ;
            }
        }

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

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

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

如果哪位前辈有能解决闪烁问题的,希望在评论区留言,感激不尽


补:http://www.cnblogs.com/magicianlyx/p/4987169.html 这个是QT版本的,不会闪烁

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

  1. 如何用 matlab 在图片上绘制矩形框 和 添加文字 ?

    如何给图像添加矩形框?以及添加想要输入的文字 ? 案例程序,如下所示: clc; close all; clear all;image = imread('/home/wangxiao/Picture ...

  2. Javascript高级编程学习笔记(86)—— Canvas(3)绘制矩形

    绘制矩形 矩形是唯一一种可以直接在2D上下文中绘制的形状. 与矩形有关的方法包括: fillRect() strokeRect() clearRect() 上述方法都接收四个参数: 绘制矩形的 X 坐 ...

  3. Opencv在视频中静态、动态方式绘制矩形框ROI

    Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是"静态的",一种是"动态的" ...

  4. vue下canvas绘制矩形

    起因:根据项目需求本人写了一个绘制矩形的组件.功能:在图片中绘制矩形,根据图片大小进行自适应展示,获取图片矩形坐标.思路:首先定义一个固定大小的DIV,DIV标签中有监测鼠标变化的四个事件moused ...

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

    涉及到两方面的内容:1. 用鼠标画出矩形.2.在图像上绘制出点的坐标 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍.需要用到两个函数:回调函数CvMouseCallback和注册回 ...

  6. c#在pictureBox控件上绘制多个矩形框及删除绘制的矩形框

    在pictureBox上每次只绘制一个矩形框,绘制下一个矩形框时上次绘制的矩形框取消,代码如链接:https://www.cnblogs.com/luxiao/p/5625196.html 在绘制矩形 ...

  7. [C#绘图]在半透明矩形上绘制字符串

    首先要绘制一个半透明的矩形,用到的方法当然是FillRectangle().这个函数在调用的时候除了要指明要绘制的矩形外,还要指明填充矩形的背景色.具体的方法就是在绘制矩形的时候传给它一个画刷Brus ...

  8. 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...

  9. opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像

    前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...

随机推荐

  1. CentOS Python 安装MySQL-python

    一.安装mysql yum list | grep mysql >>yum install -y mysql-server mysql mysql-devel CentOS 7的yum源中 ...

  2. eclipse spring4 ehache2.10 整合

    http://blog.csdn.net/tonytfjing/article/details/39251507 http://my.oschina.net/duoduo3369/blog/17392 ...

  3. 最新精品 强势来袭 XP,32/64位Win7,32/64位Win10系统【电脑城版】

    随着Windows 10Build 10074 Insider Preview版发布,有理由相信,Win10离最终RTM阶段已经不远了.看来稍早前传闻的合作伙伴透露微软将在7月底正式发布Win10的消 ...

  4. c++中的重载、覆盖和隐藏

    1 重载发生在同一个类内部. 同一个类内部,具有相同的函数名,但是参数列表不同,那么就是重载.因为c++编译器编译时,将函数名和函数列表一起对函数进行了重命名. 2 覆盖和隐藏发生在子类和父类之间. ...

  5. Linux就该这么学--了解Shell脚本

    有人曾经将Shell形容是人与计算机硬件的“翻译官”,Shell作为用户与Linux系统通讯的媒介.自身也定义了各种变量和参数,并提供了诸如循环.分支等高级语言才有的控制结构特性.如何正确的使用这些功 ...

  6. Linux就该这么学--命令集合10(vim编辑器)

    1.vim编辑器的命令模式中常用的快捷键: dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在整行 5yy 复制从光标处开始的5行 p 将之前删除(dd)或复制 ...

  7. 关于Spring注解 @Service @Component @Controller @Repository 用法

    @Component 相当于实例化类的对象,其他三个注解可以理解为@Component的子注解或细化. 在annotaion配置注解中用@Component来表示一个通用注释用于说明一个类是一个spr ...

  8. View 视图动画基础

  9. vue.use解析

    vue.use源码: Vue.use = function (plugin) { /*判断插件是否已引入*/ if (plugin.installed) { return } //倒序为一个数组[] ...

  10. Mysql远程登陆错误:ERROR 2003

    不能远程登陆Mysql,错误:ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.0.114' (10060).原因是电脑防火墙 ...