2017-12-01 11 views
2

私はGraphicsオブジェクトとPanelを持っています。 Graphicsオブジェクトは、パネルからHandlerを使用してインスタンス化されます。次に、ペイントアクションでパネルが更新されます。ペイントアクションの内部では、Graphicsオブジェクトがペイントに使用されます。ときどきコードを使って、Invalidate()を使ってパネルを更新します。パネルをビットマップに保存する#Winforms

GraphicsオブジェクトのコンテンツまたはPanelのコンテンツをファイルに保存します。私がそれをしようとするたびに、画像ファイルが作成されますが、空白です。ここ

は、コードの一部抜粋である:

I、クラス変数としてグラフィックオブジェクトを開始:

Graphics GD_LD; 

そしてIがパネルハンドラを使用してオブジェクトをインスタンス化するために以下を使用コンストラクタで:

GD_LD = Graphics.FromHwnd(panelDrawLD.Handle); 

次に、私はグラフィックスオブジェクトを使用してすべての図面を作成していましたが、パネルのペイントアクションで使用される描画関数を持っています。

private void panelDrawLD_Paint(object sender, PaintEventArgs e) 
{ 
    ..... some code .... 
    //Code example 
    GD_LD.FillPolygon(blackBrush, getPoints(min, sizeGP, scaleX, scaleY)); 
    GD_LD.FillPolygon(blackBrush, getPoints(max, sizeGP, scaleX, scaleY)); 
    ..... some code .... 
} 

上記は、パネルに描画して常に図面と一緒に保持するのに適しています。

Bitmap I_LD = new Bitmap(panelDrawLD.Size.Width, panelDrawLD.Size.Height); 
panelDrawLD.DrawToBitmap(I_LD, new Rectangle(0,0, panelDrawLD.Size.Width, panelDrawLD.Size.Height)); 
I_LD.Save(tempPath + "I_LD.bmp",ImageFormat.Bmp); 
イメージファイルが作成され

が、コンテンツなし:

問題は、画像ファイルへのパネルを保存しようとしたときです。ちょうど空白。

私はこのテーマについていくつかのスレッドを見ましたが、自分の状況に適応できませんでした。

私は間違っていますか?可能な解決策は何ですか?

+1

は 'Graphics.FromHwnd'はほとんど常に行うには間違ったことです。あなたのペイントイベントでは、 'DG_LD'ではなく' examples'を使っていなければなりません。 –

+1

[パネル上の図形をバイナリとして保存する方法](https://stackoverflow.com/a/40575797/3110834) –

+0

@RezaAghaeiリンクのおかげで、そこには素晴らしいマニュアルがあります! – Nuno

答えて

2

本当にすべきことは、オブジェクトを引数として受け取り、targetというサブルーチンにペイントイベントをリファクタリングしています。すべての図面をtargetに対して行います。その後、それを呼び出してe.GraphicspanelDrawLD_Paintから渡して、Graphics.FromImage(I_LD)で作成したGraphicsで他の関数から呼び出すことができます。

また、Graphics(または他のGDIオブジェクト)を作成する場合は、MUSTを破棄するか、メモリリークが発生します。このよう

private void panelDrawLD_Paint(object sender, PaintEventArgs e) 
{ 
    //e.Graphics does NOT need to be disposed of because *we* did not create it, it was passed to us by the control its self. 
    DrawStuff(e.Graphics); 
} 

private void Save() 
{ 
    // I_LD, and g are both GDI objects that *we* created in code, and must be disposed of. The "using" block will automatically call .Dispose() on the object when it goes out of scope. 
    using (Bitmap I_LD = new Bitmap(panelDrawLD.Size.Width, panelDrawLD.Size.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(I_LD)) 
     { 
      DrawStuff(g); 
     } 
     I_LD.Save(tempPath + "I_LD.bmp", ImageFormat.Bmp); 
    } 
} 


private void DrawStuff(Graphics target) 
{ 
    //Code example 
    target.FillPolygon(blackBrush, getPoints(min, sizeGP, scaleX, scaleY)); 
    target.FillPolygon(blackBrush, getPoints(max, sizeGP, scaleX, scaleY)); 
} 
+0

Thanks @ BradleyUffner、それは私の問題を解決しました... – Nuno

関連する問題