2015-11-07 46 views
1

對於一個任務,我不得不將分形渲染程序從Java轉換爲C#,我想我已經做到了,但是當我嘗試運行它出現在標題中的錯誤,我不知道它爲什麼會發生。這是渲染器本身的代碼給我看沒有錯誤:WindowsFormsApplication1.Form1.Dispose(布爾)':沒有找到合適的方法來覆蓋

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Form1 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 


     init(); 
     start(); 
     this.DoubleBuffered = true; 


    } 
    //code to convert HSB to RGB from HSB.cs. All your code so i made it take up less space. 
    public struct HSBColor 
    { 
     float h; 
     float s; 
     float b; 
     int a; 
     public HSBColor(float h, float s, float b) { this.a = 0xff; this.h = Math.Min(Math.Max(h, 0), 255); this.s = Math.Min(Math.Max(s, 0), 255); this.b = Math.Min(Math.Max(b, 0), 255); } 
     public HSBColor(int a, float h, float s, float b) { this.a = a; this.h = Math.Min(Math.Max(h, 0), 255); this.s = Math.Min(Math.Max(s, 0), 255); this.b = Math.Min(Math.Max(b, 0), 255); } 
     public float H { get { return h; } } 
     public float S { get { return s; } } 
     public float B { get { return b; } } 
     public int A { get { return a; } } 
     public Color Color { get { return FromHSB(this); } } 
     public static Color FromHSB(HSBColor hsbColor) 
     { 
      float r = hsbColor.b; 
      float g = hsbColor.b; 
      float b = hsbColor.b; 
      if (hsbColor.s != 0) 
      { 
       float max = hsbColor.b; float dif = hsbColor.b * hsbColor.s/255f; float min = hsbColor.b - dif; float h = hsbColor.h * 360f/255f; 
       if (h < 60f) { r = max; g = h * dif/60f + min; b = min; } 
       else if (h < 120f) { r = -(h - 120f) * dif/60f + min; g = max; b = min; } 
       else if (h < 180f) { r = min; g = max; b = (h - 120f) * dif/60f + min; } 
       else if (h < 240f) { r = min; g = -(h - 240f) * dif/60f + min; b = max; } 
       else if (h < 300f) { r = (h - 240f) * dif/60f + min; g = min; b = max; } 
       else if (h <= 360f) { r = max; g = min; b = -(h - 360f) * dif/60 + min; } 
       else { r = 0; g = 0; b = 0; } 
      } 
      return Color.FromArgb(hsbColor.a, (int)Math.Round(Math.Min(Math.Max(r, 0), 255)), (int)Math.Round(Math.Min(Math.Max(g, 0), 255)), (int)Math.Round(Math.Min(Math.Max(b, 0), 255))); 
     } 
    } 
    private const int MAX = 256;  // max iterations 
    private const double SX = -2.025; // start value real 
    private const double SY = -1.125; // start value imaginary 
    private const double EX = 0.6; // end value real 
    private const double EY = 1.125; // end value imaginary 
    private static int x1, y1, xs, ys, xe, ye; 
    private static double xstart, ystart, xende, yende, xzoom, yzoom; 
    private static float xy; 
    private int c = 0; 
    //private Image picture; Taken out, not needed 
    // create rectangle variable JGB 
    Rectangle rec; 
    private Graphics g1; 
    //private Cursor c1, c2; Taken out, not needed 
    private System.Drawing.Bitmap bitmap; 
    public void init() 
    { 
     //setSize(640, 480); changed this code to JGB: 
     this.Size = new Size(640, 480); 
     // Taken all lines out below. Not needed. 
     /*finished = false; 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     c1 = new Cursor(Cursor.WAIT_CURSOR); 
     c2 = new Cursor(Cursor.CROSSHAIR_CURSOR); */ 
     x1 = 640; 
     y1 = 480; 
     xy = (float)x1/(float)y1; 
     //picture = createImage(x1, y1); Taken out and replaced with JGB: 
     bitmap = new Bitmap(x1, y1); 
     //g1 = picture.getGraphics(); changed to get my bitmap 
     g1 = Graphics.FromImage(bitmap); 
     //finished = true; Finished variable deleted so not needed 
    } 
    //Code below didnt appear to do anything so i deleted it 
    /*public void destroy() // delete all instances 
    { 
     if (finished) 
     { 
      removeMouseListener(this); 
      removeMouseMotionListener(this); 
      picture = null; 
      g1 = null; 
      c1 = null; 
      c2 = null; 
      System.gc(); // garbage collection 
     } 
    } */ 

    public void start() 
    { 
     //action = false; 
     //rectangle = false; 


     initvalues(); 

     // added dialog box for instance loading and save varaibles needed for position and zoom to text file 
     DialogResult dialog = MessageBox.Show("Would You Like to Load Your Last Instance?", "Load Instance?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); 
     if (dialog == DialogResult.Yes) 
     { 

      string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Public\Writelines.txt"); 
      xzoom = System.Convert.ToDouble(lines[0]); 
      yzoom = System.Convert.ToDouble(lines[1]); 
      xstart = System.Convert.ToDouble(lines[2]); 
      ystart = System.Convert.ToDouble(lines[3]); 
     } 
     else 
     { 
      xzoom = (xende - xstart)/(double)x1; 
      yzoom = (yende - ystart)/(double)y1; 
     } 

     mandelbrot(); 
    } 
    public void stop() 
    { 
    } 
    /*public void paint(Graphics g, PaintEventArgs e) 
    { 
     update(g); 
    } 
    public void update(Graphics g) 
    { 
     //g.DrawImage(picture, 0, 0); 

    }*/ 
    private void mandelbrot() 
    { 
     int x, y; 
     float h, b, alt = 0.0f; 
     Color color; 


     Pen pen = new Pen(Color.Black); 
     for (x = 0; x < x1; x += 2) 
      for (y = 0; y < y1; y++) 
      { 
       h = pointcolour(xstart + xzoom * (double)x, ystart + yzoom * (double)y, c); 
       if (h != alt) 
       { 


        b = 1.0f - h * h; 

        color = HSBColor.FromHSB(new HSBColor(h * 255, 0.8f * 255, b * 255)); 
        pen = new Pen(color); 
        alt = h; 

       } 
       g1.DrawLine(pen, x, y, x + 1, y); 
      } 


    } 

    private float pointcolour(double xwert, double ywert, int j) 
    { 
     double r = 0.0, i = 0.0, m = 0.0; 

     // int j = 0; 

     while ((j < MAX) && (m < 4.0)) 
     { 
      j++; 
      m = r * r - i * i; 
      i = 2.0 * r * i + ywert; 
      r = m + xwert; 
     } 
     return (float)j/(float)MAX; 
    } 
    private void initvalues() 
    { 
     xstart = SX; 
     ystart = SY; 
     xende = EX; 
     yende = EY; 
     if ((float)((xende - xstart)/(yende - ystart)) != xy) 
      xstart = xende - (yende - ystart) * (double)xy; 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g1 = e.Graphics; 
     g1.DrawImage(bitmap, 0, 0, x1, y1); 
     using (Pen pen = new Pen(Color.White, 2)) 
     { 
      e.Graphics.DrawRectangle(pen, rec); 
     } 
     Invalidate(); 


    } 
    //added load method 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      xe = e.X; 
      ye = e.Y; 
      if (xs < xe) 
      { 
       if (ys < ye) rec = new Rectangle(xs, ys, (xe - xs), (ye - ys)); 
       else rec = new Rectangle(xs, ye, (xe - xs), (ys - ye)); 
      } 
      else 
      { 
       if (ys < ye) rec = new Rectangle(xe, ys, (xs - xe), (ye - ys)); 
       else rec = new Rectangle(xe, ye, (xs - xe), (ys - ye)); 
      } 


      this.Invalidate(); 
     } 



    } 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 

     if (e.Button == MouseButtons.Left) 
     { 
      // e.consume(); 
      xs = e.X; 
      ys = e.Y; // starting point y 
      this.Invalidate(); 
     } 

    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 


     rec = new Rectangle(0, 0, 0, 0); 
     if (e.Button == MouseButtons.Left) 
     { 
      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(); 

      string stringxzoom = xzoom.ToString(); 
      string stringyzoom = yzoom.ToString(); 
      string stringystart = ystart.ToString(); 
      string stringxstart = xstart.ToString(); 
      string[] lines = { stringxzoom, stringyzoom, stringxstart, stringystart }; 

      System.IO.File.WriteAllLines(@"C:\Users\Public\Writelines.txt", lines); 
      this.Invalidate(); 
      //Repaint(); 

     } 

    } 


    private void restartToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Application.Restart(); 
    } 
    private void exitToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 



     Application.Exit(); 
    } 




    private void menuToolStripMenuItem_Click(object sender, EventArgs e) 
    { 

    } 


    private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 

    } 




} 
} 

,這是用於表單設計這是自動生成的,我不知道爲什麼被呈現錯誤代碼因爲我從來沒有過一個:

namespace WindowsFormsApplication1 
{ 
partial class Form1 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     this.components = new System.ComponentModel.Container(); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.Text = "Form1"; 
    } 

    #endregion 
} 
} 

回答

2

我相信因爲你的命名空間是不一樣的它引起的。由於設計器生成的部分代碼不能從Form繼承,因此您沒有可覆蓋的方法。一旦你通過匹配命名空間使兩個類正確地綁定在一起,它就可以工作。

要解決它,你可以更改設計代碼的命名空間,以配合您Form1的命名空間:

namespace Form1 
{ 
    partial class Form1 
    { 
     //... 
    } 
} 

或更改您的形式,以配合設計師:

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     //.... 
    } 
} 
+0

我會避免對命名空間和類使用相同的標識符:它只是混淆了讀者和編譯器(它可能發生它無法編譯,因爲它將Form1解析爲命名空間而不是類名) –

相關問題