C# GDI在控件上绘图

本文以以在chart控件上和窗体上画矩形为例子

不多解释了,代码很简单。

还有一些童鞋要别的源码,给我发邮箱吧

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Configuration;

namespace WFApp2
{
    public partial class data : Form
    {
        public data()
        {
            InitializeComponent();
            //窗体
            g = this.CreateGraphics();
            //chart控件
            g2 = this.chart1.CreateGraphics();
        }

        public Point firstPoint = new Point(0, 0);  //鼠标第一点
        public Point secondPoint = new Point(0, 0);  //鼠标第二点
        public bool begin = false;   //是否开始画矩形
        /// <summary>
        /// 在from上画矩形
        /// </summary>
        Graphics g;

        /// <summary>
        /// 在chart1控件上画矩形
        /// </summary>
        Graphics g2;

        /// <summary>
        /// 在窗体上按下鼠标事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void data_MouseDown(object sender, MouseEventArgs e)
        {
            begin = true;
            firstPoint = new Point(e.X, e.Y);
        }

        /// <summary>
        /// 在窗体上鼠标移动开始绘图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void data_MouseMove(object sender, MouseEventArgs e)
        {
            if (begin)
            {
                //清除窗体绘图面,相当于刷新了一次窗体界面然后重新绘制
                g.Clear(this.BackColor);
                //获取新的右下角坐标
                secondPoint = new Point(e.X, e.Y);
                //获取两个数中的大者或小者
                int minX = Math.Min(firstPoint.X, secondPoint.X);
                int minY = Math.Min(firstPoint.Y, secondPoint.Y);
                int maxX = Math.Max(firstPoint.X, secondPoint.X);
                int maxY = Math.Max(firstPoint.Y, secondPoint.Y);

                //画框
                g.DrawRectangle(new Pen(Color.Red), minX, minY, maxX - minX, maxY - minY);
                //ControlPaint.DrawReversibleFrame(new Rectangle(minX, minY, maxX - minX, maxY - minY),this.BackColor,FrameStyle.Dashed);

            }
        }

        /// <summary>
        /// 鼠标松开停止绘图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void data_MouseUp(object sender, MouseEventArgs e)
        {
            begin = false;
        }

        /// <summary>
        /// 在chart控件上移动鼠标绘图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
            if (begin)
            {
                //重新在chart上面绘图,此处不能用clear方法,clear会清除整个绘图界面chart控件会被清除
                this.Refresh();
                //获取新的右下角坐标
                secondPoint = new Point(e.X, e.Y);
                int minX = Math.Min(firstPoint.X, secondPoint.X);
                int minY = Math.Min(firstPoint.Y, secondPoint.Y);
                int maxX = Math.Max(firstPoint.X, secondPoint.X);
                int maxY = Math.Max(firstPoint.Y, secondPoint.Y);

                //画矩形
                g2.DrawRectangle(new Pen(Color.Red), minX, minY, maxX - minX, maxY - minY);

            }
        }

        /// <summary>
        /// 鼠标松开停止绘图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseUp(object sender, MouseEventArgs e)
        {
            begin = false;
        }

        /// <summary>
        /// 在chart控件上按下鼠标
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseDown(object sender, MouseEventArgs e)
        {
            begin = true;
            firstPoint = new Point(e.X, e.Y);
        }

    }
}
时间: 2024-10-12 20:41:07

C# GDI在控件上绘图的相关文章

Android控件上添加图片

项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是android:drawableLeft 就可以将pic设置到text的左边.good.... 2.代码中: TextView txtlikedList = new TextView(this.getContext()); Drawable drawable= getResources().getD

OpenCV获取摄像头视频并在MFC的Picture控件上显示

分为两步:OpenCV获取摄像头数据+图像在Picture上显示 第一步:OpenCV获取摄像头数据 参考:http://www.cnblogs.com/epirus/archive/2012/06/04/2535190.html http://blog.sina.com.cn/s/blog_6dbe9bdb0100nii7.html http://blog.csdn.net/augusdi/article/details/8762961 #include "stdafx.h" #in

MFC 学习之 模态对话框图片控件上作图

首先说明一点,onpaint 是更新面板用的,作图的话应在控件上进行. 新建 MFC 对话框工程,面板上添加按钮 IDC_START , IDC_SHOW , IDC_STOP 添加两个对话框,ID 分别设为(简写)ld 和 cd. ld 上添加三个图片控件,并且每一个均关联一个 CSTATIC 型变量. cd 上添加一个图片控件,操作如上. 分别为两个对话框添加类,名称自己设,我的是 CLineDlg 和 CCompDlg . 主对话框头文件中包含两个类的头文件. 添加声明: CLineDlg

如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主窗口有菜单.工具条等,想用鼠标绘图, 把鼠标轨迹映射到窗口部件上,这些问题. 其实最主要的是获得窗口部件的起始点相对主窗口的位置. 例如:在主窗口拖入一个QScrollArea 在其上放一个QLabel用来显示鼠标事件. 可以在ui对象结构上看到如下结构. 大家知道,我们可以用pos()来获得某一窗

WPF如何将数据库中的二进制图片数据显示在Image控件上

首先在xaml文件里定义一个Image控件,取名为img MemoryStream stream = new MemoryStream(获得的数据库对象): BitMapImage bmp = new BitMapImage(); bmp.BeginInit();//初始化 bmp.StreamSource = stream;//设置源 bmp.EndInit();//初始化结束 img.Source = bmp;//设置图像Source 很多人用这个方法都没有初始化BitMapImage ,这

C# 多线程修改控件时,提示在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate { btnRefresh.Enabled = true; }); 但是假如在多线程操作还没完成的时候,我就提前关闭窗体,则会引发InvalidOperationException,提示 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” ,并且如果没有捕获到,则可能导致程序崩溃,直接关闭. 百度之后,发现需要判断控件的

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

今天关闭一个窗体,报出这样的一个错误"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke.",这个不用多想,肯定是那个地方没有释放掉.既然碰到这个问题,先不说问题本身,来说说其他的一些事情.winform最常见的是datagridview这个控件,不管重写还是怎么,很多数据的操作都是用datagridview来展示的,因此,它的异步调用也算是比较多的一类了.比如:1 从数据库中读取大量数据(所谓的分页读取不在这个范畴)2 操作datagridview,然后一

C#:设置焦点在最小的TabIndex控件上

private void FocusFirstTabIndex(Control container) { // init search result varialble Control searchResult = null; // find the control with the lowest tab index foreach (Control control in container.Controls) { if (control.CanFocus && (searchResult

在asp.net中用客户端上传控件上传文件( 需要注意的)

在asp.net中使用<inpu nme=“file” type=“file”>客户端控件上传文件, 代码大致如下: for(int i=0; i< Request.Files.Count; i++) //这里就是获取不到file的个数 { if(Request.Files[i].ContentLength > 0) { Response.Write (Request.Files [i].FileName ); } } 在我的页面中,Request.Files.Count怎么弄都是