• 締切済み

VB.netのPanelコントロール印刷について

現在帳票印刷でわからないことがあり質問しました。 【開発環境】 VS2008(VB.net) WindowsXP excel2008 FlexGrid.net 4.0J 【やりたいこと】 Panelの上に多数のラベルが配置されている状態(PanelSizeをはみ出して配置してある)でスクロールバーで全体を見ることになっている状態です。イメージ的には座席表でラベルが机になります(ラベルには名前を表示しています)。 その座席表をプレビュー表示させて印刷を行いたいのですが方法が決まっておりません。Gridを使っていないので困っています。 【質問】 悩みどころは、実現方法がわからないことです。 実現方法として考えたのがPanelをBitmapに変換して、エクセルに貼り付けたあとプレビューで表示させようかと考えています。 このようなことは出来るのでしょうか。Panelのコンテナにはラベルが配置されているとの認識ですのでPanelをBitMapに変換したら上のラベルも表示されるかと思っていますが認識が間違っているのでしょうか。 また、ほかに良い方法がありましたら是非、教えてください。

みんなの回答

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

私も実験してみました。 下記のHPを参考にしてみました。 ■Graphicsオブジェクトをビットマップで保存するには?  http://dobon.net/vb/bbs/log3-24/15237.html     おそらく Win32API のbitbit でも同じことができますがこちらのほうが簡単そうです。 #1 の方法も参考にし、実験ましたが先に上記方法で解決できましたのでお知らせします。 結果はできました。 画面イメージのまま保存に成功しています。 =========================<サンプル>======================= Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ''コントロールの外観を描画するBitmapの作成() '***ビットマップ領域の定義 ' Dim Image As Image = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height) 'スクリーン全体を取得するばあい Dim Image As New Bitmap(Me.Panel1.Width, Me.Panel1.Height) 'PANELのみの大きさを定義 Dim graph As Graphics = Graphics.FromImage(Image) '**** イメージをキャプチャします。  'graph.CopyFromScreen(New Point(0, 0), New Point(0, 0), Screen.PrimaryScreen.Bounds.Size) 'スクリーン全体を取得するばあい 'PANELのみキャプチャするため取得するスクリーンの位置(x,y)を指定します。フォームのエッジ部分の幅は数字で微調整しています。 graph.CopyFromScreen(New Point(Me.Location.X + Me.Panel1.Location.X + 8, Me.Location.Y + Me.Panel1.Location.Y + 28), New Point(0, 0), Me.Panel1.Bounds.Size) Image.Save("C:\TEST_PGM\TEST\test.bmp") End Sub End Class ========================================================================================================================================= 用意したのは FOrm1 にPanel とLABEL 2個です。  これでうまく行きます。 ただしこの方法ですと おそらく画面に表示されたそのものであるため別なウインドウが重なるとそのイメージになるかもしれません。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

以下のHPが有効だと思います。 ◇フォーム、コントロールの外観をキャプチャする → http://dobon.net/vb/dotnet/graphics/invokepaint.html この記事の「ピクチャボックスに表示されている画像を取得する」 を参考にしてみればよいかと。 印刷については ◇フォームのイメージを印刷する  http://dobon.net/vb/dotnet/vb6/printform.html   でできそうですね。 ★ほかの方法 >>Panelの上に多数のラベルが配置されている状態(PanelSizeをはみ出して配置してある) >>でスクロールバーで全体を見ることになっている状態です。 >>イメージ的には座席表でラベルが机になります(ラベルには名前を表示しています)。 Panelを直接印刷せずとも Excel オブジェクトを OLE で作成すれば 同じものを印刷できるのでは ないでしょうか? VB.net 側から Excel 2003 のBook を作成すれば 問題解決できそうに思えますけど。

sunahukins
質問者

補足

NOBNNNさん回答していただきありがとうございます。 早速試しましたところ、Panelのキャプチャーは取れましたが、Panel上のラベルコントロールがキャプチャーできずPanelだけがキャプチャーされます。 下記はそのコードです。(紹介していただいたところをまねてみました) ---------------------------------------------------------- 'パネルの大きさを取得 Dim rect As Rectangle = Me.Panel1.ClientRectangle Dim bmp As New Bitmap(rect.Width, rect.Height) 'bmpに画像を入れるための準備 Dim g As Graphics = Graphics.FromImage(bmp) Dim pea As New PaintEventArgs(g, rect) 'PaintBackgroundイベントを発生 Me.InvokePaintBackground(Me.Panel1, pea) 'Paintイベントを発生 Me.InvokePaint(Me.Panel1, pea) '画像を保存する bmp.Save("C:\test.png") '解放する g.Dispose() bmp.Dispose() ------------------------------------------------------- 上記のようにPanelをBitmapにしてもPanel上のラベルは取得できませんでした。 ラベルを取得してBitmapに変換することはできるのでしょうか。