当我在左键单击鼠标的同时向下拖动鼠标时,我不太确定如何绘制矩形(未填充)。
目前我有这个
private void canevas_MouseDown( object sender , MouseEventArgs e )
{
if( e.Button == MouseButtons.Left )
{
_topLeft = new Point( e.X , e.Y );
_drawing = true;
}
}
private void canevas_MouseMove( object sender , MouseEventArgs e )
{
if( _drawing )
{
Rectangle rec = new Rectangle( _topLeft.X , _topLeft.Y , ( e.X - _topLeft.X ) , ( e.Y - _topLeft.Y ) );
canevas.CreateGraphics().DrawRectangle( Pens.Black , rec );
}
}
但问题是我不想让所有的矩形都出现
最佳答案
一些与 Ed 的正确答案相匹配的代码:
Point startPos; // mouse-down position
Point currentPos; // current mouse position
bool drawing; // busy drawing
List<Rectangle> rectangles = new List<Rectangle>(); // previous rectangles
private Rectangle getRectangle() {
return new Rectangle(
Math.Min(startPos.X, currentPos.X),
Math.Min(startPos.Y, currentPos.Y),
Math.Abs(startPos.X - currentPos.X),
Math.Abs(startPos.Y - currentPos.Y));
}
private void canevas_MouseDown(object sender, MouseEventArgs e) {
currentPos = startPos = e.Location;
drawing = true;
}
private void canevas_MouseMove(object sender, MouseEventArgs e) {
currentPos = e.Location;
if (drawing) canevas.Invalidate();
}
private void canevas_MouseUp(object sender, MouseEventArgs e) {
if (drawing) {
drawing = false;
var rc = getRectangle();
if (rc.Width > 0 && rc.Height > 0) rectangles.Add(rc);
canevas.Invalidate();
}
}
private void canevas_Paint(object sender, PaintEventArgs e) {
if (rectangles.Count > 0) e.Graphics.DrawRectangles(Pens.Black, rectangles.ToArray());
if (drawing) e.Graphics.DrawRectangle(Pens.Red, getRectangle());
}
要获得打开双缓冲的“canevas”,使其绘画不会闪烁,请使用“项目”+“添加新项目”,选择“类”并粘贴此代码:
using System;
using System.Windows.Forms;
class Canvas : Panel {
public Canvas() {
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.ResizeRedraw, true);
}
}
编译。将新控件从工具箱顶部拖到您的窗体上,替换原来的“canevas”。相应地更新事件处理程序。
关于c# - 如何在 MouseDown/Move c# 上绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060446/