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 ClassFORM 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 SubLaita 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.