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
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.
Jip, kunhan lisäilen tuon sääohjelmaan niin teen vielä kontrollille ominaisuuksia esim. ristikon päälle laitosta ja palkkien värien vaihdosta.
Vielä lämpömittarin teko-ohjeet: http://elektroniikka.org/thermometer/
Eikös kellonajoissa ole tapana käyttää kaksoispistettä? Tyyliin 17:00 (ei 17.00)?
vain digitaalisessa, mutta minusta tuo on hienompi
lainaus:
Eikös kellonajoissa ole tapana käyttää kaksoispistettä? Tyyliin 17:00 (ei 17.00)?
mitäs väliä sillä on?
Aihe on jo aika vanha, joten et voi enää vastata siihen.