『パス描画の色々な方法』
(例)文字のアウトラインから「座標データ」を取得し、利用する方法。
『パス関数を使用する方法』
まず、別記されている「パスの概要」をご覧になって下さい。
API描画関数を、BeginPath()とEndPath()の間に使用すると、
デバイスコンテキスト内に、出力結果がパスブラケットデータとして保持されます。
その後、GetPath()を使用して、パスデータを取得するのです。
もし、文字のアウトラインを取得したいのであれば、
pDC->SetBkMode(TRANSPARENT); //文字のバックカラーをOFF(※)
pDC->BeginPath(); //パスの取得開始
pDC->TextOut(0, 0, letter); //テキストのアウトラインをパスとして出力
pDC->EndPath(); //パスの取得終了(パスブラケットの作成)
と、なります。
そして、そのパスブラケットを取得したいのであれば、
int nCount; //パスの数
LPPOINT pPathData; //座標データ
LPBYTE pTypeData; //形状データ
nCount = pDC->GetPath(NULL, NULL, 0); //パスの総数を取得
pPathData = new POINT[nCount]; //バッファの確保
pTypeData = new BYTE[nCount]; //バッファの確保
pDC->GetPath(pPathData, pTypeData, nCount) //パスデータの取得
で、取得できます(使用後、バッファの開放を忘れないで下さい)
形状の変形や拡大、合成などを行いたい場合はこのデータを操作することになるでしょう。
そして、いよいよこのデータを使用しての描画方法の説明に移るのですが…
もし、あなたの開発しているアプリケーションがWinNT専用のものであれば、それは簡単に実現できます。
PolyDraw() //WinNTのみ対応
この関数は、そのまま、上記で取得したデータを与えてやるだけで事は足りるのです。
しかしながら、大多数のアプリケーションはWin9*対応であるため、この関数を使用することは出来ません。
そこで、私は次のような描画ルーチンを作成しました。
pDC->BeginPath();
for(int i = 0; i < nCount; i++){ //形状に従ってパスブラケットを構築
switch(pTypeData[i]){
case PT_MOVETO: //移動
pDC->MoveTo(pPathData[i]);
break;
case PT_LINETO: //直線
case (PT_CLOSEFIGURE | PT_LINETO): //直線の最終点
pDC->LineTo(pPathData[i]);
break;
case PT_BEZIERTO: //ベジェ曲線
case (PT_CLOSEFIGURE | PT_BEZIERTO):
pDC->PolyBezierTo(&pPathData[i], 3);
i += 2;
break;
default: break;
}
}
pDC->CloseFigure(); //パスを閉じる
pDC->EndPath();
これで、保持していたデータを、再びパスブラケットとすることが出来ます。
いちいちパスブラケットとした理由は、この状態からならば、さまざまな利点が生まれるからです。
その利点とは(セットしてあるデバイスコンテキストに対し)
・描画(内部の塗りつぶし・アウトラインの描画)ができる
StrokeAndFillPath();
StrokePath();
FillPath();
・クリッピング領域に指定できる
SelectClipPath();
・リージョンに変換できる
PathToRegion()
の三点です。
以上を使用し、文字を効果的に変形・描画することが出来るでしょう。
例としては、
「文字アウトラインのみの書き出し」
「クリッピングを利用した描画マスク」
「文字の形状座標データを変形できるハンドル(動的GUI)の提供」
「リージョンに変換することによる、特殊な合成や加工」
また、この「パス」はCADなどにも使われているように文字の描画に限らず、全ての図形描画に使用できます。
例としては、
「ベジェ曲線」
「特殊なウインドウ形状の作成」
「あらゆるBMPなどの描画の際のマスク処理」
以上、お力になれたら幸いです。
『GetGlyphOutline関数を使用する方法』(筆者自身が利用したことの無い関数なのでおざなりです)
また、上記以外にも文字のアウトラインをデータとして取得する方法はあります。
この関数を使用すると
・TTPOLYGONHEADER
・TTPOLYCURVE
といった構造体の連続したデータとして、バッファにアウトラインデータを返します。
この各構造体に収められているデータを使用して描画します。