2014-03-03 3 views
2

Я хочу создать две коробки с изображением, перекрывающиеся. Первый Picturebox используется в качестве фона, изображения на экране. с помощью этого метода:Прозрачная коробка с изображением поверх другого окна изображения не работает. Как это исправить?

public void BckShow() 
{ 
    Rectangle rect = Screen.GetBounds(this); 
    gBackImg = Graphics.FromImage(bBackImg); 
    gBackImg.CopyFromScreen(0,0,0,0, 
       Screen.PrimaryScreen.Bounds.Size, 
       CopyPixelOperation.SourceCopy); 
} 

Второй PictureBox находится выше первой, прозрачной коробке изображения, которые могут быть сделаны с помощью этого события мыши:

public void Draw(bool draw, Point sp, Point ep) 
     { 
      if (draw) 
      { 
       gCanvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
       pen = new Pen(new SolidBrush(ColorName), BrushSize); 
       if (toolPen.Checked) 
       { 
        gCanvas.DrawLine(pen, sp, ep); 
       } 
       else if (toolEreser.Checked) 
       { 
        Rectangle rect = new Rectangle(ep.X, ep.Y, BrushSize*5, BrushSize*5); 
        gCanvas.DrawEllipse(pen, rect); 
        gCanvas.FillEllipse(new SolidBrush(ColorName), rect); 
       } 
       bCanvas.MakeTransparent(Color.White); 
       pbxCanvas.Refresh(); 
       dirty = true; 
       toolSave.Enabled = true; 
      } 
     } 

     private void pbxCanvas_MouseDown(object sender, MouseEventArgs e) 
     { 
      sp = e.Location; 
      if (e.Button == MouseButtons.Left) 
      { 
       ActivePaint = true; 
      } 
     } 

     private void pbxCanvas_MouseUp(object sender, MouseEventArgs e) 
     { 
      ActivePaint = false; 
     } 

     private void pbxCanvas_MouseMove(object sender, MouseEventArgs e) 
     { 
      ep = e.Location; 
      Draw(ActivePaint, sp, ep); 
      sp = ep; 
     } 

но когда я запустить программу, второй PictureBox ничего не рисует, когда событие мыши было запущено. как я могу это исправить?

Я делаю это, потому что я просто хочу сохранить изображение во втором окне изображения. В отличие от PrintScreen, но, казалось, делал заметки на экране и сохранял изображение отдельно от изображения на экране.

Есть ли другой способ сделать это? например, с помощью элементов управления, отличных от окна изображения, или может напрямую использовать экран в качестве фона, но при этом сохранить изображение в прозрачном PictureBox можно отдельно.

Это пример, который я хочу, чтобы достичь:

при рисовании: enter image description here

результатов сохраненных изображений:

enter image description here

Я надеюсь, что вы все мне поможет это исправить. извините за плохое объяснение.

это окно документа наброски более подробно: enter image description here

+0

Можете добавить скриншот окна контура документа. Это показывает, как ваши PictureBoxes выровнены по вашей форме. – dwonisch

+0

@woni: да, конечно, вы можете увидеть его выше – user3332360

+0

Является ли ваш PictureBox закрепленным в его родительском контейнере, попробуйте покрасить в верхнем левом углу и проверьте, не активированы ли события. – dwonisch

ответ

0

Вполне вероятно, что ваша поверхность будучи овердрафта путем обновления. Вы должны отслеживать, что вы хотите нарисовать, а затем нарисовать его в окне Paint окна с изображением. Таким образом, вы получаете переданный объект Graphics и каждое обновление, которое вы рисуете.

Это, конечно, означает, что у вас есть действительный и правильный, Graphics объект в первую очередь.

BTW: передача переменной вида формы в Draw сбивает с толку, просто используйте ее.

+0

, но когда я не использую прозрачный ящик для изображений и использую фон с белым (не прозрачным), рисование с помощью вышеуказанного метода может работать хорошо. конечно, я также должен устранить этот код 'bCanva.MakeTransparent (Color.White)'. MakeTransparent (Color.White). так как я могу рисовать на прозрачной рамке? – user3332360

0

Проверьте свой инициализатор gCanvas, если он используется из события Paint (e.Graphics), тогда ваши изменения теряются при вызове метода Refresh(). Refresh() вызывает запуск нового события Paint, создание нового объекта Graphics и, следовательно, аннулирование вашего. Создайте новый графический объект из изображения PictureBox, чтобы постоянно сохранять свои изменения.

private List<Point> points = new List<Point>(); 

private void pbxCanvas_MouseDown(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     ActivePaint = true; 
    } 
} 

private void pbxCanvas_MouseUp(object sender, MouseEventArgs e) { 
    ActivePaint = false; 
    points.Clear(); 
} 

private void pbxCanvas_MouseMove(object sender, MouseEventArgs e) { 
    if (ActivePaint) { 
     points.Add(e.Location); 
     Refresh(); 
    } 
} 

private void pbxCanvas_Paint(object sender, PaintEventArgs e) { 
    using (var graphics = Graphics.FromImage(pbxCanvas.Image)) { 
     for (int i = 0; i < points.Count - 1; i++) { 
      graphics.DrawLine(Pens.Black, points[i], points[i + 1]); 
     } 
    } 
} 
+0

Я пробовал это решение сегодня и, похоже, не работает для меня. прозрачный блок изображения, который находится сверху, по-прежнему не принимает события мыши или рисует любые изображения. если вы пробовали его, и он работает на вас? – user3332360

+0

Вы используете специальный вид PictureBox? Я вчера пробовал этот код с помощью System.Windows.Forms.PictureBox – dwonisch

+0

Нет, я просто использую обычный 2 перекрывающий PictureBox. Картинка, которую я хочу нарисовать выше, имеет свойство прозрачного цвета фона. – user3332360

Смежные вопросы