Direct2D PathGeometryのCreate方法を教えてください

解決


Jasmine  2018-08-17 10:16:00  No: 49357

polylineをdirect2Dを使って,(少数の座標値を使って)描こうと,下記のようなコードを書きましたが,エラーが出ます。

     hr := Ifact.CreatePathGeometry(crv);
のところでエラーが出るのですが,解決するにはどのようにすればよいのでしょうか。
この手の内容は,C++用にはたくさんあるのですが,Delphi用の解説はほとんどなくて困っています。
==============================================================
  procedure CustomPolyline(points: array of TD2Dpoint2F);
  var
    iFact : Id2D1Factory;
    crv : ID2D1pathgeometry;
    isink : ID2D1GeometrySink;
    hr : Hresult;
  begin
     if length(points) = 0 then exit;
     hr := Ifact.CreatePathGeometry(crv);
     if not secceeded(hr) then exit;
     hr := crv.open(isink);
     if not secceeded(hr) then exit;
     isink.SetFillMode(D2D1_FILL_MODE_WINDING);
     isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
     isink.AddLines(@points[1],length(points)-1);
     isink.EndFigure(D2D1_FIGURE_END_Closed);
     isink.Close;
(以下省略)
==============================================================


Jasmine  2018-08-17 10:21:05  No: 49358

polylineをdirect2Dを使って,(小数の座標値を使って)描こうと,下記のようなコードを書きましたが,エラーが出ます。 

     hr := Ifact.CreatePathGeometry(crv); 
のところでエラーが出るのですが,解決するにはどのようにすればよいのでしょうか。 
この手の内容は,C++用にはたくさんあるのですが,Delphi用の解説はほとんどなくて困っています。 
============================================================== 
  procedure CustomPolyline(points: array of TD2Dpoint2F); 
  var 
    iFact : Id2D1Factory; 
    crv : ID2D1pathgeometry; 
    isink : ID2D1GeometrySink; 
    hr : Hresult; 
  begin 
     if length(points) = 0 then exit; 
     hr := Ifact.CreatePathGeometry(crv); 
     if not secceeded(hr) then exit; 
     hr := crv.open(isink); 
     if not secceeded(hr) then exit; 
     isink.SetFillMode(D2D1_FILL_MODE_WINDING); 
     isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED); 
     isink.AddLines(@points[1],length(points)-1); 
     isink.EndFigure(D2D1_FIGURE_END_Closed); 
     isink.Close; 
(以下省略) 
==============================================================


通りすがり  2018-08-17 15:07:21  No: 49359

環境もエラーメッセージ/エラーコードも書かずに質問とな?

はともかく、なぜTDirect2DCanvasを使わないんです?

[ 194_線の端点形状の変更と Direct2D ] - Mr.XRAY
http://mrxray.on.coocan.jp/Delphi/plSamples/194_Direct2DBasic.htm

とか参考にしてはいかがですか?


Jasmine  2018-08-17 22:08:34  No: 49360

不十分な質問内容で失礼しました。
環境は Windows10 + Delphi10.2pro です。
また,エラーメッセージは,
「モジュール'xxx.exe'のアドレス yyyyyyyy でアドレス 00000000 に対する読み取り違反がおきました。」
というものです。Breakpointを設置して調べてみたところ,
  hr := Ifact.CreatePathGeometry(crv); 
のことろで,エラーを生じているようです。

プログラムのコードは,この後,既存の bmp:Tbitmap に対して,direct2Dcanvas,DrawGeomwtry を用いて描画するつもりでした。

====================================================
  procedure CustomPolyline(points: array of TD2Dpoint2F);
  var
    iFact : Id2D1Factory;
    crv : ID2D1pathgeometry;
    isink : ID2D1GeometrySink;
    hr : Hresult;
    Lcanvas : Tdirect2dCanvas;
  begin
     if length(points) = 0 then exit;
     hr := Ifact.CreatePathGeometry(crv);
     if not succeeded(hr) then exit;
     hr := crv.open(isink);
     if not succeeded(hr) then exit;
     isink.SetFillMode(D2D1_FILL_MODE_WINDING);
     isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
     isink.AddLines(@points[1],length(points)-1);
     isink.EndFigure(D2D1_FIGURE_END_Closed);
     isink.Close;
     LCanvas := TDirect2DCanvas.Create(bmp.Canvas, bmp.canvas.clipRect);
     with LCanvas do
     begin
        BeginDraw;
          drawgeometry(crv);
        ENdDraw;
     end;
     LCanvas.Free;
  end;
====================================================

Direct2dCanvs.Polyline では整数値の座標しか扱えないので,小数の座標を扱うために,geometry を作って DrawGeometry で描画を
試みた次第です。


au  2018-08-17 22:43:17  No: 49361

エラーが出るのは、宣言しただけのiFactをいきなり使ってるからでしょう

MSDNとか見るとD2D1CreateFactoryを使用してID2D1Factoryを構築するみたいですけど詳しい事は判りません。


Mr.XRAY  2018-08-18 00:14:31  No: 49362

自作した

procedure CustomPolyline(points: array of TD2Dpoint2F); 

というルーチンが期待通りに動作しないということですよね ?
僭越ではありますが,そういう時のすごい技をお教え致します.

それは「新規にプロジェクトを作成」して,その関数だけをテストするプログラムを書いてテストします.
この方法は,私が長年 Delphi を使っていて苦労の末に編み出した「技」です.
今回,特別に公開するものです.
例えば以下のようにします.
こうすると,以下のコードをコピペして,他の方もテスト可能になるというスゴイ「技」なのです.

implementation

{$R *.dfm}

uses
 Direct2D, D2D1;

procedure CustomPolyline(points: array of TD2Dpoint2F);
  var
    iFact : Id2D1Factory;
    crv : ID2D1pathgeometry;
    isink : ID2D1GeometrySink;
    hr : Hresult;
    Lcanvas : Tdirect2dCanvas;
  begin
    iFact := D2DFactory();

     if length(points) = 0 then exit;
     hr := Ifact.CreatePathGeometry(crv);
     if not succeeded(hr) then exit;
     hr := crv.open(isink);
     if not succeeded(hr) then exit;
     isink.SetFillMode(D2D1_FILL_MODE_WINDING);
     isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
     isink.AddLines(@points[1],length(points)-1);
     isink.EndFigure(D2D1_FIGURE_END_Closed);
     isink.Close;
     LCanvas := TDirect2DCanvas.Create(Form1.Canvas, Form1.canvas.clipRect);
//     LCanvas := TDirect2DCanvas.Create(bmp.Canvas, bmp.canvas.clipRect);
     with LCanvas do
     begin
        BeginDraw;
          drawgeometry(crv);
        ENdDraw;
     end;
     LCanvas.Free;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LPoints : array of TD2Dpoint2F;
begin
  SetLength(LPoints, 3);

  LPoints[0].x := 30.0;
  LPoints[0].y := 30.0;

  LPoints[1].x := 150;
  LPoints[1].y := 80.0;

  LPoints[2].x := 80.0;
  LPoints[2].y := 130.0;

  CustomPolyline(LPoints);
end;


Jasmine  2018-08-18 01:16:56  No: 49363

iFact := D2DFactory(); 
が欠けていたということですね。
interface() の勉強不足でした。
ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加