2012年10月8日月曜日

DrawTextLayout()を使った描画

DrawTextLayout()を使ってテキストを描画するには

IDWriteFactoryの作成
IDWriteTextFormat(テキストフォーマット)の作成
IDWriteTextLayout(テキストレイアウトの作成
DrawTextLayout()を呼ぶ

というステップが必要です。
前回 の手順IDWriteFactoryIDWriteTextFormat
の作り方を述べたので、今回はその時作った変数を使いまわします。

なので

1)CreateTextLayout()テキストレイアウトを作成
2) DrawTextLayout()を呼ぶ。


という2ステップで文字が描画できます。

1) テキストレイアウトを作成

以下はpTextLayoutという名前でテキストレイアウトを作成する例です。

std::wstring wst(L"abcd文字列");

IDWriteTextLayout* pTextLayout = NULL;

pWriteFactory_->CreateTextLayout(
wst.c_str(),
wst.size(),
pFom,
 1000, //レイアウト幅
 30,//レイアウト高さ
&pTextLayout
);

上から順に引数を解説します。
[in] const WCHAR *
描画する文字列です。DrawText()の時と違い、今回呼ぶDrawTextLayout()は描画する文字列を直接指定しません。代わりに今ここで、テキストレイアウト内の文字列として描画した文字列を指定して置きます。

UINT32
描画する文字数です。

IDWriteTextFormat * 
(前回作成した)テキストフォーマットです。

FLOAT  
レイアウトボックスの幅です。描画する文字列がどのくらいの幅になったら改行するのかを指定します。

FLOAT
レイアウトボックスの高さです。 DrawTextLayout()の第4引数でD2D1_DRAW_TEXT_OPTIONS_CLIPを指定した場合、この高さからはみ出す部分がトリミングされます。

[out] IDWriteTextLayout**
出力されるテキストレイアウトです。

2) DrawTextLayout()を呼ぶ 


D2D1_POINT_2F points;
points.x = 50.0f;
points.y = 50.0f;

pHwndRenderTarget->DrawTextLayout (points, pTextLayout , pBrush_);

引数は以下の通りです。

1:D2D1_POINT_2F
描画するテキストの左上隅座標です。

2:IDWriteTextLayout
ステップ1)で作成したテキストレイアウトです。

3:ID2D1Brush
描画用のブラシを表すDirect2Dのオブジェクトです。

4(オプション):D2D1_DRAW_TEXT_OPTIONS

オプション的に指定可能なD2D1_DRAW_TEXT_OPTIONS 列挙型です。文字列をCreateTextLayout()の引数で指定したレイアウトに合わせてトリミングしたい場合はD2D1_DRAW_TEXT_OPTIONS_CLIPを指定します。他の値は「ピクセル境界に対してスナップするかどうか」という表示における微妙な問題を指定できるっぽいです。

以上で、DrawTextLayout()を使った描画の完成です。 文字列の描画が不要になったら、最後は作ったインターフェースは Release() しましょう。

実はDrawText()の時の画像の使い回し

DrawText()による描画を経験した後だと新しい概念はさほど必要無かったと思います。
しかしDrawTextLayout()を使った描画では IDWriteTextLayoutメソッドによって描画したい文字列の設定を後から変更したり下線を付けたりも出来ます。

 下線取り消し線を付ける

下線の設定はテキストレイアウトメンバのSetUnderline()で出来ます。
上の表示は下のコード結果です。

//まず、構造体で対象文字列の設定をします
DWRITE_TEXT_RANGE dtr;
dtr.startPosition = 1;//配列何番目から
dtr.length = 6;//何文字分
pTextLayout->SetUnderline(TRUE, dtr);//TRUEで下線を引く
//描画
pHwndRenderTarget->DrawTextLayout (points, pTextLayout , pBrush_);

dtr.length =3;//今度は3文字だけ
pTextLayout->SetUnderline(FALSE, dtr);//FALSEで下線を取り消す
//さっきの文字列の50下に描画
points.y +=50;
pHwndRenderTarget->DrawTextLayout (points,pTextLayout , pBrush_);

dtr.startPosition = 11; //今度は別の場所に下線を加える
pTextLayout->SetUnderline(TRUE, dtr);
//さっきの文字列の50下に描画
points.y +=50;
pHwndRenderTarget->DrawTextLayout (points,pTextLayout , pBrush_);

取り消し線も同様の設定でSetStrikethrough()を呼べば付けられます。
例えば上の例でSetUnderlineと書いてある場所を
SetStrikethroughに置き換えれば、下線が付いている場所が取り消し線に替ります。


その他はIDWriteTextLayout インターフェイスをどうぞ

0 件のコメント: