2014-03-03 58 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不同,但似乎在屏幕上做筆記並將圖像與屏幕圖像分開保存。

是否有另一種方式做到這一點?如使用圖片框以外的其他控件,或者可以直接使用屏幕作爲背景,但仍然可以將圖像分別保存在透明圖片框中。

這是我想要實現的例子:

繪圖時: enter image description here

結果存儲的圖像:

enter image description here

我希望你們能幫助我解決這個問題。對於糟糕的解釋抱歉。

本作更詳細的文檔大綱窗口: enter image description here

+0

您可以添加文檔大綱窗口的屏幕截圖。這顯示了您的PictureBox如何與您的表單對齊。 – dwonisch

+0

@woni:當然你可以看到它上面 – user3332360

+0

你的PictureBox停靠在它的父容器中,嘗試在左上角繪畫並檢查事件是否被觸發。 – dwonisch

回答

0

這可能是因爲你的面被刷新透支。您應該跟蹤要繪製的內容,然後在圖片框的Paint事件中繪製它。這樣,你就得到了一個Graphics對象和每一個刷新,你正在繪製。

這是假設,當然,你有一個有效的,正確的,Graphics對象擺在首位。

順便說一句:傳遞一個窗體範圍變量到Draw是混淆,只是使用它。

+0

但是當我不使用透明圖片框並使用白色背景(不透明)時,使用上述方法繪圖可以很好地工作。當然我也必須消除這個代碼'bCanva.MakeTransparent(Color.White)'。 MakeTransparent(Color.White)。那麼我該如何利用透明的電影盒? – user3332360

0

檢查您的gCanvas初始化程序,如果它是從Paint事件(e.Graphics)中使用的,那麼當您調用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