2016-04-22 121 views
0

我正在使用Mitov的Delphi IGDIPlus庫。 我在完全無辜的情況下得到異常「通用錯誤」。 我有五個重疊的矩形,並希望使用aPath.outline()來查找輪廓路徑(我在Win7上運行此示例,並應用了所有輪廓相關的修補程序)。gdiplus Path GdipWindingModeOutline問題

uses 
System.Types, IGDIPlus, VCL.IGDIPlusExt; 


procedure TForm1.FormPaint(Sender: TObject); 
var 
    AGraphics  : IGPGraphics; 
    APath,aPathO : IGPGraphicsPath; 

begin 
    AGraphics := TIGPGraphics.Create(Canvas); 
    AGraphics.SmoothingMode := SmoothingModeAntiAlias; 
    AGraphics.TextRenderingHint := TextRenderingHintAntiAlias; 
    aPath := TIGPGraphicsPath.create() ; 
    // this path gives generic error 
    aPath.addRectangle(73,201,108,96); 
// --------the difference---------- 
    aPath.addRectangle(73,292,58,96); 
// --------the difference---------- 
    aPath.addRectangle(73,383,108,96); 
    aPath.addRectangle(177,201,108,96); 
    aPath.addRectangle(177,383,108,96); 

    try 
    aPathO := apath.clone().Outline(); 
    AGraphics.DrawPath(TIGPPen.Create(aclRed,1), 
     aPathO); 
    except 
    on E: Exception do 
    begin 
     AGraphics.DrawStringF(e.message, 
          TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]), 
          TPointF.Create(23, 23), 
          TIGPSolidBrush.Create(aclRed)) ; 

     AGraphics.DrawPath(TIGPPen.Create(aclRed,1), 
     aPath); 
    end; 
    end; 
    aPath.reset(); 
// this path works fine 
    aPath.addRectangle(373,201,108,96); 
// --------the difference---------- 
    aPath.addRectangle(373,292,108,96);  
// --------the difference---------- 
    aPath.addRectangle(373,383,108,96); 
    aPath.addRectangle(477,201,108,96); 
    aPath.addRectangle(477,383,108,96); 

    try 
    aPathO := apath.clone().Outline(); 
    AGraphics.DrawPath(TIGPPen.Create(aclRed,1), 
     aPathO); 
    AGraphics.DrawStringF('it works', 
          TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]), 
          TPointF.Create(423, 23), 
          TIGPSolidBrush.Create(aclRed)) ; 

    except 
    on E: Exception do 
    begin 
     AGraphics.DrawStringF(e.message, 
          TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]), 
          TPointF.Create(223, 23), 
          TIGPSolidBrush.Create(aclRed)) ; 

     AGraphics.DrawPath(TIGPPen.Create(aclRed,1), 
     aPath); 
    end; 
    end; 
end; 

歡迎任何想法,建議。

運行在C#中相同的例子給出了(使用Outline a path with GDI+ in .Net



    GraphicsPath aPath = new GraphicsPath(); 
       aPath.AddRectangle(new Rectangle(73, 201, 108, 96)); 
       aPath.AddRectangle(new Rectangle(73, 292, 58, 96)); 
       aPath.AddRectangle(new Rectangle(73, 383, 108, 96)); 
       aPath.AddRectangle(new Rectangle(177, 201, 108, 96)); 
       aPath.AddRectangle(new Rectangle(177, 383, 108, 96)); 

       HandleRef handle = new HandleRef(aPath, (IntPtr)aPath.GetType().GetField("nativePath", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(aPath)); 
       try 
       { 

        int status = GdipWindingModeOutline(handle, IntPtr.Zero, 0.25F); 
        using (Pen outlinePen = new Pen(Color.FromArgb(255, Color.Red), 2)) 
        { 
         g.DrawPath(outlinePen, aPath); 
        } 
       } 

       catch (Exception exp) 
       { ... 
       } 

GdipWindingModeOutline函數返回相同的錯誤狀態= 1(一般錯誤)

因爲我真的需要使用輪廓曲線和直接的方式aPath.clone().outline()是由於gdi +錯誤不可能,我不得不周圍。合適的解決方案 - 也許不是最好的,但工程 - 可能是:如果你使用的接口(此庫顯然不會)



     procedure TForm1.FormPaint(Sender: TObject); 
     var 
      AGraphics  : IGPGraphics; 
      APath,aPathO : IGPGraphicsPath; 
      aRegion   : IGPRegion; 
      aScan   : TArray; 
      aMatrix   : IGPmatrix; 

     begin 
      AGraphics := TIGPGraphics.Create(Canvas); 
      AGraphics.SmoothingMode := SmoothingModeAntiAlias; 
      AGraphics.TextRenderingHint := TextRenderingHintAntiAlias; 
      aPath := TIGPGraphicsPath.create() ; 
      aRegion := TIGPRegion.create().MakeEmpty(); 
      aRegion.Union( TIGPRect.create(73,201,108,96)); 
      aRegion.Union( TIGPRect.create(73,292,58,96)); 
      aRegion.Union( TIGPRect.create(73,383,108,96)); 
      aRegion.Union( TIGPRect.create(177,201,108,96)); 
      aRegion.Union( TIGPRect.create(177,383,108,96)); 
      aMatrix := TIGPMatrix.Create(); 
      aScan := lRegion.GetRegionScans(aMatrix); 
      for i := 0 to High(aScan) do 
      aPath.addRectangle(GPInflateRect(aScan[i], 1)); 


      aPathO := aPath.Clone().Outline(); 
      AGraphics.DrawPath(TIGPPen.Create(aclRed,1), aPathO); 

     end; 

回答

0

你行AGraphics.DrawPath(TIGPPen.Create(aclRed,1), ...是在格蘭德爾福全球危險。在涉及到函數調用中的引用計數和對象創建時,Delphi有一些問題(我不記得哪個......)。儘量不要在函數調用中創建對象,而是定義一個新的局部變量來保存參考界面。

+0

沒有,這個問題是不是在這行(代碼是基於Mitov演示),從線路的一般錯誤計數上述 'aPathO:= apath.clone()綱要();' 這將是。如果有人試圖在C#或其他語言中運行類似的示例,這會很有幫助 – EvaF