Question

i n'a pas d'expérience en traçant dans WinForms, sous une forme que je veux tracer ecg. ou laisse dire une onde de péché ou de toute fonction d'onde dans une zone spécifique, mais ce que je fais est e.c.g .. reste du formulaire sera forme normale avec des boutons et des étiquettes,

peut-on être assez gentil pour THROUGH dans un tutoriel

:)

Était-ce utile?

La solution

Vous avez peu de choix, vous pouvez écrire votre propre contrôle, qui traitera les données et la rendre. Pour des parcelles plus complexes, qui peut être un peu compliqué, mais les bases sont toujours les mêmes, la mise en valeurs X et Y plages et puis juste tracer une ligne à l'aide GDI va de gauche à droite, rien d'extraordinaire.
Comme cela peut être un peu compliqué pour les fonctionnalités plus avancées, vous pouvez utiliser des contrôles de représentation graphique, je lis graphique illustrant lib qui est le principal objectif est de simuler ECG ou un autre graphique tracé lib

Autres conseils

Vous devez créer un contrôle personnalisé.

public class MyECGDrawer : Control{}

Dans ce document, vous substituez l'événement OnPaint

protect override OnPaint(PaintEventArgs pe ){}

Ensuite, dans la fonction de la peinture, vous dessinez vos graphiques comme vous le voulez, disons que sin (x)

// refresh background
pe.Graphics.FillRectangle( Brushes.White, 0, 0, Width, Height );
int prevX = -1, prevY = -1;
for(int x = 0; x < Width; x++ )
{
    if( prevX >= 0 )
    {
        pe.Graphics.DrawLine( Pens.Black, prevX, prevY, x, Math.sin(x) );
    }
    prevX = x;
    prevY = Math.sin(x);
}

Pour forcer l'ECG à redessiner, vous appelez la fonction .Invalidate () sur le contrôle. Vous devriez être en mesure de faire glisser le contrôle de votre forme du concepteur.

En fin de compte, la classe ressemblerait

public class MyECGDrawer: contrôle {}

Dans ce document, vous substituez l'événement OnPaint

public class MyECGDrawer : Control
{
protect override OnPaint(PaintEventArgs pe )
{
   // refresh background
    pe.Graphics.FillRectangle( Brushes.White, 0, 0, Width, Height );
    int prevX = -1, prevY = -1;
    for(int x = 0; x < Width; x++ )
    {
        if( prevX >= 0 )
            pe.Graphics.DrawLine( Pens.Black, prevX, prevY, x, Math.sin(x) );
        prevX = x;
        prevY = Math.sin(x);
    }
}
}

J'ai écrit ce qui suit et testé. Il semble faire ce que vous voulez, mais notez qu'il complote simplement sin (x) dans une boucle sans délai - à savoir la parcelle pour sin (x) les cours d'eau du bord gauche si vite que vous pouvez à peine voir. Vous pouvez toutefois mettre une pause sur une ligne dans la boucle, puis parcourir la boucle avec F5 pour voir fonctionner lentement - probablement vos données ECG de streaming n'arriver à une vitesse fixe donc cela ne devrait pas être un problème dans votre mise en œuvre .

Dans ce qui suit, est un moniteur PictureBox sur un formulaire WinForms. Tout le reste est local.

private void drawStream(){
  const int scaleX = 40;
  const int scaleY = 40;
  Point monitorTopLeft = new Point(0, 0);
  Point MonitorTopLeftMinus1 = new Point(-1, 0);

  int halfX = monitor.Width / 2;
  int halfY = monitor.Height / 2;
  Size size = new Size(halfX + 20, monitor.Height);

  Graphics g = monitor.CreateGraphics();
  g.TranslateTransform(halfX, halfY);
  g.ScaleTransform(scaleX, scaleY);
  g.Clear(Color.Black);
  g.ResetClip();

  float lastY = (float)Math.Sin(0);
  float y = lastY;
  Pen p = new Pen(Color.White, 0.01F);
  float stepX = 1F / scaleX;

  for (float x = 0; x < 10; x += stepX) {
    g.CopyFromScreen(monitor.PointToScreen(monitorTopLeft), MonitorTopLeftMinus1, size, CopyPixelOperation.SourceCopy);
    y = (float)Math.Sin(x);
    g.DrawLine(p, -stepX, lastY, 0, y);
    lastY = y;
  }
}

Quelques informations supplémentaires qui peuvent être utiles:

  1. L'origine dans une zone d'image commence sur le coin supérieur gauche. TranslateTransform vous permet de traduire (c.-à-déplacer) l'origine. Dans l'exemple, je traduis par demi-largeur de la zone d'image et la moitié de sa hauteur.
  2. ScaleTransform modifie le grossissement de la picturebox - notez qu'il magnifie même la largeur du stylo utilisé pour dessiner sur le picturebox - c'est pourquoi la largeur du stylo est fixé à 0,01
  3. .
  4. CopyFromScreen effectue un BitBlt. Son point de source est par rapport à l'écran, la destination est par rapport à la picturebox et la taille du rectangle pour se déplacer ne tient pas compte des transformations (comme l'ampleur et la traduction se transforme, nous avons ajouté).
  5. Notez que les coordonnées X dans le procédé de DrawLine sont -stepx et 0. Tout dessin se produit essentiellement droite sur l'axe des y (ie x = 0), puis CopyFromScreen déplace la partie étirée à la gauche de sorte qu'il « flux » off à gauche.

Sauf si vous faites cela comme une expérience d'apprentissage, vous voudrez peut-être envisager de regarder le graphique gratuit Microsoft .NET pour les contrôles disponibles ici.

http: / /www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=en#QuickInfoContainer

Cela étant dit, je voudrais proposer les directives suivantes si vous voulez rouler votre propre.

  1. Créer un contrôle utilisateur pour encapsuler le tracé rendu plutôt que de rendre directement sur le formulaire.
  2. Dans votre contrôle, exposer les propriétés pour obtenir / définir les données que vous souhaitez rendre et ajouter d'autres propriétés que vous souhaitez contrôler le rendu (mise à l'échelle, panoramique, couleurs, etc.)
  3. En vous contrôlez, soit remplacer la méthode OnPaint ou créer un gestionnaire d'événements pour l'événement Paint. Ces méthodes ont un objet PaintEventArgs passé à eux, qui contient un objet graphique comme une propriété. Les méthodes de l'objet graphique sont utilisés pour rendre des points, des lignes, etc sur le contrôle quand il a besoin d'être peint. La plupart des opérations de dessin nécessitent soit un stylo (contours / lignes) ou une brosse (zones remplies). Vous pouvez utiliser des objets de stock pour ces opérations (par exemple Pens.Black ou Brushes.Red) ou vous pouvez créer votre propre (voir la documentation). Si vous créer vos propres objets, assurez-vous de les jeter après utilisation (par exemple en utilisant la mention « à l'aide » ou en appelant Dispose).

Il y a quelques bons livres sur GDI +. Je suggère en prendre un si vous allez en profondeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top