none
[VB 2005]統計圖的畫圖和列印問題? 急~~~ 請高手幫忙, 拜託 RRS feed

  • 問題


  • 我用visual studio 05寫了一個VB.net統計圖的程式
    我想要做成的程式是像這樣


    我現在做出來的程式是這個
     
    我的問題是
    我要怎麼去畫我的矩形圖
    我用g.FillRectangle(Blue, 30, 30, 30, 300 * percentage(0))
    去話第一個長條圖
    可是它是從左上角畫起
    我要怎麼修改我的編碼變成這個矩形是從下面畫起?

    然後我想再請問一下
    假如我要把每個輸入的數值
    也表現在每個長條型中間
    要怎麼修改
    我用
    g.DrawString(data(0), drawFont, drawBrush, drawPoint)
    在drawPoint裡面的座標,我要怎麼修改它讓它會表現在相對應的長條型正中間?

    最後一個問題
    我要怎麼列印我寫好的統計圖?
    當VB.net再跑程式的時候
    在Plot 裡面我可以選列印的選項
    按了之後
    我的統計圖就會先預覽列印,然後再列印出來
    我知道好像要用PrintDocument來寫
    可是我要怎麼寫阿?
    假如我是用PrintDocument來寫
    那我在選項裡面PrinterToolStripMenuItem_Click
    又要怎麼去叫這個寫好的PrintDocument?

    請高手幫幫我,拜託. 謝謝

    我的程式碼:


    程式碼區塊


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

            Dim Blue As Brush = Brushes.Blue
            Dim Red As Brush = Brushes.Red
            Dim Purple As Brush = Brushes.Purple
            Dim Green As Brush = Brushes.Green
            Dim Yellow As Brush = Brushes.Yellow

            Dim Black As Pen = New Pen(Color.Black, 3)
            Dim total As Decimal
            Dim data(5) As Decimal
            Dim percentage(5) As Decimal

            data(0) = Val(TextBox1.Text)
            data(1) = Val(TextBox2.Text)
            data(2) = Val(TextBox3.Text)
            data(3) = Val(TextBox4.Text)
            data(4) = Val(TextBox5.Text)

            If data(0) = 0 And data(1) = 0 And data(2) = 0 Then Exit Sub
            total = data(0) + data(1) + data(2) + data(3) + data(4)
            percentage(0) = data(0) / total
            percentage(1) = data(1) / total
            percentage(2) = data(2) / total
            percentage(3) = data(3) / total
            percentage(4) = data(4) / total


            Dim g As Graphics = PictureBox1.CreateGraphics()


            g.Clear(Color.White)


            g.FillRectangle(Blue, 30, 30, 30, 300 * percentage(0))

                    Dim drawFont As New Font("Arial", 16)
                    Dim drawBrush As New SolidBrush(Color.Black)
                    Dim drawPoint As New PointF(150.0F, 150.0F)
                    g.DrawString(data(0), drawFont, drawBrush, drawPoint)
           
            g.FillRectangle(Red, 65, 30, 30, 300 * percentage(1))
           
            g.FillRectangle(Purple, 100, 30, 30, 300 * percentage(2))
           
            g.FillRectangle(Green, 135, 30, 30, 300 * percentage(3))
           
            g.FillRectangle(Yellow, 170, 30, 30, 300 * percentage(4))
           

            g.Dispose()                                                 
        End Sub


    Private Sub PrinterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrinterToolStripMenuItem.Click
       
        End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage


    End Sub


    2007年11月26日 上午 07:00

解答

  • 請慎選對應的討論區,純粹的 VB 問題請在 VB 版張貼, 你張貼文章的版面註解請仔細看:

    程式碼區塊
    Visual Studio一般討論區(General)
    討論Visual Studio整合開發環境,分享小技巧或各種訣竅

     

     

    比較簡單的柱狀圖輸出,你可以直接使用 OWC ,OWC 可同時在 Windows Form / Web client / Web Server 上使用。

     

    變換座標位置請參閱 Graphics 類別下,所有關於 Transform 的屬性與方法。

     

    但是座標轉換會造成字型也跟著反轉,所以我自己是中間插個中介層來處理座標轉換,也就是線性代數的 Mapping 。

     

    字串置中也是要自己換算,例如:

    程式碼區塊

    With g

         txtSize = .MeasureString(typhoonName, typhoonFont)

         .DrawString(typhoonName, typhoonFont, typhoonBrush, cp.X - txtSize.Width / 2, tp.Y - txtSize.Height / 2)

    End With

     

     

    這部分我比較建議畫成 EMF ,因為這樣只要畫一份,就可以指給 PictureBox / Printer ,會比較方便。

     

    不管列印或預覽列印都會呼叫 PrintDocument1_PrintPage

     

    所以你只要在上面方法呼叫你的副程式即可,我自己用向量檔,縮放不會有失真問題,就這樣用:

    程式碼區塊

    Dim img As Image = PrintObject

    Dim ZoomScale As Double = 1

    Dim destRect As RectangleF

    PrintDoc.DocumentName = Application.ProductName & "_fig"

     

    ' 計算縮放區域

    With rectPrintingArea

       ZoomScale = Math.Min(.Width / img.Width, .Height / img.Height)

       destRect = New RectangleF(.Left + Math.Max((.Width - img.Width * ZoomScale) / 2, 0), .Top + Math.Max((.Height - img.Height * ZoomScale) / 2, 0), img.Width * ZoomScale, img.Height * ZoomScale)

    End With

     

    e.Graphics.DrawImage(img, destRect)

    e.HasMorePages = False

     

     

     

    2007年11月26日 上午 07:25
    版主