基于

Visual Studio 2012

.net framework 4.5

效果截图:

代码:

https://download.csdn.net/download/talkwah/10482880

代码预览:

using System;
using System.Drawing;
using System.Windows.Forms; namespace WFA画图
{
public partial class Form1 : Form
{
#region 成员变量
Point m_p1, m_p2;
bool m_flgKeuDowm = false;
Bitmap m_mapStart;
Bitmap m_mapEnd;
Bitmap m_mapInit;
Graphics m_graphics;
#endregion public Form1()
{
InitializeComponent();
m_graphics = pictureBox1.CreateGraphics(); // 最初的背景图存起来,清除绘制图形时用
m_mapInit = (Bitmap)pictureBox1.BackgroundImage;
} #region 鼠标事件
/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
m_flgKeuDowm = true;
_initPoint(e); } /// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (!m_flgKeuDowm)
{
return;
}
else
{
m_p2 = new Point(e.X, e.Y);
} int width = Math.Abs(e.X - m_p1.X);
int height = Math.Abs(e.Y - m_p1.Y); _draw();
} /// <summary>
/// 鼠标抬起
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
m_flgKeuDowm = false; // 最终的图片设为背景图
pictureBox1.BackgroundImage = m_mapEnd; // 起止点初始化
_initPoint(e);
}
#endregion private void _draw(){ // 每次的【终止图】都是取自【起始图】
m_mapEnd = (Bitmap)m_mapStart.Clone();
Graphics g = Graphics.FromImage(m_mapEnd);
Pen pen = new Pen(Color.Red,);
if (rdoRect.Checked)
{
Point p1,p2;
_swapPoint(out p1,out p2 );
int width = Math.Abs(p2.X - p1.X);
int height = Math.Abs(p2.Y - p1.Y);
g.DrawRectangle(pen, p1.X, p1.Y, width, height);
}else if(rdoLine.Checked){
// 画直线不用转换点坐标,直接用成员变量的Point
g.DrawLine(pen, m_p1, m_p2);
} m_graphics.DrawImage(m_mapEnd, new Point(, ));
} private void _initPoint(MouseEventArgs e)
{
m_p1 = new Point(e.X, e.Y);
m_p2 = m_p1; if (pictureBox1.BackgroundImage != null)
{
m_mapStart = (Bitmap)pictureBox1.BackgroundImage;
}
} private void _printPoint(Point p)
{
Console.WriteLine(p.X+","+p.Y);
} private void _swapPoint(out Point _p1, out Point _p2)
{
//实现画框随意翻转
_p1 = m_p1;
_p2 = m_p2;
if (m_p1.X > m_p2.X)
{
int tmp = _p1.X;
_p1.X = _p2.X;
_p2.X = tmp;
}
if (m_p1.Y > m_p2.Y)
{
int tmp = _p1.Y;
_p1.Y = _p2.Y;
_p2.Y = tmp;
}
} #region 按钮
private void btnClear_Click(object sender, EventArgs e)
{
pictureBox1.BackgroundImage = m_mapInit;
} private void btnSave_Click(object sender, EventArgs e)
{
// 保存
SaveFileDialog dlg = new SaveFileDialog();
dlg.DefaultExt = "png";
dlg.Filter = "Png Files|*.png";
dlg.FileName = "截图"; DialogResult dlgRet = dlg.ShowDialog();
if (dlgRet == DialogResult.OK)
{
pictureBox1.BackgroundImage.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
}
}
#endregion
}
}

C#绘图:带背景,拖鼠标画矩形和直线的更多相关文章

  1. jQuery背景跟随鼠标移动的网页导航

    首页 PSD模板 CSS模板 特效插件 源码下载 酷站欣赏 建站资源 建站教程 心境之旅 在线留言 设为首页 加入收藏 我要投稿 联系站长 Search     首页 PSD模板 CSS模板 特效插件 ...

  2. HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. PDFBox 打印带背景的文件速度慢

    打印慢的原因 java的RasterPrinterJob会执行很多次printPage方法 他应该是按块填充的, 如果页面元素非常复杂, 那么printPage方法可能会执行十几次. 而如果你用了如下 ...

  4. Lodop如何设置预览后导出带背景的图,打印不带背景图

    Lodop中的ADD_PRINT_SETUP_BKIMG,可以加载上背景图,该背景图在预览的时候可以显示也可以不显示,打印可以打印出来也可以不打印出来.一般套打,都是不打印背景图的,比如一些快递的快递 ...

  5. phpqrcode 分别生成普通、带logo、带背景带logo二维码

    前提:下载好 phpqrcode 类库 1.生成普通二维码 //引入类库 include('phpqrcode/phpqrcode.php'); //二维码里面的链接地址 $url="htt ...

  6. 鼠标画矩形openCV

    #include <cv.h> #include <highgui.h> #include <stdio.h> /*鼠标画矩形*/ void my_mouse_ca ...

  7. 在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法

    在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法 [MXDRAW CAD控件文档] 下面帮助的完整例子,在控件安装目录的Sample\Ie\iedemo.htm中. 1.      主要用到 ...

  8. GIS空间分析案例教程——带背景和周围要素的逐要素导出地理

    GIS空间分析案例教程--带背景和周围要素的逐要素导出地理 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 目的:导出多边形要素类的每个要素 实 ...

  9. TP框架中生成带背景带文字的二维码

    首先下载一个phpqrcode的包放到/vendor目录下 链接:https://pan.baidu.com/s/18jV9DypYB_PHDhD6C0iedQ 提取码:qxuo 如果只是单纯生成二维 ...

随机推荐

  1. GitHub看板系统(Project)

    /********************************************************************** * GitHub看板系统(Project) * 说明: ...

  2. 【EMV L2】Application Usage Control

    [Application Usage Control] Tag9F07,卡片数据,2bytes: Indicates issuer’s specified restrictions on the ge ...

  3. Swift中enum, struct, class的有关使用方法

    import Foundation print("Hello, World!") let a = var b = var c = a + b; c = //重载:函数名相同, 函数 ...

  4. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。

    哈喽大家好,今天,可乐来给大家分享一下Python中用for循环和while循环打印九九乘法表的操作.由于本人也是刚刚接触Python不长时间,代码也是自己编写的,所以有什么不足之处还请大家多多指教. ...

  5. 用python来自动玩类似跳一跳的小游戏

    最近春节,qq上出了一个叫穿越福城的小游戏.游戏的玩法类似挑一挑,也是通过一个个木桩.只不过把跳的过程变成了搭梯子.按的时间越长,梯子越长.梯子过长或者过短小企鹅都会掉下去,游戏失败.我的目的是用py ...

  6. Hello_World

    简单A+B #include <stdio> int main() { int a,b; scanf("%d%d",&a, &b); printf(&q ...

  7. IO文件流

    定义:流是一种抽象的概念,通过流的方式组成无结构字符和字符序列,从流中取数据的操作进行输入输出.[io流的作用就是用流的方式进行输入输出] 常用语法: 1.   首先引用using.system.io ...

  8. vue对象属性监听

    对象属性监听的两种方法: 1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValu ...

  9. Adventure 魔幻历险

    发售年份 1979 平台 VCS 开发商 雅达利(Atari) 类型 冒险 https://www.youtube.com/watch?v=YS-HYWRdb2g

  10. vue-router 路由跳转:和name配对的是params,和path配对的是query

    1.命名路由name搭配params,刷新页面参数会丢失 2.路由path搭配query,刷新页面数据不会丢失 3.接收参数使用this.$router,就能获取到参数的值