簡體   English   中英

Graphics.ScaleTransform的替代品

[英]Alternative to Graphics.ScaleTransform

我正在使用GDI +進行自定義繪圖。

通常情況下,如果我想要適合我正在繪制的窗口,我會計算出適當的比例,並且我按比例調整ScaleTransform的所有內容:

e.Graphics.ScaleTransform(ratio, ratio);

ScaleTransform的問題在於它可以縮放包括筆划和筆刷在內的所有內容。

我可以縮放我繪制的所有像素坐標嗎? 每個線,矩形或路徑基本上都是一系列點。 所以我可以手動將所有這些點乘以比率,但是有一個簡單的替代方案可以更加無縫地完成嗎?

首先嘗試將所有對象放在GraphicsPath實例中。 它沒有ScaleTransform方法,但您可以使用GraphicsPath.Transform轉換對象。 您可以通過Matrix.Scale傳遞縮放矩陣。

我認為ScaleTransform適用於GDI上下文所關注的每個數值,所以不幸的是你不能只將它用於坐標。 WPF有一個GeometryTransform但我不知道GDI +中的等價物。

如果您擔心代碼重復,您總是可以編寫一個實用工具方法來繪制具有應用於其點的特定比例級別的形狀。

您還可以嘗試通過將其反轉應用於您不想縮放的任何對象來手動反轉ScaleTransform ; 我知道有些畫筆暴露了這種方法。

您可以包裝GDI圖形對象並存儲比例因子

interface IDrawing
{
   void Scale(float sx, float sy);
   void Translate(float dx, float dy);
   void SetPen(Color col, float thickness);
   void DrawLine(Point from, Point to);
   // ... more methods
}

class GdiPlusDrawing : IDrawing
{
   private float scale;
   private Graphics graphics;
   private Pen pen;

   public GdiPlusDrawing(Graphics g)
   {
      float scale = 1.0f;
   }

   public void Scale(float s)
   {
       scale *= s;
       graphics.ScaleTransform(s,s);
   }

   public void SetPen(Color color, float thickness)
   {
       // Use scale to compensate pen thickness.
       float penThickness = thickness/scale;
       pen = new Pen(color, penThickness);   // Note, need to dispose.
   }

   // Implement rest of IDrawing
}

幸運的是,Pen有一個局部ScaleTransform,通過它可以進行反向重新縮放以補償全局變換。 Pen.ResetTransform在使用每次重新縮放之后,或當前的筆縮放(獨立於圖形上下文)可以縮小到幾乎沒有(實際上,一個像素),射擊到月球,或點中途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM