获取面板上绘制的内容到位图

时间:2018-12-06 14:04:15

标签: c# winforms bitmap panel draw

我的应用程序中有两个Windows窗体。在主窗体上,我单击一个按钮,然后打开一个带有面板的第二个窗口。在面板上的那个表格中,我绘制东西,然后将其阅读到一个图片框中。

这是我主要表格的编码。

if(True)

这就是我绘制第二张表格的方式。

- name: archive logs in zip
  archive:
    path: "{{ item[1]|map(attribute='path')|list }}"
    dest: "/app/logs/{{ item[0] }}.zip"
   format: zip
  loop: "{{ grouped }}"
  vars:
    grouped: "{{ files_list|groupby('name') }}"

在第二种形式中,我将面板上的内容读到bmp,然后单击按钮将其传递给该形式。这段代码几乎可以正常工作,除了它只通过面板而不是通过面板上的内容。如果我在绘制的面板上放置了另外两个彩色的图片框控件,则显示的图像将与这些彩色的图片框一起提供,而不是与我在面板上绘制的图片一起提供。 阅读我在面板上绘制到位图的内容时,我在这里做错了什么?还是应该纠正什么,才能使我在面板上绘制的内容变为位图。

1 个答案:

答案 0 :(得分:0)

首先,您可以阅读on MSDN

  

在处理完当前Windows消息后,通常不应保留通过Graphics方法检索的CreateGraphics对象,因为用该对象绘制的所有内容都会在下一个{{1 }} 信息。因此,除了使用WM_PAINT之类的非可视方法外,您无法缓存Graphics对象以供重用。取而代之的是,您必须每次Graphics.MeasureString都使用{strong> CreateGraphics对象,然后在完成使用后调用Graphics

(重点是我的)

因此,您不应在表单构造函数中创建Dispose对象,而应在事件处理程序中动态创建并将其处理。

但是那仍然无法帮助您。尝试将表单移出屏幕并移回,您会发现所有自定义图纸都消失了。这是因为您没有保留它们-它们仅被一次性渲染。

使用Graphics并直接在其PictureBox上绘制线条,而不是使用面板。

Bitmap现在是pnlDraw,而不是PictureBox

Panel