Java转C#转换。 如何在我的位图上绘制一个矩形?

首先,我是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 = eX; ye = eY; } } private void Form1_MouseDown(object sender, MouseEventArgs e) { action = true; // e.consume(); xs = xe = eX; ys = ye = eY; // 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 = eX; //ye = eY; 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  (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(); } 

代码中最大的问题是Form1_Paint()方法中的这个语句:

 g1.Dispose(); 

永远不应该处理传递给您的Graphics实例。 它属于框架,而不是您的代码。 但是你应该特别从未处理过你打算稍后使用的对象。 当您在此处置它时,稍后当您尝试绘制矩形时, Graphics实例无效。

请注意,这与Java中的相同。 我希望原始的Java代码也不会调用Graphics.dispose()

其他一些建议:

  • 在创建新的Pen对象时,添加using语句以确保您创建的Pen实例已正确放置(您拥有该对象!:))。 但在这种情况下,您不需要创建新的Pen对象…只需使用.NET提供的库存Pen 。 即Pens.White
  • 您似乎没有在MouseDownMouseMove事件处理程序中调用Invalidate() 。 除非你这样做,否则你不会得到任何视觉反馈,因为不会调用Paint事件处理程序。

修复代码,使其看起来像这样:

 // Little helper method :) private static void Swap(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 = eX; ye = eY; Invalidate(); //repaint(); } } private void Form1_MouseDown(object sender, MouseEventArgs e) { action = true; // e.consume(); if (action) { xs = xe = eX; ys = ye = eY; Invalidate(); } } 

我已经看过这里了,这似乎没有解决我的问题,Invalidate();它使它口吃,当我在Form1_Paint中它没有正确绘制时,要么直接绘制到表单上,在我缩放后直接但在我拖动变焦时实际上并没有出现!