2012-03-16 71 views
3

我想弄清楚如何編寫代碼,以便鼠標移動和線條繪製之間的響應時間即時。每次我這樣做,總是有2之間的差距。我已經在Windows窗體中編寫了這個代碼,現在我正在使用WPF編寫代碼。即時響應鼠標移動的畫線?

問題最初在於代碼,並不是我的電腦。

Basicaly它的工作原理是這樣的。 點擊任意位置並創建point1。 移動鼠標並更新point2,並且從Point1到Point2繪製一條線,該線在鼠標移動時發生變化。

下面

是我的極端簡單的代碼來做到這一點.. 這似乎是瞬間,但如果你將窗口最大化,使線長和快速移動鼠標,就可以更輕鬆地發現它..

而且,未來會有一個圖像層,肯定會導致它滯後更多..但現在我只想優化它。

當我從5年前使用其他類似的程序時,線條運動實際上是即時的。這就是爲什麼我很困惑,爲什麼用這個新編碼,其laggy ..

Point mLoc; 
    Line myLine = new Line(); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     SnapsToDevicePixels = false; 

     myLine.Stroke = System.Windows.Media.Brushes.White; 
     myLine.StrokeThickness = 1; 

     canvas1.Children.Add(myLine); 
    } 

    private void onMMove(object sender, MouseEventArgs e) 
    { 
     mLoc = Mouse.GetPosition(canvas1); 

     myLine.X2 = mLoc.X; 
     myLine.Y2 = mLoc.Y; 


    } 

    private void onMLClick(object sender, MouseButtonEventArgs e) 
    { 
     mLoc = Mouse.GetPosition(canvas1); 

     myLine.X1 = mLoc.X; 
     myLine.Y1 = mLoc.Y; 

    } 
+0

向Canvas添加線控是瘋狂。嘗試使用圖形上下文來繪製到屏幕上。 – Asti 2012-03-16 14:36:17

+1

剛剛在我的機器上試過您的確切代碼,根本無法觀察到任何延遲。 – 2012-03-16 14:38:59

+0

humm,感謝您的評論..我會嘗試使用圖形上下文..滯後是非常小,但definitly那裏..最大化程序,並使線更長,並更快地移動鼠標 – 2012-03-16 14:40:17

回答

2

WinAPI的不發送WM_MOUSEMOVE不夠快,檢測鼠標的每一個動作。有一篇非常好的文章,展示瞭如何非常精確地檢測鼠標移動(http://blogs.msdn.com/b/oldnewthing/archive/2012/03/14/10282406.aspx

+0

謝謝,你會說你只能用C++來做到這一點?這篇文章解釋與c + + ..這是好的,如果它的真實,我只想知道肯定,所以我可以繼續學習c + +或c#WPF .. – 2012-03-16 15:42:42

+0

不,我認爲你可以用c#和wpf做到這一點,但它會相當困難,因爲你必須使用WinApi(閱讀關於p/invoke http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx)並使用一些技巧來鉤住窗口messaged循環(這篇文章可以幫助 - http://stackoverflow.com/questions/624367/how-to-handle-wndproc-messages-in-wpf) – Nikolay 2012-03-16 17:52:20