基于

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. Hive与HBase表联合使用Join的问题

    hive与hbase表结合级联查询的问题,主要hive两个表以上涉及到join操作,就会长时间卡住,查询日志也不报错,也不会出现mr的进度百分比显示,shell显示如下图 如图: 解决这个问题,需要修 ...

  2. JPA Example 基本使用使用实例

    一.相关接口方法     在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaR ...

  3. 软件测试第四次作业—— 性能测试(含JMeter实验)

                                           性能测试(含JMeter实验) 一.概览 1.性能测试有几种类型,它们之间什么关系? 2.搭建并简单配置一个JMeter的 ...

  4. MySQL delete语句的问题

    以前遇到过几次这个问题,都觉得问题不大,所以没有记录,但是这次又遇到了,而且没有第一时间想起来,所以还是有记录下的必要 MySQL    delete语句使用子查询操作同一张表的时候会抛出 DELET ...

  5. Spring配置之标签的三两事

    今天看到项目的配置,看后就当是复习了.懵懵懂懂工作两年,感觉虽然自己一直在使用spring作为工具,但是也没有涉及到spring的方方面面,今天的研究从一次无意的自动补全开始,还是那句话,不爱研究的程 ...

  6. day08文件操作

    今日内容 文件操作 内容详细 1.打开文件 1.open("作业讲解.py",mode="r",encoding="utf-8") 2.文件 ...

  7. PTA——找鞍点

    PTA 7-56 找鞍点 #include<stdio.h> #define N 6 int main() { ; scanf("%d",&n); int a[ ...

  8. 详解:idea工具下的main函数只执行Thread.activeCount(),打印值为:2

    写多线程的时候,想要等main中其他线程都执行完成后(其他线程功能为对一个数字inc+1),输出最终的inc值. 于是写了个循环: while (Thread.activeCount() > 1 ...

  9. Incjector

    网上的注入工具很多,大多也有比较详细的解释,但是大部分windows下的注入软件都是对自己软件的一种推荐,而且很多也不是非常的安全,对于有些破解版本来说,很可能自身会被带有木马,所以,Linux下的注 ...

  10. 新闻娱乐类APP的后端核心逻辑总结

    一.主要功能: 用户:登录.注册(微信账号登录.手机号登录).修改.审核 内容:发布.审核.分享.点赞.收藏及置顶热推等相关操作 评论:发布.审核.点赞及热评等相关操作 消息推送:站内信如用户修改结果 ...