2014-11-08 3 views
-1

Привет, Мне дана задача превратить приложение Java в приложение формы C#. Программа отображает Mandelbrot, который затем позволяет пользователю увеличивать масштаб. Мне удалось отобразить Мандельброт и даже увеличить масштаб. Однако при перетаскивании окна для масштабирования ящик сам не показывает, то есть пользователь не может видеть, в какой области они будут масштабироваться.Рисование прямоугольника на растровом изображении (Mandelbrot)

Я считаю, что мне нужно вызвать функцию обновления, которая рисует прямоугольник при перетаскивании. Вот код, который, я считаю, имеет значение.

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    //e.consume(); 
    if (action) 
    { 
     xs = e.X; 
     ys = e.Y; 
    } 
} 

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    int z, w; 

    //e.consume(); 
    if (action) 
    { 
     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(); 
     rectangle = false; 

     Refresh(); 
    } 
} 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    //e.consume(); 
    if (action) 
    { 
     xe = e.X; 
     ye = e.Y; 
     rectangle = true; 
    } 
} 

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g1 = e.Graphics; 
    g1.DrawImage(bitmap, 0, 0, x1, y1); 
    g1.Dispose(); 
} 

public void paint(Graphics g1) 
{ 
    update(g1); 
} 

public void update(Graphics g1) 
{ 
    Pen pen = new Pen(Color.White); 
    g1.DrawImage(bitmap, 0, 0, x1, y1); 
    if (rectangle) 
    { 

     if (xs < xe) 
     { 
      if (ys < ye) g1.DrawRectangle(pen, xs, ys, (xe - xs), (ye - ys)); 
      else g1.DrawRectangle(pen, xs, ye, (xe - xs), (ys - ye)); 
     } 
     else 
     { 
      if (ys < ye) g1.DrawRectangle(pen, xe, ys, (xs - xe), (ye - ys)); 
      else g1.DrawRectangle(pen, xe, ye, (xs - xe), (ys - ye)); 
     } 
     pen.Dispose(); 

    } 
} 
+2

Вы, ребята, в одном классе должны разговаривать друг с другом. Это дубликат вопроса, заданного вашим одноклассником: http://stackoverflow.com/questions/26721685/java-to-c-sharp-conversion-how-do-i-draw-a-rectangle-on-my-bitmap –

+0

Я посмотрел туда, что, похоже, не помогло! –

ответ

0

Вам нужно позвонить Form.Update() или Form.Refresh() из вашего MouseMove обработчика событий. Вам также нужно вызвать функцию прямоугольника draw в вашем обработчике событий Form1_Paint. Тогда вы будете установлены.

+0

Когда вы говорите, что вызываете функцию прямоугольника draw, вы имеете в виду вызов update(); потому что здесь есть функция прямоугольника draw, но это вызывает ошибку или переводит код прямоугольника ничьей из обновления в краску? –

+0

Вы можете либо переместить код DrawRectangle в 'Form1_Paint', либо вызвать обновление из 'Form1_Paint'. Важно то, что вы рисуете прямоугольник с помощью объекта Graphics из «PaintEventArgs» – DWCP

+0

Нет необходимости использовать 'Update()' или 'Refresh()'. Просто вызовите 'Invalidate()', когда нужно перерисовать интерфейс, а затем нарисуйте прямоугольник в обработчике события 'Paint'. Это, кстати, ответ, указанный в двойном вопросе. –