Rubrik: Grafik und Font · Bilder und Icons | VB-Versionen: VB2010 - VB2015 | 09.10.17 |
Erstellen einer ImageList aus einer Basis-Bitmap mit Nummerierung Eine Funktion, mit der eine ImageList erstellt werden kann, bei der eine Anzahl Grafiken aus einer Basis-Bitmap gebildet werden, auf der wiederum eine Nummerierung geschrieben wird. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 5.380 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wer meinen Tipp Erstellen einer ImageList aus Bitmaps mit gleicher Größe und nur einer Farbe kennt, der kennt das Prinzip eventuell schon.
Die genannte ImageList dient dem Zweck, eine gewisse Anzahl von Grafiken zu erstellen, die alle denselben Hintergrund haben und auf denen eine Nummer geschrieben steht.
Die Funktion ist so aufgebaut, dass mittels Parameter die Basis-Bitmap vorgegeben wird und durch Angabe von Nummerierungsparametern eine sichtbare "Durchnummerierung" vorgenommen wird. Am Ende steht ein Satz von Grafiken in der List zur Verfügung, mit den gewünschten Nummern versehen.
Die Parameter im Einzelnen:
- theBasicBitmap: Es wird eine Basis-Grafik vorgegeben, die den Hintergrund für alle Grafiken bilden soll. (bspw. ein farbiges Quadrat, eine Ball-Grafik o.ä.) Die Größe ist unwesentlich, alle Grafiken der List erhalten die Größe der Basis-Grafik.
- theNrFont: Angabe des Fonts mit dem die Nummern auf die Grafiken geschrieben werden sollen
- theNrColor: Angabe der Farbe für die Nummern
- art: Die Art der Nummerierung. Es gibt prinzipiell 2 Arten der Nummerierung
- Eine fortlaufende Nummerierung, die durch die Parameter begNr und endNr begrenzt ist (also evtl. 1 bis 5 oder 10 bis 21). In diesem Fall darf kein valArr angegeben werden.
- Eine willkürliche Nummerierung mittels eines Wertefelds. Wird als Parameter ein Wertefeld angegeben, werden eben die Werte für die Nummerierung der Grafiken verwendet (also etwa ein Feld aus Short-Werten
{11, 34, 25, 77}). In diesem Falle gibt es noch eine Besonderheit zu beachten. Ist ein Wertefeld angegeben und sind die Parameter begNr und endNr beide 0, dann werden alle Werte des Feldes für die Nummerierung verwendet.
Man kann im anderen Fall Werte für begNr und endNr angeben, nämlich als Anfangs- und End-Index, zwischen denen die Werte aus dem Wertefeld verwendet werden (also bspw. {11, 34, 25, 77} als Wertefeld und begNr=1 und endNr=2,
dann werden nur die Werte 34 und 25 zum Beschriften der Grafiken genommen).
- Eine fortlaufende Nummerierung, die durch die Parameter begNr und endNr begrenzt ist (also evtl. 1 bis 5 oder 10 bis 21). In diesem Fall darf kein valArr angegeben werden.
- begNr: Bei art = 1 (also einfaches Durchnummerieren) wird hier die Zahl angegeben, mit der die Nummerierung beginnen soll. Bei art = 2 wird der Index angegeben, bei dem die Entnahme der Nummern aus dem Wertefeld beginnt.
- endNr: Bei art = 1 wird hier die letzte Zahl angegeben, bei der die Nummerierung enden soll. Bei art = 2 wird der Index angegeben, bei dem die Entnahme der Nummern aus dem Wertefeld endet.
- valArra: Ein Feld, das eine gewisse Menge von Zahlen enthalten kann, die für das Nummerieren der Grafiken verwendet werden sollen (sortiert oder unsortiert). Nummerierungsart 2.
Alle Nummern werden horizontal und vertikal zentriert auf die Basis-Grafik geschrieben. Auf entsprechende Größenverhältnisse muss man selbst achten, die Funktion macht da keine Plausibilitätskontrolle.
Hier nun die Funktion:
''' <summary> ''' Erstellen einer ImageList aus einer Basis-Bitmap mit Nummerierung ''' </summary> ''' <param name="theBasicBMP">die Basis-Grafik</param> ''' <param name="theNrFont">die Schriftart der Nummern</param> ''' <param name="theNrcolor">die Farbe der Nummern</param> ''' <param name="art">die Nummerierungsart (1.. fortlaufend, 2.. Wertefeld)</param> ''' <param name="begNr">die Beginn-Nummer</param> ''' <param name="endNr">die End-Nummer</param> ''' <param name="valArr">das numerische Wertefeld</param> ''' <returns>eine Imagelist</returns> Public Function CreateNumberedImageList(theBasicBMP As Bitmap, _ theNrFont As Font, theNrcolor As Color, _ Optional art As Short = 1, _ Optional begNr As Short = 0, Optional endNr As Short = 0, _ Optional valArr() As Short = Nothing) As ImageList Dim il As New ImageList, pb As PictureBox, tRect As Rectangle Dim i, j As Short Dim wIdx As Boolean = (begNr = 0 And endNr = 0) ' sind beide Indizes 0? ' Ausrichtung des Texts auf der Basis-Grafik Dim sf As New StringFormat, gr As Graphics, im As Image sf.LineAlignment = StringAlignment.Center sf.Alignment = StringAlignment.Center ' Definition Picturebox und füllen mit der Basis-Grafik pb = New PictureBox pb.Image = theBasicBMP j = 1 ' erzeugen der ImageList With il .ImageSize = New Size(theBasicBMP.Size) ' definieren Image-Größe .ColorDepth = ColorDepth.Depth32Bit ' definieren Farbtiefe tRect = New Rectangle(New Point(0, 0), .ImageSize) ' Rechteck des Texts festlegen Select Case art Case 1 ' fortlaufende Nummerierung For i = begNr To endNr im = CType(pb.Image.Clone(), Image) gr = Graphics.FromImage(im) gr.TextRenderingHint = TextRenderingHint.ClearTypeGridFit ' zeichnen der Nummer gr.DrawString(i, theNrFont, New SolidBrush(theNrcolor), tRect, sf) .Images.Add(i, im) Next Case 2 ' Wertefeld If Not IsNothing(valArr) Then If wIdx Then For i = 0 To valArr.Length - 1 im = CType(pb.Image.Clone(), Image) gr = Graphics.FromImage(im) gr.TextRenderingHint = TextRenderingHint.ClearTypeGridFit ' zeichnen der Nummer gr.DrawString(valArr(i), theNrFont, New SolidBrush(theNrcolor), tRect, sf) .Images.Add(j, im) j += 1 Next Else For i = begNr To endNr im = CType(pb.Image.Clone(), Image) gr = Graphics.FromImage(im) gr.TextRenderingHint = TextRenderingHint.ClearTypeGridFit ' zeichnen der Nummer gr.DrawString(valArr(i), theNrFont, New SolidBrush(theNrcolor), tRect, sf) .Images.Add(j, im) j += 1 Next End If Else Return Nothing End If End Select pb.Dispose() End With Return il End Function
Hier ein Beispiel:
Viel Spaß damit!