zoukankan      html  css  js  c++  java
  • WPF画心电图

      1 namespace WpfPaint
      2 {
      3     public class MinuteQuoteViewModel : INotifyPropertyChanged
      4     {
      5       
      6 
      7         private double lastPx = double.NaN;
      8         public double LastPx
      9         {
     10             get { return this.lastPx; }
     11             set { if (this.lastPx != value) { this.lastPx = value; this.OnPropertyChanged("LastPx"); } }
     12         }
     13 
     14         #region INotifyPropertyChanged 成员
     15 
     16         public event PropertyChangedEventHandler PropertyChanged;
     17         protected virtual void OnPropertyChanged(string propertyName)
     18         {
     19             if (this.PropertyChanged != null)
     20                 this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
     21         }
     22 
     23         #endregion
     24     }
     25 }
     26 
     27 
     28 
     29 
     30     public class WriteableBitmapTrendLine : FrameworkElement
     31     {
     32         #region DependencyProperties
     33 
     34         public static readonly DependencyProperty LatestQuoteProperty =
     35             DependencyProperty.Register("LatestQuote", typeof(MinuteQuoteViewModel), typeof(WriteableBitmapTrendLine),
     36             new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None, OnLatestQuotePropertyChanged));
     37 
     38         private static void OnLatestQuotePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     39         {
     40             WriteableBitmapTrendLine trendLine = (WriteableBitmapTrendLine)d;
     41             MinuteQuoteViewModel latestQuote = (MinuteQuoteViewModel)e.NewValue;
     42             if (latestQuote != null)
     43             {
     44                 trendLine.DrawTrendLine((float)latestQuote.LastPx);
     45             }
     46         }
     47 
     48         public MinuteQuoteViewModel LatestQuote
     49         {
     50             get { return (MinuteQuoteViewModel)GetValue(LatestQuoteProperty); }
     51             set { SetValue(LatestQuoteProperty, value); }
     52         }
     53 
     54         #endregion
     55 
     56         private int width = 0;
     57         private int height = 0;
     58 
     59         private WriteableBitmap bitmap;
     60 
     61         /// <summary>
     62         /// 两点之间的距离
     63         /// </summary>
     64         private int dx = 5;
     65 
     66         /// <summary>
     67         /// 当前区域所容纳的值
     68         /// </summary>
     69         private float[] prices;
     70 
     71         /// <summary>
     72         /// 在prices中的索引
     73         /// </summary>
     74         private int ordinal = 0;
     75 
     76         private GDI.Pen pen = new GDI.Pen(GDI.Color.Black);
     77 
     78         private void DrawTrendLine(float latestPrice)
     79         {
     80             if (double.IsNaN(latestPrice))
     81                 return;
     82 
     83             ordinal++;
     84 
     85             if (ordinal > this.prices.Length - 1)
     86             {
     87                 ordinal = 0;
     88             }
     89             this.prices[ordinal] = latestPrice;
     90 
     91             this.bitmap.Lock();
     92 
     93             using (GDI.Bitmap backBufferBitmap = new GDI.Bitmap(width, height,
     94                 this.bitmap.BackBufferStride, GDI.Imaging.PixelFormat.Format24bppRgb,
     95                 this.bitmap.BackBuffer))
     96             {
     97                 using (GDI.Graphics backBufferGraphics = GDI.Graphics.FromImage(backBufferBitmap))
     98                 {
     99                     backBufferGraphics.SmoothingMode = GDI.Drawing2D.SmoothingMode.HighSpeed;
    100                     backBufferGraphics.CompositingQuality = GDI.Drawing2D.CompositingQuality.HighSpeed;
    101 
    102 
    103                     if (ordinal == 0)
    104                     {
    105                         backBufferGraphics.Clear(GDI.Color.White);
    106                     }
    107 
    108                     for (int i = 0; i <= ordinal; i++)
    109                     {
    110                         if (ordinal > 0)
    111                         {
    112                             backBufferGraphics.DrawLine(pen,
    113                                 new GDI.PointF((ordinal - 1) * dx, this.prices[ordinal - 1]),
    114                                  new GDI.PointF(ordinal * dx, this.prices[ordinal]));
    115                         }
    116                     }
    117                     backBufferGraphics.Flush();
    118                 }
    119             }
    120             this.bitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
    121             this.bitmap.Unlock();
    122         }
    123 
    124         protected override void OnRender(DrawingContext dc)
    125         {
    126             if (bitmap == null)
    127             {
    128                 this.width = (int)RenderSize.Width;
    129                 this.height = (int)RenderSize.Height;
    130                 this.bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgr24, null);
    131 
    132                 this.bitmap.Lock();
    133                 using (GDI.Bitmap backBufferBitmap = new GDI.Bitmap(width, height,
    134                this.bitmap.BackBufferStride, GDI.Imaging.PixelFormat.Format24bppRgb,
    135                this.bitmap.BackBuffer))
    136                 {
    137                     using (GDI.Graphics backBufferGraphics = GDI.Graphics.FromImage(backBufferBitmap))
    138                     {
    139                         backBufferGraphics.SmoothingMode = GDI.Drawing2D.SmoothingMode.HighSpeed;
    140                         backBufferGraphics.CompositingQuality = GDI.Drawing2D.CompositingQuality.HighSpeed;
    141 
    142                         backBufferGraphics.Clear(GDI.Color.White);
    143 
    144                         backBufferGraphics.Flush();
    145                     }
    146                 }
    147                 this.bitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
    148                 this.bitmap.Unlock();
    149 
    150                 this.prices = new float[(int)(this.width / this.dx)];
    151             }
    152             dc.DrawImage(bitmap, new Rect(0, 0, RenderSize.Width, RenderSize.Height));
    153             base.OnRender(dc);
    154         }
    155     }

    https://social.msdn.microsoft.com/Forums/zh-CN/3baebf07-5a0e-4e3a-a588-b79d869d6d47/inkcanvasstrokesclear?forum=wpfzhchs#7ce0efd9-7254-4d98-9d86-427d820cd827

    https://social.msdn.microsoft.com/Forums/zh-CN/febcee07-dc8b-44b4-8c0a-246daffdbe2b/wpf-?forum=wpfzhchs#bfadef47-ab7b-4f8b-9340-e3c7a2782b76

    https://social.msdn.microsoft.com/Forums/zh-CN/b156e12b-bc52-44a9-b2f9-26fff723cff5/wpf-inkcanvas?forum=wpfzhchs#de6c4b50-7036-4823-bbec-4e9ba309a600

  • 相关阅读:
    反向代理实例
    nginx常用命令和配置
    nginx的安装
    Can Live View boot up images acquired from 64bit OS evidence?
    What is the behavior of lnk files?
    EnCase v7 search hits in compound files?
    How to search compound files
    iOS 8.3 JB ready
    Sunglasses
    现代福尔摩斯
  • 原文地址:https://www.cnblogs.com/hwy425/p/5469227.html
Copyright © 2011-2022 走看看