我现在要实现类似Windows中画图板的功能,现在遇到一个问题,就是鼠标按下,选择起点,在鼠标移动的过程中,去除旧框,再画新框,可是用什么绘图模式除去呢?求教啊!
解决方案 »
- 请教C# WinForm项目中的CS源代码测试方法
- 难度GDI+
- 又是WCF的问题:为什么返回流和数组类型出错?
- 想输出一个数组,提示有错误,大家帮我看看,谢谢!
- 分享『百度空间发帖助手』源代码(.NET C#)
- 弱问题之四!
- 动态加载控件,然后对控件进行调整,改背景颜色,显示字体,控件大小等,给个思路
- 请问如果要在程序中使用Excel要在工具箱中加什么东东?在线等待,马上给分!!
- 求helpProvider.SetHelpKeyword的使用方法,外部帮助文件为html help workshop 3.0
- 为什么不同的客户端在使用remoting对象时,都重新调用了构造函数?
- C#里有什么好的解析网页代码的工具
- ???请问如何在界面添加 小方格并显示相关信息 ???
我知道在MouseUp事件里捕捉起点,但是需要的是鼠标移动到哪,图形就绘制到哪,我在MouseOver事件里画图,但是之前鼠标移动过的位置画出的图形都会保留在哪,这是不希望的。
代码稍等
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BPOSuperSQLClass;
using SystemHotKey;
using System.Drawing.Drawing2D;
using System.Threading;
using BPOSYSTEM.myClass;
using System.IO;
using System.Collections;
using System.Reflection;namespace BPOSYSTEM
{
public partial class InputForm : Form
{
#region property
private Bitmap srcImage;
private Bitmap toDrawBeffor;
private Graphics gOfToDrawBeffor;
private Graphics gOfbuff;
private BufferedGraphicsContext ctx;
private BufferedGraphics bg;
//zoom
private float iZoom = 1f; //show Pic size
private float showW;
private float showH; private float srcW;
private float srcH; //show Pic Left_Up point.
private int showX, showY; //Mouse Action Points:
private int startX, startY, endX, endY;
bool mouseDown = false;
bool mouseMoved = false; private Graphics MyGraphics;
private int Hotkey_UP;
private int Hotkey_DOWN;
private int Hotkey_LEFT;
private int Hotkey_RIGHT;
private int Hotkey_ZoomIN; //suo xiao
private int Hotkey_ZoomOUT; //fang da
private int Hotkey_NoZoom;
private DirectoryInfo srcFolder;
FileInfo curFile; private int inputStatus;
private int inputStep;
private int inputType; private MyFolderDAO mfolderDAO = new MyFolderDAO();
private MyInputDAO minputDAO = new MyInputDAO();
private MyUserInputDAO uiDAO = new MyUserInputDAO(); private int nextID;
private InputInfo nextInput;
private InputInfo input1;
private bool finish = false; #endregion
public InputForm()
{
InitializeComponent();
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
this.UpdateStyles();
} private void Form1_Load(object sender, EventArgs e)
{
try
{ InitSrcFolder();
InitSrcImage();
this.Visible = true;
InitImgAndGraph();
gOfToDrawBeffor.DrawImage(srcImage, 0, 0);
MyGraphics = panel1.CreateGraphics();
ctx = BufferedGraphicsManager.Current;
bg = ctx.Allocate(MyGraphics, new Rectangle(new Point(0, 0), panel1.Size));
gOfbuff = bg.Graphics; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
Runtime.InputForm.Close();
}
}
#region Paint private void ZoomInOutPic()
{
if (srcImage != null)
{
InitImgAndGraph(); this.showW = srcImage.Width * iZoom;
this.showH = srcImage.Height * iZoom;
gOfToDrawBeffor.DrawImage(srcImage, 0, 0, this.showW, this.showH);
//let it dont be out of range;
if (-showX > showW)
{
showX = ((int)showW / 10) * (-10);
}
if (-showY > showH)
{
showY = ((int)showH / 10) * (-10);
} gOfbuff.Clear(panel1.BackColor);
gOfbuff.DrawImage(toDrawBeffor, showX, showY); if (mouseDown)
{
gOfbuff.DrawRectangle(Pens.Red, startX, startY, endX - startX, endY - startY);
}
bg.Render();
}
}
private void panel1_Paint(object sender, PaintEventArgs e)
{ if (gOfbuff != null)
{
ZoomInOutPic();
}
} private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseDown)
{
mouseMoved = true; endX = e.X;
endY = e.Y;
ZoomInOutPic(); }
} private void panel1_MouseDown(object sender, MouseEventArgs e)
{
startX = e.X;
startY = e.Y;
endX = e.X;
endY = e.Y;
mouseDown = true; } private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
if (mouseMoved)
{
mouseMoved = false; float i = 1; if (iZoom < 2)
{
i = 2 / iZoom;
iZoom = 2f; }
float pCenterX = panel1.Width / 2;
float pCenterY = panel1.Height / 2; float mouCenterX = (startX + endX) / 2;
float mouCenterY = (startY + endY) / 2;
float cmouX = (mouCenterX - showX) * i + showX;
float cmouY = (mouCenterY - showY) * i + showY;
showX = (int)(pCenterX + showX - cmouX);
showY = (int)(pCenterY + showY - cmouY); ZoomInOutPic();
} } private void InitImgAndGraph()
{ toDrawBeffor = new Bitmap((int)(srcW * iZoom), (int)(srcW * iZoom)); gOfToDrawBeffor = Graphics.FromImage(toDrawBeffor);
}
private void InputForm2_FormClosing(object sender, FormClosingEventArgs e)
{
if (!e.Cancel)
{
if (srcImage != null)
{
srcImage.Dispose();
srcImage = null;
}
Runtime.Main.Show();
}
} #endregion #region Init private void InitSrcImage()
{
if (srcImage != null)
{
srcImage.Dispose();
srcImage = null;
}
curFile = new FileInfo(Path.Combine(srcFolder.FullName, minputDAO.getImageName(nextID)));
srcImage = new Bitmap(curFile.FullName);
srcW = srcImage.Width;
srcH = srcImage.Height;
showW = srcImage.Width;
showH = srcImage.Height;
showX = 0;
showY = 0;
iZoom = 1f;
}
}
}
参考一下
重复绘制的过程中会保留以前绘制的图像,
如果想每次都绘制新的图像,需要在绘制的时候首先清楚上次绘制的图像。如果用panel的话,可以用pane.CreateGraphics().clear(color);color 为你图像的背景色,用于清除上次图像