『パス描画の色々な方法』

	(例)文字のアウトラインから「座標データ」を取得し、利用する方法。

	『パス関数を使用する方法』
		まず、別記されている「パスの概要」をご覧になって下さい。

		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
		といった構造体の連続したデータとして、バッファにアウトラインデータを返します。
		この各構造体に収められているデータを使用して描画します。