C# Usercontrol

Heute mal was ganz anderes. Wenn man ein Programm schreibt findet man nicht immer das Steuerelement was man braucht.
Letztens benötigte Ich eine „Oszilloskop Ansicht“ um eine Vorschau für eine berechnete Wellenform darzustellen.
Nun in Visual Studio gibt es zwar vieles aber eben dies nicht. Viele werden jetzt sagen „nimm einfach eine Picturebox und zeichne da rein“.
Nun das habe ich auch getan um den Algorithmus zu testen aber Ich wollte was schöneres. Also schnell ein neues Projekt aufgesetzt.

Entwicklungsumgebung einrichten

  • Leere Projektmappe anlegen (hier Usercontrol)
  • Neues Projekt hinzufügen „Windows Forms-Anwendung“ (TestAPP)
  • Neues Projekt hinzufügen „Windows Forms-Steuerelementbibliothek“ (Oszilloskop)
  • Die Eigenschaft (Name) von Usercontrol1 in Oszilloskop abändern
  • Projektmappe erstellen [F6] damit das neue Steuerelement in der TestAPP zu Verfügung steht
  • Das neue Steuerelement in der TestAPP Anwendung verwenden

Jetzt kann man mit der eigentlichen Entwicklung loslegen.

Steuerelement

Zunächst muss man sich den Quellcode der Datei UserControl1.cs anzeigen lassen.
Die erreicht man in dem man die Datei UserControl1.cs im Projektmappen-Explorer markiert und [F7] drückt.
Alternativ kann man auch das Kontextmenü verwenden und den Punkt „Code anzeigen“ auswählen.

Direkt unter dem Konstruktor fügt man jetzt folgende Codezeilen ein.

Code
private PointF[] _data = null; // Globale variable die die Kurvenform enthält
// Extern zugängliche Funktion zur übergabe der zu zeichnenden Kurvenform
public void Drawcurve(PointF[] data)
{
// Zwei Punkte werden benötigt zum zeichnen
if (data.Length < 2)
return;  _data = data;
this.Invalidate(); // Graph neu zeichnen
}

// Funktion zum skalieren von werten
private float scale(float x, float x1, float x2, float y1, float y2)
{
if (x1 == x2)
return 0.0f; // We don't devide by 0

float retval = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1;
return retval;
}

Diese Codezeilen zeichnen jedoch noch keine Kurve oder andere Elemente im Steuerelement. Dazu müssen wir die Funktion OnPaint des Steuerelements überschreiben.

Code
protected override void OnPaint(PaintEventArgs e)
{
Pen pGrid = new
Pen(Color.DarkGray);

float x1 = 0.0f,
x2 = this.Width - 1.0f, // Breite des Steuerelements
y1 = 0.0f,
y2 = this.Height - 1.0f; // Höhe des Steuerelements

float vdiv = 10.0f, hdiv = 10.0f; // Anzahl an Horizontlen/Vertikalen linien

// Vertikale linien
for (float y = x1; y < x2; y+=((x2 - x1 - 0.001f) / vdiv))
{
e.Graphics.DrawLine(pGrid, y, y1, y, y2);
}

// Horizontale linien
for (float x = y1; x <= y2; x+=((y2 - y1 - 0.001f) / hdiv))
{
e.Graphics.DrawLine(pGrid, x1, x, x2, x);
}

if (_data != null && _data.Length >= 2)
{
// Enthaltene Daten zeichnen
for (int i = 0; i < _data.Length; i++)
{
// Zu zeichnende Daten auf die Zeichenfläche skalieren
// Hier mit fester Skala

_data[i].X = scale(_data[i].X, 0.0f, 0.02f, 0, this.Width);
_data[i].Y = scale(_data[i].Y, -325.0f, 325.0f, this.Height, 0);
}

e.Graphics.DrawCurve(Pens.DarkCyan, _data);
}

base.OnPaint(e);
}

Testdaten berechnen

Zum berechnen des Augenblickswertes einer Sinusförmigen Spannung benötigt man folgende Formel.

Da jedoch ein einzelner Wert relativ sinnfrei ist für eine Darstellung einer ganzen Welle muss man sich die Werte für t=0 bis t=T berechnen und in einem Array abspeichern.

Code
PointF[] Ut = new
PointF[4096]; // Augenblickswertarray
float u = 325.0f; // Spitzenwert
float f = 50.0f; // Frequenz der Spannung
float T = 1.0f / f; // Periodendauer
float phi = 0.0f; // Phasenwinkel
float omega = Convert.ToSingle(2.0f * Math.PI * f);
float stepsize = T / Ut.Length;
int idx = 0; // Arrayindex

// Testdaten berechnen
for (float t = 0; t < T; t+=stepsize)
{
idx = Convert.ToInt32(t / stepsize);
if (idx < Ut.Length)
{
Ut[idx].X = t;
Ut[idx].Y = Convert.ToSingle(u * Math.Sin(omega * t + phi));
}
}

Steuerelement testen

Wenn man mit der obigen Funktion seine Testkurve berechnet hat muss man diese nur noch an das neue Steuerelement übergeben und Sie darstellen lassen. Die folgende Codezeile muss man nur noch unter die obige For-Schleife schreiben und seine Anwendung starten.

Code
oszilloskop1.Drawcurve(Ut);