『パス描画の色々な方法』 (例)文字のアウトラインから「座標データ」を取得し、利用する方法。 『パス関数を使用する方法』 まず、別記されている「パスの概要」をご覧になって下さい。 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 といった構造体の連続したデータとして、バッファにアウトラインデータを返します。 この各構造体に収められているデータを使用して描画します。