【发布时间】:2018-12-06 14:04:15
【问题描述】:
我的应用程序中有两个窗体。在主窗体上,我单击一个按钮并打开带有面板的第二个窗口。在面板上的那个表格中,我画了一些东西,我正在把它读到一个图片框上。
这是我的主要表单的编码。
Bitmap retBmp;
FrmDrawing frmDrawing = new FrmDrawing();
var result = frmDrawing.ShowDialog();
if (result == DialogResult.OK)
{
retBmp = frmDrawing.bmpNew;
pbDesign.Image = retBmp;
}
这就是我在第二个表格上的绘画方式。
public FrmDrawing()
{
InitializeComponent();
g = pnlDraw.CreateGraphics();
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
pen = new Pen(Color.Black, 5);
pen.StartCap = pen.EndCap = System.Drawing.Drawing2D.LineCap.Round;
}
private void pbRed_Click(object sender, EventArgs e)
{
PictureBox p = (PictureBox)sender;
pen.Color = p.BackColor;
}
private void pnlDraw_MouseDown(object sender, MouseEventArgs e)
{
moving = true;
x = e.X;
y = e.Y;
pnlDraw.Cursor = Cursors.Cross;
}
private void pnlDraw_MouseMove(object sender, MouseEventArgs e)
{
if (moving && x!=-1 && y!=-1 )
{
g.DrawLine(pen, new Point(x, y), e.Location);
x = e.X;
y = e.Y;
}
}
private void pnlDraw_MouseUp(object sender, MouseEventArgs e)
{
moving = false;
x = -1;
y = -1;
pnlDraw.Cursor = Cursors.Default;
}
private void btnClear_Click(object sender, EventArgs e)
{
g.Clear(Color.White);
pnlDraw.Invalidate();
}
private void btnAccept_Click(object sender, EventArgs e)
{
bmpNew = new Bitmap(pnlDraw.Width, pnlDraw.Height);
this.pnlDraw.DrawToBitmap(bmpNew, new Rectangle(0, 0, this.pnlDraw.Width, this.pnlDraw.Height));
this.DialogResult = DialogResult.OK;
this.Close();
}
在第二种形式中,我将面板上绘制的内容读取到 bmp,然后在单击按钮时将其传递给表单。这段代码几乎可以正常工作,除了它只通过面板而不是在上面绘制的内容。如果我在我绘制的面板上放置另外两个彩色图片框控件,则显示的图像带有这些彩色图片框,但不带有我在面板上绘制的内容。 阅读我在面板上绘制的位图时,我在这里做错了什么?或者为了让我在面板上绘制的位图应该更正什么。
【问题讨论】:
-
见this post中的例子
-
g = pnlDraw.CreateGraphics(); 千万不要这样做!在 Paint 事件中绘制,然后使用 DrawToBitmap!
-
@RezaAghaei 我没有得到你在代码中所做的事情,你能给我一个与这个场景相关的例子吗?
-
@TaW 你能展示一个代码示例吗?
标签: c# winforms bitmap panel draw