tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChartとPictureBoxを一緒にクリップボードにコピー
記事No10987
投稿日: 2012/12/07(Fri) 16:58
投稿者そら
No.10972とNo.10983に関連する質問で教えてください。

教えていただきサンプルも使わせていただいて、Chart内にPictureBoxをつくり、そこに文字を描画して、
そのままそっくりクリップボードにコピーをしようとしたのですが、このままではどちらか一方しかコピーがされません。
どうすれば良いのでしょう、教えてください。


    Private Sub Form1_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        '列の作成
        With dt.Columns
            .Add("日付", GetType(String))
            .Add("指数", GetType(Integer))
        End With
        'データの追加
        dt.Rows.Add("12/01", 40)
        dt.Rows.Add("12/02", 60)
        dt.Rows.Add("12/03", 30)
        '初期化    
        Chart1.Series.Clear()
        'グラフの種類,系列,軸の設定
        Dim rosoku = Chart1.Series.Add("棒グラフ")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.Column
            .XValueMember = "日付"
            .YValueMembers = "指数"
        End With
        Chart1.DataSource = dt
        Chart1.DataBind()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click

        '描画
        Dim g As Graphics
        With PictureBox1
            .Image = New Bitmap(100, 100)
            g = Graphics.FromImage(.Image)
        End With
        Dim f As New Font("MS Pゴシック", 11)
        g.DrawString("ABCDEFG", f, Brushes.Blue, 0, 0)
        f.Dispose()
        g.Dispose()

        'Chartをクリップボードにコピー
        Using memStream As New System.IO.MemoryStream()
            '一旦 Stream オブジェクトに保存
            Chart1.SaveImage(memStream, System.Drawing.Imaging.ImageFormat.Bmp)
            Dim bmp As New Bitmap(memStream)
            'ビットマップをクリップボードに貼り付け
            Clipboard.SetDataObject(bmp)
        End Using

        'PictureBoxをクリップボードにコピー
        If Not PictureBox1.Image Is Nothing Then
            'データをシステム クリップボードに貼り付け
            Clipboard.SetDataObject(PictureBox1.Image, True)
        End If
    End Sub

[ツリー表示へ]
タイトルRe: ChartとPictureBoxを一緒にクリップボードにコピー
記事No10988
投稿日: 2012/12/07(Fri) 17:19
投稿者Hongliang
> Chart1.SaveImage(memStream, System.Drawing.Imaging.ImageFormat.Bmp)
> Dim bmp As New Bitmap(memStream)
で作ったBitmapに対してDrawStringまたはDrawImageするとか。

[ツリー表示へ]
タイトルRe^2: ChartとPictureBoxを一緒にクリップボードにコピー
記事No10990
投稿日: 2012/12/07(Fri) 22:39
投稿者そら
Hongliang さん
 ありがとうございます。

出来ましたらもう少し具体的にお願いでしょうか。
DrawStringもDrawImageも調べてみたのですが、
どのようにすればよいのか分かりません(^^;

[ツリー表示へ]
タイトルRe^3: どなたか…
記事No10991
投稿日: 2012/12/13(Thu) 12:00
投稿者そら
Hongliangさんは忙しいようです。

どなたか教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^4: どなたか…
記事No10992
投稿日: 2012/12/13(Thu) 23:02
投稿者VBレスキュー(花ちゃん)
最初の時にリンク先の説明でやり方を書いていたはずですが。
それと文字等の描画方法等は、基本的な事ですからここのサンプルやネット上のサンプルを
試して自分の物にしないと今後も他人にコードを書いてもらう事になりますよ。

PictureBox1 と Chart1 は同じサイズにして下記コードを試して見て下さい。
(動作確認用なのでコードは簡略にしていますので、理屈が呑み込めたら目的に合わせて
書き直して下さい)

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim dt As New DataTable
        '列の作成
        With dt.Columns
            .Add("日付", GetType(String))
            .Add("指数", GetType(Integer))
        End With
        'データの追加
        dt.Rows.Add("12/01", 40)
        dt.Rows.Add("12/02", 60)
        dt.Rows.Add("12/03", 30)
        '初期化    
        Chart1.Series.Clear()
        'グラフの種類,系列,軸の設定
        Dim rosoku = Chart1.Series.Add("棒グラフ")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.Column
            .XValueMember = "日付"
            .YValueMembers = "指数"
        End With
        Chart1.DataSource = dt
        Chart1.DataBind()
'------------------------------- ここまでは貴方のコードを使用 ------------------------------
Chart1.Visible = False

   'グラフをBitmapとして取得してPictureBox1上に表示
   Dim bmp As New Bitmap(Chart1.Width, Chart1.Height)
   Chart1.DrawToBitmap(bmp, New Rectangle(0, 0, Chart1.Width, Chart1.Height))
   With PictureBox1
      .SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
      .Image = bmp
   End With
   Using g As Graphics = Graphics.FromImage(PictureBox1.Image)
       Dim f As New Font("MS Pゴシック", 11)
        g.DrawString("ABCDEFG", f, Brushes.Blue, 0, 0)
   End Using
   Clipboard.SetDataObject(PictureBox1.Image, True)
End Sub


又は、ここのサンプルを利用して、貴方が書いたコード風にすると

'-------------------------- ここまでは貴方のコードを使用 ------------------------------
Chart1.Visible = False

   Using memStream As New System.IO.MemoryStream()
      '一旦 Stream オブジェクトに保存
      Chart1.SaveImage(memStream, System.Drawing.Imaging.ImageFormat.Bmp)
      Dim bmp As New Bitmap(memStream)
      With PictureBox1
         .SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
         .Image = bmp
      End With

      Using g As Graphics = Graphics.FromImage(PictureBox1.Image)
          Dim f As New Font("MS Pゴシック", 11)
           g.DrawString("ABCDEFG", f, Brushes.Blue, 0, 0)
      End Using

   End Using

   If Not PictureBox1.Image Is Nothing Then
      'データをシステム クリップボードに貼り付け
      Clipboard.SetDataObject(PictureBox1.Image, True)
   End If

でも同様の結果となります。
どこが、どう貴方のコードと違うのかを理解して下さい。

[ツリー表示へ]
タイトルRe^5: どなたか…
記事No10994
投稿日: 2012/12/15(Sat) 20:17
投稿者そら
花ちゃんさん
 ありがとうございます。

> 最初の時にリンク先の説明でやり方を書いていたはずですが。
リンク先は拝見しましたが、そこには画像しかなく、
VB2005用サンプル一覧でも 371、387 のHP掲載は未掲載となってましたので、余りよく分からなかったです。

> それと文字等の描画方法等は、基本的な事ですからここのサンプルやネット上のサンプルを
> 試して自分の物にしないと今後も他人にコードを書いてもらう事になりますよ。
言われることはよく分かるのですが、これが本職ではないこともあって、
身勝手な願いではあるのですが、あまり敷居は高くないほうがうれしいです。

二つのサンプル、一応理解は出来ました。
早速活用させていただきます。
本当にありがとうございました。

[ツリー表示へ]