[Zedgraph] Eigene Punktwerte anzeigen

public void InitGraph()
{
        // Punktwerte anzeigen
        zedGraph.IsShowPointValues = true;
        // eigenen Eventhandler einfügen
        zedGraph.PointValueEvent += new ZedGraphControl.PointValueHandler(zedGraph_PointValueEvent);
}

string _zedGraph_PointValueEvent(ZedGraphControl sender, GraphPane pane, CurveItem curve, int iPt)
{
        // Kurvenpunkt nahe des Cursors holen
        PointPair pt = curve[iPt];

        // Label (Name aus der Legende), X, Y untereinander anzeigen
        return curve.Label.Text + Environment.NewLine + "X: " + pt.X.ToString() + Environment.NewLine + "Y: " + pt.Y.ToString();
}

PictureBox benutzen (laden, speichern, scrollen)

Auf einem Formular ist eine PictureBox ‘pbProcessImage’ plaziert.

  1. Bild in die PictureBox laden
    using System.Drawing.Imaging;
    
    // OpenDialog öffnen
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        try
        {
            // Bild laden, kann vom Typ bmp, jpg, tif, gif, ico, emf, png, wmf sein
            pbProcessImage.Image = Image.FromFile(openFileDialog.FileName);
        }
        catch (Exception ex)
        {
        }
    }
    
  2. Bild der PictureBox speichern
    using System.Drawing.Imaging;
    
    // SaveDialog öffnen
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        try
        {
            // Bild z.B. als bmp speichern
            pbProcessImage.Image.Save(saveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
        }
        catch (Exception ex)
        {
        }
    }
    
  3. Bild der PictureBox löschen
    using System.Drawing.Imaging;
    
    if (pbProcessImage.Image != null)
    {
        pbProcessImage.Image.Dispose();
        pbProcessImage.Image = null;
    }
    
  4. PictureBox horizontal und vertikal scrollen
    • Panel auf ein Formular ziehen -> AutoScroll == true
    • PictureBox auf dem Panel ablegen -> Anchor == Top, Left; Dock == None; SizeMode == AutoSize

[C#] Eingebettete Resourcen aus Resources.resx auslesen

  • Resourcendatei muss im Projektbaum unter Projektname->Properties->Resources.resx vorhanden sein
  • auf Resources.resx Doppelklicken (öffnen) und oben Resource hinzufügen->Vorhandene Datei hinzufügen … wählen
  • Datei auswählen (bmp, ico, txt, wav …) und hinzufügen, die Resource wird nun ohne Dateinamenerweiterung im Designer hinterlegt
  • Zugriff auf die hinterlegte Resourcen Properties.Resources:
    using System.Drawing;
    using System.Resources;
    using System.Reflection;
    
    class CMyClass
    {
        // Button, der ein Bildchen aus der Resource verwenden soll
        private Button _btnTest = new Button();
        // Imagelist, die Images beinhaltet
        private ImageList _ilImages = new ImageList();
    
        public CMyClass()
        {
            // Bitmap anhand seines Resourcen-Namens holen
            Bitmap bmpTest = Properties.Resources.BmpTest;
    
            // Imagelist vorbereiten
            _ilImages.ColorDepth = ColorDepth.Depth32Bit;
            _ilImages.ImageSize = new Size(16, 16);
            _ilImages.TransparentColor = Color.Black; // transparente Farbe festlegen
    
            // Bild hinzufügen
            _ilImages.Images.Add(bmpTest);
    
            // Bild für Button festlegen
            _btnStartStop.ImageList = _ilImages;
            // Index des Bitmaps in der Imagelist
            _btnTest.ImageIndex = 0;
        }
    }
    
  • Zugriff auf die hinterlegte Resourcen über ResourceManager:
    using System.Drawing;
    using System.Resources;
    using System.Reflection;
    
    class CMyClass
    {
        // Button, der ein Bildchen aus der Resource verwenden soll
        private Button _btnTest = new Button();
        // Imagelist, die Images beinhaltet
        private ImageList _ilImages = new ImageList();
    
        public CMyClass()
        {
            // Bilder aus lokalen Resources.resx holen
            // wobei "Standardnamespace" meist der Projektname ist
            ResourceManager rm = new ResourceManager("Standardnamespace.Properties.Resources", Assembly.GetExecutingAssembly());
    
            // Bitmap anhand seines Namens (ohne Dateinamenerweiterung!) aus der Resource holen
            Bitmap bmpTest = rm.GetObject("BmpTest") as Bitmap;
    
            // Imagelist vorbereiten
            _ilImages.ColorDepth = ColorDepth.Depth32Bit;
            _ilImages.ImageSize = new Size(16, 16);
            _ilImages.TransparentColor = Color.Black; // transparente Farbe festlegen
    
            // Bild hinzufügen
            _ilImages.Images.Add(bmpTest);
    
            // Bild für Button festlegen
            _btnStartStop.ImageList = _ilImages;
            // Index des Bitmaps in der Imagelist
            _btnTest.ImageIndex = 0;
        }
    }
    

schneller Zugriff auf Bitmaps, Manipulation von Bitmaps

  • Achtung: Das Lock/Unlock des Bitmaps sollte normalerweise nur einmal vor/nach Operationen am Bitmap erfolgen und nicht jedesmal direkt in der Funktion selber, da dies zusätzliche Zeit benötigt.
  • eine sehr interessante Klasse für den Zugriff auf Bitmaps einschließlich diverser Funktionen gibt es hier: Link
private struct SPixelData
{
    public byte R;
    public byte G;
    public byte B;
}
// Funktion ist unsafe, da Pointer verwendet werden
public unsafe int GetGreyValue(Bitmap b, int x, int y)
{
    int iGrey = 0;

    // Bildgröße herausfinden
    Rectangle r = new Rectangle(Point.Empty, b.Size);

    int iWidth = (int)(r.Width * sizeof(SPixelData));

    // Bitmap locken
    BitmapData bdData = b.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

    // Zeiger auf das Bild holen
    byte* pBase = (byte*)bdData.Scan0.ToPointer();

    // Zeiger auf das Pixel n der Stelle x,y holen
    SPixelData* pPixel = (SPixelData*)(pBase + y * iWidth + x * sizeof(SPixelData));

    // Grauwert ausrechnen
    iGrey = (int)((pPixel->R * 0.3) + (pPixel->G * 0.59) + (pPixel->B * 0.11));

    // Bitmap wieder freigeben
    b.UnlockBits(bdData);

    return iGrey;
}

Mime-Typ eines Bildes herausfinden

using System.Windows.Media.Imaging; // ab .Net-Framework 3.0, 3.5

// im Beispiel wird anhand des Mimetyps getestet, ob die übergebene Datei ein jpeg ist
static bool CheckIfJpeg(string sFileName)
{
    BitmapDecoder bmDec = BitmapDecoder.Create(new Uri(sFileName), BitmapCreateOptions.None, BitmapCacheOption.None);

    // weitere Mime-Typen unter: http://www.webmaster-toolkit.com/mime-types.shtml    
    return bmDec.CodecInfo.MimeTypes.Contains("image/jpeg");
}

[Zedgraph] Auswahlbereich farbig markieren

public bool bMouseDown = false; // Merker für Status des Mousebuttons
public BoxObj boSelection; // Auswahlbox
public double dBoxSelectionStartX; // Startwert für x bei MouseDown

private void Form1_Load(object sender, EventArgs e)
{
    GraphPane myPane = zedGraph.GraphPane;

    // Zoom ausschalten, damit man die Auswahl verschieben kann
    zedGraph.IsEnableHZoom = false;
    zedGraph.IsEnableVZoom = false;
    
    // andere Kurvenelemente malen
    ...

    // vertikale Auswahlbox erzeugen
    boSelection = new BoxObj(100, 0, 30, 1, Color.Empty, Color.Empty);
    boSelection.Fill = new Fill(Color.White, Color.FromArgb(100, Color.LightGreen), 45.0F); // hellgrün, durchsichtig
    boSelection.ZOrder = ZOrder.E_BehindCurves; // hinter den Kurven
    boSelection.IsClippedToChartRect = true; // Box nur im Bereich des Charts malen
    boSelection.Location.CoordinateFrame = CoordType.XScaleYChartFraction; // und über den gesamten Wertebereich (y) malen
    boSelection.IsVisible = false; // noch nicht anzeigen
    myPane.GraphObjList.Add(boSelection);

    zedGraph.AxisChange();
}

private bool zgc_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
{
    bMouseDown = true;

    PointF mousePt = new PointF(e.X, e.Y);
    GraphPane pane = sender.MasterPane.FindChartRect(mousePt);

    if (pane != null)
    {
        double x, y;
        pane.ReverseTransform(mousePt, out x, out y);

        dBoxSelectionStartX = x; // Startkoordinaten merken

        boSelection.IsVisible = true; // Box anzeigen
    }
            
    DrawBox(sender, e);
    return false; 
}

private bool zgc_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
{
    bMouseDown = false;

    //boSelection.IsVisible = false; // evtl. einkommentieren, damit Box wieder verschwindet
    //this.Refresh();

    return false; 
}

private bool zgc_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
{
    if (bMouseDown) DrawBox(sender, e);
    return false;
}

private void DrawBox(ZedGraphControl sender, MouseEventArgs e)
{
    PointF mousePt = new PointF(e.X, e.Y);
    GraphPane pane = sender.MasterPane.FindChartRect(mousePt);

    if (pane != null)
    {
        double x, y;
        pane.ReverseTransform(mousePt, out x, out y);

        if (x < dBoxSelectionStartX)
        {
            // wenn Maus links des Startpunktes, dann Box nach links zum akt. x-Wert
            // der Auswahl verschieben und bis zum Startpunkt malen
            boSelection.Location.X = x;
            boSelection.Location.Width = x - dBoxSelectionStartX;
        }
        else
        {
            // sonst Box ab Startpunkt nach rechts bis zum akt. x-Wert der Auswahl malen
            boSelection.Location.X = dBoxSelectionStartX;
            boSelection.Location.Width = x - boSelection.Location.X;
        }

        this.Refresh();
    }
}

[Zedgraph] vertikale Markierungslinie bei Mausklick zeichnen

public bool bMouseDown = false; // Merker für Status des Mousebuttons
public PointPairList pplSliderList; // globale Punkteliste für die zwei Punkte der Sliderlinie

private void Form1_Load(object sender, EventArgs e)
{
    GraphPane myPane = zedGraph.GraphPane;

    // Zoom ausschalten, damit man die Linie verschieben kann
    zedGraph.IsEnableHZoom = false;
    zedGraph.IsEnableVZoom = false;
    
    // andere Kurvenelemente malen
    ...

    // und zuletzt Slider dazu
    LineItem liSlider;

    pplSliderList = new PointPairList();
    pplSliderList.Add(100.0, myPane.YAxis.Scale.Min); // unterer Punkt des Sliders, x-Wert muss ggf. angepasst werden
    pplSliderList.Add(100.0, myPane.YAxis.Scale.Max); // oberer Punkt des Sliders, x-Wert muss ggf. angepasst werden
    liSlider = myPane.AddCurve("Slider", pplSliderList, Color.Blue, SymbolType.None); // vertikale Sliderlinie malen
    liSlider.Label.IsVisible = false; // nicht in der Legende anzeigen

    zedGraph.AxisChange();
}

private bool zgc_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
{
    bMouseDown = true;
    DrawLine(sender, e);
    return false; 
}

private bool zgc_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
{
    bMouseDown = false;
    return false; 
}

private bool zgc_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
{
    if (bMouseDown) DrawLine(sender, e);
    return false;
}

private void DrawLine(ZedGraphControl sender, MouseEventArgs e)
{
    PointF mousePt = new PointF(e.X, e.Y);
    GraphPane pane = sender.MasterPane.FindChartRect(mousePt);

    if (pane != null)
    {
        double x, y;
        // Koordinaten im Graphen holen
        pane.ReverseTransform(mousePt, out x, out y);
        // Werteliste für Slider mit neuen Koordinaten erstellen
        pplSliderList.Clear();
        pplSliderList.Add(x, pane.YAxis.Scale.Min);
        pplSliderList.Add(x, pane.YAxis.Scale.Max);
        // neu malen
        this.Refresh();
    }
}