作者feobzq (0.0)
看板C_Sharp
标题Re: [问题] 小画家功能
时间Sun Jul 21 15:10:13 2019
※ 引述《amen1387 (MyBad)》之铭言:
: ※ 引述《fantoccini (失控的颜色)》之铭言:
: : 这几天为了写视窗开始学C#
: : 再练习的时候遇到一个问题
: : 例如我要画一个矩形
: : 当Mouse按下後 然後移动 然後放开
: : 最後的结果是一个矩形 但是
: : 我的滑鼠在移动的过程中 无法看出
: : 这个矩形跟随着你的滑鼠移动
: : 简单的说 就是小画家 圈选矩形的那个功能
: : 感觉上是要一直重绘 不知道是不是这样
: 我把drawline写在mouse_up的话,就跟原本楼主的问题一样,但试着写在mouse_move他就
: 会一直出现
: 我现在有想到的方式是在mousedown的时候把picture box撷取起来
: Bitmap lastimage=new Bitmap(picturebox1.width,picturebox1.height);
: Garphcs Imagegrapics=Graphics.FromImage(lastimage);
: 然後在mousemove时
: Graphics p =pictureBox1.CreateGraphics();
: if(e.Button==MouseButton.Left)
: {
: p=image graphics;
: p.DrawLine(pen1,downX,downY,e.X,e.Y);
: }
: 可是这样写连画出来都没有,不知道哪里出了问题
: 。
我用两张Bitmap在MouseMove和MouseUp交互替换PictureBox.Image
MouseMove时先用MouseDown时先存过的Bitmap做刷新
Graphics G;
Point P;
Bitmap Bmp1, Bmp2;
bool mouseDown = false;
private void Form1_Load(object sender, EventArgs e)
{
Bmp1 = new Bitmap(pictureBox1.Width,pictureBox1.Height);
pictureBox1.Image = Bmp1;
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
P = e.Location;
mouseDown = true;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseDown)
{
Bmp2 = (Bitmap)Bmp1.Clone();
G = Graphics.FromImage(Bmp2);
pictureBox1.Image = Bmp2;
Draw(e);
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
pictureBox1.Image = Bmp1;
G = Graphics.FromImage(Bmp1);
Draw(e);
}
void Draw(MouseEventArgs e)
{
Point P1 = P;
Point P2 = e.Location;
float width = P2.X - P1.X;
float height = P2.Y - P1.Y;
int tmp;
if (width < 0)
{
tmp = P2.X;
P2.X = P1.X;
P1.X = tmp;
width = -width;
}
if (height < 0)
{
tmp = P2.Y;
P2.Y = P1.Y;
P1.Y = tmp;
height = -height;
}
G.DrawRectangle(new Pen(Brushes.Black), P1.X, P1.Y, width,
height);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.143.9.68 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1563693019.A.938.html
1F:推 ideaup: move时只画在bmp2 上且显示它,好像可以,很简单 07/21 18:54
2F:→ ideaup: 每次move都要做,bmp1.clone()+bmp2.dispose(),费时 07/21 19:27
3F:推 anumis: 宣告2张 bmp,一张拿来显示,一张拿来绘图,进到 paint 时 07/22 10:56
4F:→ anumis: ,先把图2清空後再做绘图程式码,等东西都完完後,图1再清 07/22 10:56
5F:→ anumis: 空把图2画上去 07/22 10:56
6F:→ anumis: 你要有个概念,一但进了 picturebox 之类的"萤幕显示型元 07/22 10:56
7F:→ anumis: 件",那就要跟实际硬体做io,速度就不比你在记忆体内处理 07/22 10:56
8F:→ anumis: 了,所以才需要分成"表层/理层"的方式去做,市面上所有游 07/22 10:56
9F:→ anumis: 戏引擎都是这麽干的。 07/22 10:57
10F:→ anumis: 然後没必要做 dispose,直接同一个记忆体区域重复利用就好 07/22 10:59
11F:→ anumis: ,可可省掉一直重复宣告记/释放忆体空间的时间 07/22 10:59
12F:→ feobzq: 两位大大说的都看得懂,只是要怎麽修比较好?(若不用WinAPI 07/22 22:20
13F:→ anumis: 我讲的是方法,实做就用内建的 Graphic + bitmap 做就好了 07/27 14:33