none
WPF基礎繪圖

    問題

  • 你好

    小弟這幾天開始接觸WPF,目前的狀態是..
    我看了MSDN幾篇簡易的HOW TO主題
    主要是看繪圖方面的,可是敝人在下小弟我
    資質拙劣,看了半天仍然一知半解。

    目前的主要問題是點陣的概念跟向量的概念無法轉換過來,
    以下是我看著MSDN的示範寫的測試:
    public void Draw()
    {
                Image IMA = new Image();
                DrawingVisual DV = new DrawingVisual();
    
                DrawingContext DC = DV.RenderOpen();
                DC.DrawRectangle(Brushes.White, null, new Rect(new Point(0, 0), new Size(200, 30)));
                DC.Close();
                RenderTargetBitmap rtb = new RenderTargetBitmap(200, 30, 200, 30, PixelFormats.Default);
                rtb.Render(DV);
    
                IMA.Source = rtb;
                this.Content = IMA;
               IMA.Margin = new Thickness(50, 50, 50, 50);
               IMA.Height = 30.0;
               IMA.Width = 200.0; }
    畫出來的形狀,會有暈開的狀況,
    我故意讓容器跟Bitmap本身一樣大,
    就是希望圖片不會被拉開來...但是,
    他還是被拉開來了...。

    坦白說我真的搞不太懂DrawRectangle方法中,
    所謂的範圍,我到底該怎麼在腦中想像出我畫了什麼,
    它的Point跟Size到底是絕對,還是一個比例,
    還有RenderTargetBitmap建構函式中,
    寬度、高度跟DPI的關係又是怎麼樣,
    我在寫上面那段code的時候,是用Bitmap的想法去寫的,
    看到結果很明顯我的想法一定是錯的,麻煩各位高手指點迷津。
    2010年1月18日 下午 02:48

解答

  • hi

    RenderTargetBitmap((int)this.ActualWidth,  (int)this.ActualHeight, 120,  96,  PixelFormats.Default);
    改成
    RenderTargetBitmap((int)this.ActualWidth,  (int)this.ActualHeight, 96,  96,  PixelFormats.Default);

    如果是要在一個視窗畫出一個中線可參考以下:
            private void Draw()
            {
                GeometryDrawing aGeometryDrawing = new GeometryDrawing();
                aGeometryDrawing.Geometry = new LineGeometry(new Point(this.ActualWidth / 2, 0), new Point(this.ActualWidth / 2, this.Height));
                aGeometryDrawing.Brush = this.Background;
    
                aGeometryDrawing.Pen = new Pen(Brushes.Black, 1);
    
                DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);
                geometryImage.Freeze();
    
                Image MainImage = new Image();
                MainImage.Source = geometryImage;
                MainImage.HorizontalAlignment = HorizontalAlignment.Center;
                MainImage.VerticalAlignment = VerticalAlignment.Center;
    
                this.Content = MainImage;
            }
    
    以上程式是參考 MSDN
    DrawingImage 類別
    • 已標示為解答 Optimist9266 2010年1月20日 上午 08:55
    2010年1月19日 下午 05:15

所有回覆

  • hi
      我猜你的錯誤是在 RenderTargetBitmap rtb = new RenderTargetBitmap(200, 30, 200, 30, PixelFormats.Default); 這行
    RenderTargetBitmap 建構式中 第三及第四個參數 分別代表水平及垂直的DPI值
    一般情況下這兩個值應該是96或120

    2010年1月18日 下午 04:12
  • 經過狼鷹所說的地方經過修改之後確實是沒有圖片暈開的狀況了,但是我仍然不懂該如何定義要繪製的點的位置。

    public void Draw()
    {
                MainBMP = new
                RenderTargetBitmap
                (
                (int)this.ActualWidth,
                (int)this.ActualHeight,
                120, 
                96,
                PixelFormats.Default
                );
                DrawingVisual DV = new DrawingVisual();            
                DrawingContext DC = DV.RenderOpen();            
                DC.DrawRectangle(this.Background, null, new Rect(0, 0, this.ActualWidth, this.ActualHeight));
                DC.DrawLine(new Pen(Brushes.Black, 1), new Point(this.ActualWidth / 2, 0), new Point(this.ActualWidth / 2, this.Height));
                DC.Close();
                MainBMP.Render(DV);
                MainImage.Source = MainBMP;              
    }
    這段程式碼主要目的,是在一個與視窗同等大小的Image控制項畫出一個中線,但是程式碼在Run出來之後中線卻偏了,是為什麼呢?
    2010年1月19日 上午 03:07
  • hi

    RenderTargetBitmap((int)this.ActualWidth,  (int)this.ActualHeight, 120,  96,  PixelFormats.Default);
    改成
    RenderTargetBitmap((int)this.ActualWidth,  (int)this.ActualHeight, 96,  96,  PixelFormats.Default);

    如果是要在一個視窗畫出一個中線可參考以下:
            private void Draw()
            {
                GeometryDrawing aGeometryDrawing = new GeometryDrawing();
                aGeometryDrawing.Geometry = new LineGeometry(new Point(this.ActualWidth / 2, 0), new Point(this.ActualWidth / 2, this.Height));
                aGeometryDrawing.Brush = this.Background;
    
                aGeometryDrawing.Pen = new Pen(Brushes.Black, 1);
    
                DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);
                geometryImage.Freeze();
    
                Image MainImage = new Image();
                MainImage.Source = geometryImage;
                MainImage.HorizontalAlignment = HorizontalAlignment.Center;
                MainImage.VerticalAlignment = VerticalAlignment.Center;
    
                this.Content = MainImage;
            }
    
    以上程式是參考 MSDN
    DrawingImage 類別
    • 已標示為解答 Optimist9266 2010年1月20日 上午 08:55
    2010年1月19日 下午 05:15
  • 非常感謝,已經達到想要的效果了。

    不知道可否說明一下DPI跟畫面呈現的關聯性?
    2010年1月20日 上午 08:55
  • 2010年1月20日 下午 04:26