Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: GDI+:lla piirtäminen

AM [19.10.2005 22:37:11]

#

TNB:llä on täällä muutamia esimerkkejä grafiikan piirrosta gdi+:lla. Tein oman pylvädiagrammi kuvaajan jonka liitän myöhemmin tekemääni sääohjelmaan

Tässä muutama linkki gdi+:aan liittyen:
http://www.vbdotnetheaven.com/Code/Apr2003/002.asp
http://www.vbdotnetheaven.com/Sections/GDI .asp

Alla on kontrollin lähdekoodit, ehdotelkaa parannuksia ja mitä ikinä mieleen tuleekin.

Kuva kontrollista: http://kotisivu.mtv3.fi/Arto.Muikku/gdikuvaaja.PNG
Kontrolli -projektin voi ladata täältä: http://kotisivu.mtv3.fi/Arto.Muikku/GDIKuvaaja.zip

USERCONTROL

' KUVAAJAKONTROLLI

' piirtää sääkuvaajan joka mahdollistaa lämpötilan esittämisen pylväillä yhden tunnin eroilla ja yhden
' celsius asteen tarkkuudella. käyttäjä passaa säätiedot 24 alkioiseen taulukkoon ja kontrolli hoitaa loput

' Arto Muikku 19.10.2005

' otetaan käyttöön gdi+:n nimityksiä
Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class ucKuvaaja
    Inherits System.Windows.Forms.UserControl

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'UserControl overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        '
        'ucKuvaaja
        '
        Me.BackColor = System.Drawing.SystemColors.ControlLightLight
        Me.Name = "ucKuvaaja"
        Me.Size = New System.Drawing.Size(972, 560)

    End Sub

#End Region

    ' taulukko johon lämpötilat asetetaan joka tunnille. jos haluaa asettaa lämpötilan esim klo 18.00 ajalle,
    ' niin se laitetaan alkioon 17 jne.
    Public Shared g_dblLampotilaTaulukko(23) As Double

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        ' kuvaajan piirto. piirretään jonkinsortin lämpötilakuvaaja joka osaa
        ' hanskata sekä plus että miinus asteet.
        ' jyrää formin/kontrollin piirron ja piirtää sinne itse omaa grafiikkaa

        ' esitellään kaikki komponentin grafiikan piirton tarvittava.
        Dim g As Graphics = e.Graphics
        Dim lPlusBrush As LinearGradientBrush
        Dim rcPlusPalkki As Rectangle
        Dim lMiinusBrush As LinearGradientBrush
        Dim rcMiinusPalkki As Rectangle
        Dim pn As Pen = New Pen(Color.Black, 1)
        Dim fontFmly As New FontFamily("Arial")
        Dim fntArial8 As New Font(fontFmly, 8)

        Dim i As Integer

        ' kuvaajan eri elementtien paikkojen lasketaan
        Dim dblNollataso As Double
        Dim intKorkeus As Long
        Dim y1 As Long
        Dim y2 As Long
        Dim x As Long
        Dim intViivaX As Integer
        Dim intViivaY As Integer
        Dim dblPlusVali As Double
        Dim dblMiinusVali As Double

        ' asetetaan taulkon oletuspaikkoja ja oletuskorkeuksia
        x = 50          ' x-akseli eli lähdetään piirtämään 50p:n päästä vasenta reunaa
        y1 = 100        ' pluspalkin alkuarvo y-akselilla
        y2 = 110        ' miinuspalkin alkuarvo y-akselilla
        intKorkeus = 0  ' palkkien oletuskorkeus
        intViivaX = m_intHaePieninarvo(g_dblLampotilaTaulukko) * (-1) * 2 + y2 + 10 ' lasketaan alimman viivan
        intViivaY = y1 - m_intHaeSuurinnarvo(g_dblLampotilaTaulukko) * 2

        For i = 0 To UBound(g_dblLampotilaTaulukko)

            ' tarkistetaan kumpaa palkkia piirretään, jos käsiteltävän alkion luku on positiivinen piirretään pluspalkkia
            ' jos negatiivinen piirretään miinuspalkkia. jos arvoa ei ole ei piirretä palkkia ollenkaan
            If g_dblLampotilaTaulukko(i) > 0 Then

                ' pluspalkin piirtäminen

                ' siirretään palkin vähän oikealle ja jätetään pieni rako viereiseen palkkiin.
                ' otetaan palkin korkeus ylös piirtoa varten ja piirretään se oikeaan kohtaan
                x = x + 30
                intKorkeus = g_dblLampotilaTaulukko(i) * 2
                y1 = 100 - intKorkeus

                ' piirretään palkki edellä laskettuun kohtaan gradienttina punaisesta siniseen
                rcPlusPalkki = New Rectangle(x, y1, 25, intKorkeus)
                lPlusBrush = New LinearGradientBrush(rcPlusPalkki, Color.Red, Color.Blue, LinearGradientMode.Vertical)
                g.FillRectangle(lPlusBrush, rcPlusPalkki)
            End If

            If g_dblLampotilaTaulukko(i) < 0 Then

                ' miinuspalkin piirtäminen

                ' siirretään palkkia oikealle ja jätetään pieni rako viereiseen palkkiin
                ' otetaan palkin korkeus ylös piirtoa palkin, muutetaan myös korkeus vastaluvuksi
                x = x + 30
                intKorkeus = g_dblLampotilaTaulukko(i) * 2
                intKorkeus = intKorkeus * (-1)

                ' piirretään palkki edellä lasettuun kohtaan gradienttina sinisestä punaiseen
                rcMiinusPalkki = New Rectangle(x, y2, 25, intKorkeus)
                lMiinusBrush = New LinearGradientBrush(rcMiinusPalkki, Color.Blue, Color.Red, LinearGradientMode.Vertical)
                g.FillRectangle(lMiinusBrush, rcMiinusPalkki)
            End If

            If g_dblLampotilaTaulukko(i) = 0 Then

                ' ei piirretä palkkia, liikutetaan vain x:ää oikealle normaalisti
                x = x + 30
            End If

            ' piirretään joka kierroksellä palkkien alle kellonaika
            g.DrawString(i & ".00", fntArial8, New SolidBrush(Color.Red), x, intViivaX + 3)
        Next i

        ' piirretään x-akselille kaksi viivaa, alas yksi ja keskelle yksi
        g.DrawLine(pn, 50, intViivaX, x + 25, intViivaX)    ' alatason viiva
        g.DrawLine(pn, 60, 105, x + 25, 105)    ' kesitason viiva

        ' piirretään y-akselille yksi viiva oikealle
        g.DrawLine(pn, 73, intViivaY, 73, intViivaX + 30)

        ' laskeaan sopiva asteikko miinus ja plus asteiden näyttämiseen
        ' näytetään asteikko, tästä voisi tehdä dynaamisemman
        ' tehdään myös pienet täkyt asteikon alle
        dblPlusVali = m_intHaeSuurinnarvo(g_dblLampotilaTaulukko) * 2 / 4
        dblMiinusVali = (m_intHaePieninarvo(g_dblLampotilaTaulukko) * (-1)) * 2 / 4

        g.DrawString(dblPlusVali * 4 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 45, 100 - dblPlusVali * 4)
        g.DrawLine(pn, 70, CInt(100 - dblPlusVali * 4), 77, CInt(100 - dblPlusVali * 4))
        g.DrawString(dblPlusVali * 3 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 45, 100 - dblPlusVali * 3)
        g.DrawLine(pn, 70, CInt(100 - dblPlusVali * 3), 77, CInt(100 - dblPlusVali * 3))
        g.DrawString(dblPlusVali * 2 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 45, 100 - dblPlusVali * 2)
        g.DrawLine(pn, 70, CInt(100 - dblPlusVali * 2), 77, CInt(100 - dblPlusVali * 2))
        g.DrawString(dblPlusVali * 1 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 45, 100 - dblPlusVali * 1)
        g.DrawLine(pn, 70, CInt(100 - dblPlusVali * 1), 77, CInt(100 - dblPlusVali * 1))

        g.DrawLine(pn, 70, CInt(110 + dblMiinusVali * 1), 77, CInt(110 + dblMiinusVali * 1))
        g.DrawString("-" & dblMiinusVali * 1 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 41, 110 + dblMiinusVali * 1 - 12)
        g.DrawLine(pn, 70, CInt(110 + dblMiinusVali * 2), 77, CInt(110 + dblMiinusVali * 2))
        g.DrawString("-" & dblMiinusVali * 2 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 41, 110 + dblMiinusVali * 2 - 12)
        g.DrawLine(pn, 70, CInt(110 + dblMiinusVali * 3), 77, CInt(110 + dblMiinusVali * 3))
        g.DrawString("-" & dblMiinusVali * 3 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 41, 110 + dblMiinusVali * 3 - 12)
        g.DrawLine(pn, 70, CInt(110 + dblMiinusVali * 4), 77, CInt(110 + dblMiinusVali * 4))
        g.DrawString("-" & dblMiinusVali * 4 / 2 & "C", fntArial8, New SolidBrush(Color.Red), 41, 110 + dblMiinusVali * 4 - 12)

        ' lopuksi "legenda y-akselille
        g.DrawString("Lämpötila", fntArial8, New SolidBrush(Color.Black), 7, 105 - 8)
    End Sub

    Private Function m_intHaePieninarvo(ByVal dblTaulukko() As Double) As Integer

        ' etsii parametrina saamastaan taulukosta pienimmän arvon
        ' en tiedä olisiko jo valmiiksi tällainen ominaisuus taulukolla

        Dim i As Integer
        Dim intPienin As Integer

        intPienin = 999

        ' etsitään pienin kaikista taulukon alkioista
        For i = 0 To UBound(dblTaulukko)
            ' onko pienempi kuin pienin tähän asti
            If dblTaulukko(i) < intPienin Then
                intPienin = dblTaulukko(i)
            End If
        Next i

        ' palautetaan
        m_intHaePieninarvo = intPienin
    End Function

    Private Function m_intHaeSuurinnarvo(ByVal dblTaulukko() As Double) As Integer

        ' etsii parametrina saamastaan taulukosta suurimman arvon
        ' en tiedä olisiko jo valmiiksi tällainen ominaisuus taulukolla

        Dim i As Integer
        Dim intSuurin As Integer

        intSuurin = 0

        ' etsitään suurin kaikista taulukon alkioista
        For i = 0 To UBound(dblTaulukko)
            ' onko pienempi kuin pienin tähän asti
            If dblTaulukko(i) > intSuurin Then
                intSuurin = dblTaulukko(i)
            End If
        Next i

        ' palautetaan
        m_intHaeSuurinnarvo = intSuurin
    End Function
End Class

FORM JOSSA KUVAAJAKONTROLLI ON

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' esitellään kontrolli
    Dim Lampotilat As New ucKuvaaja

    ' astetaan joitakin tietoja kontrollin lämpötilataulukkoon. kuvaaja luodaan taulukon pohjalta
    Lampotilat.g_dblLampotilaTaulukko(0) = 10
    Lampotilat.g_dblLampotilaTaulukko(1) = -10
    Lampotilat.g_dblLampotilaTaulukko(2) = 23
    Lampotilat.g_dblLampotilaTaulukko(3) = 40
    Lampotilat.g_dblLampotilaTaulukko(4) = -60
    Lampotilat.g_dblLampotilaTaulukko(7) = 15
    Lampotilat.g_dblLampotilaTaulukko(8) = 5
    Lampotilat.g_dblLampotilaTaulukko(9) = 25
    Lampotilat.g_dblLampotilaTaulukko(11) = -10
    Lampotilat.g_dblLampotilaTaulukko(12) = -15
    Lampotilat.g_dblLampotilaTaulukko(13) = -12
    Lampotilat.g_dblLampotilaTaulukko(18) = -2
    Lampotilat.g_dblLampotilaTaulukko(19) = 5
    Lampotilat.g_dblLampotilaTaulukko(20) = -7
End Sub

ZcMander [24.10.2005 15:38:27]

#

Laita ny sentään aste-merkki että se näyttää järkevältä, ja paremmat feidit ja haalea ristikko.

Tai vielä paremmin, nuo olis käyttäjän säädettävissa, mahdollisuus tuon ruman feidin tilalle vaikka kuva.

AM [25.10.2005 15:36:18]

#

Jip, kunhan lisäilen tuon sääohjelmaan niin teen vielä kontrollille ominaisuuksia esim. ristikon päälle laitosta ja palkkien värien vaihdosta.

ZcMander [26.10.2005 18:06:09]

#

Vielä lämpömittarin teko-ohjeet: http://elektroniikka.org/thermometer/

esakom [29.10.2005 11:55:43]

#

Eikös kellonajoissa ole tapana käyttää kaksoispistettä? Tyyliin 17:00 (ei 17.00)?

ZcMander [31.10.2005 15:30:46]

#

vain digitaalisessa, mutta minusta tuo on hienompi

NanoSoft [23.02.2006 21:06:12]

#

lainaus:

Eikös kellonajoissa ole tapana käyttää kaksoispistettä? Tyyliin 17:00 (ei 17.00)?

mitäs väliä sillä on?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta