首先,我是C#和Java的完整菜鸟。
所以我已经获得了将java applet转换为C#的任务,除了使用鼠标事件通过拖放在屏幕上绘制矩形之外,我已经设法做了一切。
当我点击并在屏幕上拖动鼠标时,应该出现一个没有填充和白色边框的矩形。我在下面的代码只是一个白色的屏幕,红色十字通过它,如果我在form1_Paint中注释掉if(动作)语句然后它工作但没有矩形所以它必须是那个弄乱它的代码。
http://gyazo.com/b2506b8c2ea9b304e34172c42ce98aab< - 应该是什么样的
http://gyazo.com/a8764ac9f5380f0109623d7a7750ddb6< - 它实际上是什么样的
[更新]
我现在有一个矩形显示,但它发生在MouseUp事件而不是创建它,因为我拖动我的鼠标。显而易见的下一步是将它移动到像mouseMove这样的不同鼠标事件,然后它真的变得混乱并且随着我变大而不断创建矩形。我如何让它不断调整矩形的大小,因为我拖动鼠标而不是不断创建矩形? 代码
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g1 = e.Graphics;
g1.DrawImage(bitmap, 0, 0, x1, y1);
}
//added load method
private void Form1_Load(object sender, EventArgs e)//runs functions on load
{
init();
start();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (action)
{
xe = e.X;
ye = e.Y;
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
action = true;
// e.consume();
xs = xe = e.X;
ys = ye = e.Y; // starting point y
Form1_MouseMove(sender, e);
this.Invalidate();
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
using (Graphics g = this.CreateGraphics())
{
Pen pen = new Pen(Color.White);
g.DrawRectangle(pen, xs, ys, Math.Abs(xs - xe), Math.Abs(ys - ye));
}
int z, w;
//e.consume();
//xe = e.X;
//ye = e.Y;
if (xs > xe)
{
z = xs;
xs = xe;
xe = z;
}
if (ys > ye)
{
z = ys;
ys = ye;
ye = z;
}
w = (xe - xs);
z = (ye - ys);
if ((w < 2) && (z < 2)) initvalues();
else
{
if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);
else xe = (int)((float)xs + (float)z * xy);
xende = xstart + xzoom * (double)xe;
yende = ystart + yzoom * (double)ye;
xstart += xzoom * (double)xs;
ystart += yzoom * (double)ys;
}
xzoom = (xende - xstart) / (double)x1;
yzoom = (yende - ystart) / (double)y1;
mandelbrot();
this.Invalidate();
//Repaint();
}
答案 0 :(得分:1)
代码中最大的问题是Form1_Paint()
方法中的此语句:
g1.Dispose();
您应该从不处置传递给您的Graphics
实例。它属于框架,而不是您的代码。但是你应该特别从未处理过你打算稍后使用的对象。当您在此处置它时,Graphics
实例稍后在您尝试绘制矩形时无效。
请注意,这与Java中的相同。我希望原始的Java代码也不会调用Graphics.dispose()
!
其他一些建议:
Pen
对象时,添加using
语句以确保您创建的Pen
实例已正确处理(您拥有该实例!:))。但在这种情况下,您不需要创建新的Pen
对象...只需使用.NET提供的库存Pen
即可。即Pens.White
。Invalidate()
和MouseDown
事件处理程序中调用MouseMove
。除非你这样做,否则你不会获得任何视觉反馈,因为不会调用Paint事件处理程序。修复代码,使其如下所示:
// Little helper method :)
private static void Swap<T>(ref T t1, ref T t2)
{
T temp = t1;
t1 = t2;
t2 = t1;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g1 = e.Graphics;
g1.DrawImage(bitmap, 0, 0, x1, y1);
if (action)
{
//g.setColor(Color.White);
if (xe < xs)
{
Swap(ref xs, ref xe);
}
if (ye < ys)
{
Swap(ref ys, ref ye);
}
g1.DrawRectangle(Pens.White, xs, ys, (xe - xs), (ye - ys));
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// e.consume();
if (action)
{
xe = e.X;
ye = e.Y;
Invalidate();
//repaint();
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
action = true;
// e.consume();
if (action)
{
xs = xe = e.X;
ys = ye = e.Y;
Invalidate();
}
}
答案 1 :(得分:0)
我看过这里,这似乎没有解决我的问题,Invalidate();让它口吃,当我在Form1_Paint中它没有正确绘制时,要么直接绘制到表格,在我缩放后直接但在我拖动缩放时实际上并没有出现!