台灣最大程式設計社群網站
線上人數
1392
 
會員總數:246737
討論主題:190152
歡迎您免費加入會員
討論區列表 >> C# >> 如何在已經繪圖的Panel上畫圖?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何在已經繪圖的Panel上畫圖?
價值 : 20 QP  點閱數:1042 回應數:3
樓主

Fish
門外漢
0 3
41 5
發送站內信

最近在寫有關醫學影像的程式
想知道如果已經在一個Panel上用Graphics畫圖(這個圖是使用機器測量畫出來的)
之後要怎麼在上面手繪上圓形正方形之類的呢?
分開弄我兩個都可以,但合在一起就出現問題,
現在是把兩個圖分別畫在兩個Panel上,
上面手繪的那個Panel背景改成透明的,
但這樣會變成畫圖的軌跡重複出現(如果畫圓圈,會變得像彈簧的形狀那樣)
然後要點旁邊的按鈕再按一次畫面才會出現正常的形狀,
但是把背景改掉就好了,
然後Clear讓他背景變成透明的好像無法,
會變成黑色的(不知道為甚麼)

想問如果用Picturtbox寫會比較好嗎?
還是有甚麼更好的建議呢?

以下我所寫的程式

private void rdBtnRed_CheckedChanged(object sender, EventArgs e)
{
if (rdBtnRed.Checked)
{
drawPen = new Pen(Color.Red);
drawBrush = new SolidBrush(Color.Red);
}
else if (rdBtnGreen.Checked)
{
drawPen = new Pen(Color.Green);
drawBrush = new SolidBrush(Color.Green);
}
else if (rdBtnBlue.Checked)
{
drawPen = new Pen(Color.Blue);
drawBrush = new SolidBrush(Color.Blue);
}
else if (rdBtnYellow.Checked)
{
drawPen = new Pen(Color.Yellow);
drawBrush = new SolidBrush(Color.Yellow);
}
}
private void panel4_Paint(object sender, PaintEventArgs e)
{
D.DrawImage(draw_BGbmp, 0, 0);
}

private void panel4_MouseDown(object sender, MouseEventArgs e)
{
draw_p0 = new Point(e.X, e.Y);
}

private void panel4_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (rdBtnLine.Checked)
{
D.DrawImage(draw_BGbmp, 0, 0);
D.DrawLine(drawPen, draw_p0.X, draw_p0.Y, e.X, e.Y);
}
else if (rdBtnRectangle.Checked)
{
D.DrawImage(draw_BGbmp, 0, 0);
D.DrawRectangle(drawPen, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
}
else if (rdBtnEllipse.Checked)
{
D.DrawImage(draw_BGbmp, 0, 0);
D.DrawEllipse(drawPen, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
}
else if (rdBtnFillRec.Checked)
{
D.DrawImage(draw_BGbmp, 0, 0);
D.FillRectangle(drawBrush, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
}
else if (rdBtnFillEllipse.Checked)
{
D.DrawImage(draw_BGbmp, 0, 0);
D.FillEllipse(drawBrush, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
}
}
}

private void panel4_MouseUp(object sender, MouseEventArgs e)
{
if (rdBtnLine.Checked)
draw_bmG.DrawLine(drawPen, draw_p0.X, draw_p0.Y, e.X, e.Y);
else if (rdBtnRectangle.Checked)
draw_bmG.DrawRectangle(drawPen, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
else if (rdBtnEllipse.Checked)
draw_bmG.DrawEllipse(drawPen, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
else if (rdBtnFillRec.Checked)
draw_bmG.FillRectangle(drawBrush, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
else if (rdBtnFillEllipse.Checked)
draw_bmG.FillEllipse(drawBrush, draw_p0.X, draw_p0.Y, e.X - draw_p0.X, e.Y - draw_p0.Y);
}

private void btnClear_MouseClick(object sender, MouseEventArgs e)
{
panel4.BackColor = Color.Transparent;
}

搜尋相關Tags的文章: [ panel ] , [ 畫圖 ] , [ 繪圖 ] , [ 重疊 ] ,
本篇文章發表於2017-06-06 20:14
1樓
最有價值解答

春天
檢舉此回應
那就分三層
再加一層專門用來顯示目前要畫的圖型,mouseMove時就先清除原本的圖再畫新的
mouseUp時就把新增的第三層圖形複制到第二層上
本篇文章回覆於2017-06-07 09:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Fish
檢舉此回應
不太懂用三層的意思...
現在已經把軌跡重複的問題解決了,
但是發現覆蓋在上方的Panel無法變成透明,
用預設值Transparent也沒用,
還是會被覆蓋住...
現在有兩個想法
一.
想辦法把Panel弄成透明的
不知道有沒有哪位厲害的高手可以幫幫我?

二.
畫在同一個Panel上
但是因為我讓軌跡消失在panel_MouseUp內使用了panel.Refresh();
就會造成圖片一直更新,
一更新之後原本底部的心電圖資料也跟著不見了...
所以可能要讓底部Panel的資料不斷地儲存成圖片然後展示出來
但這寫法我完全沒學過也沒頭緒
求各位幫忙!!!!!
能否直接寫一段程式碼給我參考~~
拜託了><
本篇文章回覆於2017-06-07 23:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

春天
檢舉此回應
你在paint事件中畫了一張image在panel上,我想應該是妳的image不是透明的關係

本篇文章回覆於2017-06-08 10:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.