2012-01-15 18 views
5

WPF için bir deneme uygulaması olarak çizim uygulaması geliştiriyorum ve iyi gidiyordum. İçinde bulunduğum sorun şu ki, farenin altındaki pikselleri her hareket ettiğinde bir bitmap'e çizersem, güncelleme başına sadece bir piksel alırım. Fare hızlı hareket ettiğinde, aradaki pikselleri çizmez. Ben en iyi yolu piksellere arasında bir çizgi çizmek için bilmek gerekir WPF WriteableBitmapFare ile çizim yapmak, pikseller arasındaki boşluklara neden oluyor

EDIT kullanıyor: Şimdi bu var: Eğer bir çizgi çizmek istiyorsanız

LinesNotConnected

+0

Olası kopya: http://stackoverflow.com/questions/3000591/drawing-line-using-wpf-writeablebitmap-backbuffer –

cevap

3

, yapmaman Her seferinde bir pikselin renklerini değiştirmeyin, bunun yerine her bir olay işleme yönteminde farenin konumunu kaydedin. Daha sonra, satırını numaralı bir satıra bir önceki konum (önceki olay oluşumundan kaydedilen) arasında çizmeniz ve bu iki nokta arasında bir Line çizmeniz gerekir. Bu çizginin sürekli olmasını sağlayacaktır. WriteableBitmap adresindeki çizgi çizimleri ile ilgili bilgiler şu adreste bulunabilir: Drawing line using WPF WriteableBitmap.BackBuffer. Çizgiyi çizdikten sonra, geçerli olana kaydedilen önceki konumu güncellemeyi unutmayın :).

GÜNCELLEME

Ben de başka bir çözüm buldum. olaylar ele arkasında olan kod ekleyin, ardından

<Window x:Class="SampleWPFApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="500" Width="520" Loaded="Window_Loaded" PreviewMouseDown="Window_PreviewMouseDown"> 
<Grid x:Name="layoutRoot" Background="Transparent"> 
    <Image x:Name="image" /> 
</Grid> 

Ve:

//set width and height of your choice 
RenderTargetBitmap bmp = null; 
//... 
private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //initialize RenderTargetBitmap object 
     bmp = new RenderTargetBitmap((int)this.ActualWidth, (int)this.ActualHeight, 90, 90, PixelFormats.Default); 

     //set initialized bmp as image's source 
     image.Source = bmp; 
    } 

    /// <summary> 
    /// Helper method drawing a line. 
    /// </summary> 
    /// <param name="p1">Start point of the line to draw.</param> 
    /// <param name="p2">End point of the line to draw.</param> 
    /// <param name="pen">Pen to use to draw the line.</param> 
    /// <param name="thickness">Thickness of the line to draw.</param> 
    private void DrawLine(Point p1, Point p2, Pen pen, double thickness) 
    { 
     DrawingVisual drawingVisual = new DrawingVisual(); 

     using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
     { 
      //set properties of the Pen object to make the line more smooth 
      pen.Thickness = thickness; 
      pen.StartLineCap = PenLineCap.Round; 
      pen.EndLineCap = PenLineCap.Round; 

      //write your drawing code here 
      drawingContext.DrawLine(pen, p1, p2); 
     } 
    } 
+0

Bitmap sınıfı hangi ad alanında? Gdi + 'dan ders almak zorunda mıyım? – annonymously

+0

Hayır, cevabın güncellenmiş sürümünü okuyun. –

+0

Tamam, şimdi daha iyi çalışıyor ancak çizgiler bağlı değil. Güncel güncellememi görün – annonymously

2

Ben zaten vardı fark

üzerinde çizmek istiyorum Image ile XAML tanımlayın Sorunuz cevaplandı, ancak bu soruna sahip olan başkalarının iyiliği için göndermek istedim. Ben o insanlardan biriyim.

Çizimlerimin orijinal sorudaki tam olarak UPDATE bölümü gibi göründüğü bir durum vardı. Bunu düzeltmemin yolu, sadece başlangıç ​​ve bitiş noktalarını değil, aynı zamanda bir orta noktayı izleyerek üst üste binen çizgiler çizmekti. Çizerken, üç noktayı kullanarak çiziyorum ve daha sonra başlangıç ​​noktasını -> orta nokta, orta nokta -> bitiş noktası, bitiş noktası -> çizim yaptığınız her şeye göre yeni konumu güncelliyorum. Bu benim çizgilerin çok daha iyi görünmesini sağladı.

Umarım bu, benim gibi aynı sorunu yaşayan birisine yardımcı olur.

İlgili konular