我以前沒有繪製winform的經驗,我想繪製心電圖的一種形式。或者讓一個特定區域的正弦波或任何波函數,但我正在做的是心電圖。其餘的形式將與按鈕和標籤的正常形式,在Winforms中繪製心電圖
任何人都可以很好地通過一個教程
:)
我以前沒有繪製winform的經驗,我想繪製心電圖的一種形式。或者讓一個特定區域的正弦波或任何波函數,但我正在做的是心電圖。其餘的形式將與按鈕和標籤的正常形式,在Winforms中繪製心電圖
任何人都可以很好地通過一個教程
:)
你有幾個選擇,您可以編寫自己的控制,將處理數據並對其進行渲染。對於更復雜的情節,這可能有點複雜,但基本總是相同的,設置X和Y值範圍,然後用GDI從左到右畫一條線,沒有什麼奇特。因爲這對於更高級的功能可能會有點複雜,您可以使用一些製圖控件,我會閱讀this文章或查看codeproject.com,我記得,我看到很少有人試圖寫一些像樣的製圖控件,它們是開源,新的文章可能會在WPF中編碼,但你應該找到更老的東西。
編輯:
,你可以找到一些有用的鏈接:Graph plotting lib that's main goal is to simulate ECG或another graph plotting lib
您需要創建一個自定義的控制。
public class MyECGDrawer : Control{}
在裏面,你重寫OnPaint事件
protect override OnPaint(PaintEventArgs pe){}
然後在漆功能,您繪製的圖形,你想要的方式,讓我們說的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);
}
要強制重新繪製ECG,請調用控件上的.Invalidate()函數。您應該能夠從設計器中拖放表單中的控件。
最終,類會是什麼樣子
公共類MyECGDrawer:控制{}
在裏面,你重寫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);
}
}
}
感謝很多:) – Moon 2009-08-20 04:28:15
除非你是做這個作爲學習經驗,您可能需要考慮在這裏查看免費的Microsoft Chart Controls for .NET。
話雖這麼說,我想,如果你想推出自己提出了以下原則。
上有GDI +一對夫婦的好書。如果你深入研究,我建議選擇一個。
感謝很多:) – Moon 2009-08-20 04:34:04
我寫下了以下內容並進行了測試。它似乎是做你想做的事情,但請注意,它只是簡單地將sin(x)繪製在一個循環中,沒有任何延遲 - 即sin(x)的繪圖流很快就會很快看不到它。但是,您可以在循環內的任何一行中放置一箇中斷,然後使用F5逐步循環以查看其效果 - 大概您的流式心電圖數據只能以某種固定速度到達,所以這不應該成爲您實施時的問題。
在下面,monitor是一個WinForms窗體上的PictureBox。其他一切都是本地的。
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;
}
}
一些額外的信息可能會有所幫助:
@克里斯法官:大多數美國心電圖的是25mm /秒和海外,你可以得到50毫米/ S(或在心臟重症監護病房或遙測美國地板)。所以,如果你在〜10ms(大概40-50ms)內進行睡眠,那麼假設96dpi的速率大概是正確的。 – user7116 2009-08-20 14:44:46
感謝很多:) – Moon 2009-08-20 04:31:26