『パスの使用』

	ここでは、 特定のポイント サイズのフォントを
	([フォントの指定]ダイアログ ボックスを使って) ユーザーが選択し、
	(そのフォントで描画したテキストから) クリップ パスを作成し、 テキストによるクリップの結果を表示します。

CHOOSEFONT cf;          /* コモンダイアログボックス構造体 */
LOGFONT lf;             /* 論理フォント構造体 */
HFONT hfont;            /* 新しい論理フォントハンドル */
HFONT hfontOld;         /* 古い論理フォントハンドル */
HDC hdc;                /* デバイスコンテキスト */
int nXStart, nYStart;   /* 描画座標 */
RECT rc;                /* RECT構造体 */
SIZE sz;                /* テキストの大きさを受け取るSize構造体 */
double aflSin[90];      /* 0〜90度のサインの値 */
double aflCos[90];      /* 0〜90度のコサインの値 */
double flRadius,a;      /* 円の半径 */
int iMode;              /* クリッピングモード */
HRGN hrgn;              /* リージョンハンドル */

LRESULT APIENTRY MainWndProc(
    HWND hwnd,                /* Windowハンドル */
    UINT message,             /* メッセージ */
    WPARAM wParam,            /* wPalam */
    LPARAM lParam)            /* lParam */

{
    PAINTSTRUCT ps;

    switch (message) {
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            EndPaint(hwnd, &ps);
            break;

        case WM_COMMAND:			//メニューからの起動
            switch (wParam) {
                case IDM_VANISH:	//クライアントエリアのクリア
                    hdc = GetDC(hwnd);
                    GetClientRect(hwnd, &rc);
                    FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
                    ReleaseDC(hwnd, hdc);
                    break;

                case IDM_AND:		//クリッピングモードを RGN_AND にセットする
                    iMode = RGN_AND;
                    break;

                case IDM_COPY:		//クリッピングモードを RGN_COPY にセットする
                    iMode = RGN_COPY;
                    break;

                case IDM_DIFF:		//クリッピングモードを RGN_DIFF にセットする
                    iMode = RGN_DIFF;
                    break;

                case IDM_OR:		//クリッピングモードを RGN_OR にセットする
                    iMode = RGN_OR;
                    break;

                case IDM_XOR:		//クリッピングモードを RGN_XOR にセットする
                    iMode = RGN_XOR;
                    break;

                case IDM_CLIP_PATH:
					//windowにキャッシュされたDCを検索
                    hdc = GetDC(hwnd);

					//Choose Fontダイアログで、
					//ユーザーによって求められたフォントから論理フォントを作成し、
					//デバイスコンテキストにそのフォントを選択する。
                    hfont = CreateFontIndirect(cf.lpLogFont);
                    hfontOld = SelectObject(hdc, hfont);

                    //テキストに合った大きさのRECTを得る
                     GetTextExtentPoint(hdc, "Clip Path", 9, &sz);

					//クリッピング領域のセット
                     hrgn = CreateRectRgn(nXStart, nYStart,
                         nXStart + sz.cx,
                         nYStart + sz.cy);
                     SelectClipRgn(hdc, hrgn);

					//ユーザーの選択したフォントで描かれたテキストをから、クリップパスを作る。
                    BeginPath(hdc);
                        TextOut(hdc, nXStart, nYStart, "Clip Path", 9);
                    EndPath(hdc);
                    SelectClipPath(hdc, iMode);

                    /* 0〜90度のサインを計算 */
                    for (i = 0; i < 90; i++) {
                        aflSin[i] = sin( (((double)i) / 180.0) * 3.14159);
                    }

                    /* 0〜90度のコサインを計算 */
                    for (i = 0; i < 90; i++) {
                        aflCos[i] = cos( (((double)i) / 180.0) * 3.14159);
                    }

                    /* Set the radius value. */
                    flRadius = (double)(2 * sz.cx);

					//半径から円のエッジまで拡張して、光状線を引く。
                    for (i = 0; i < 90; i++) {
                        MoveToEx(hdc, nXStart, nYStart, (LPPOINT) NULL);
                        LineTo(hdc, nXStart + ((int) (flRadius * aflCos[i])),
                               nYStart + ((int) (flRadius * aflSin[i])));
                    }

					//フォントを元に戻す
                    SelectObject(hdc, hfontOld);

					//ユーザーフォントの削除
                    DeleteObject(hfont);

					//DCのリリース
                    ReleaseDC(hwnd, hdc);

                    break;

                case IDM_FONT:
					//必要メンバの初期化
                    cf.lStructSize = sizeof (CHOOSEFONT);
                    cf.hwndOwner = hwnd;
                    cf.lpLogFont = &lf;
                    cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
                    cf.rgbColors = RGB(0, 255, 255);
                    cf.nFontType = SCREEN_FONTTYPE;

					//Fontダイアログ・ボックスの表示。
					//ユーザーによるフォントの選択。
					//その選択でテキストを描画出来るようにする。
                    if (ChooseFont(&cf)) {
                        hdc = GetDC(hwnd);
                        hfont = CreateFontIndirect(cf.lpLogFont);
                        hfontOld = SelectObject(hdc, hfont);
                        crOld = SetTextColor(hdc, cf.rgbColors);
                        TextOut(hdc, nXStart, nYStart, "Clip Path", 9);
                        SetTextColor(hdc, crOld);
                        SelectObject(hdc, hfontOld);
                        DeleteObject(hfont);
                        ReleaseDC(hwnd, hdc);
                    }

                    break;

                default:
                    return DefWindowProc(hwnd, message, wParam, lParam);
            }
            break;

        case WM_DESTROY:		//windowの終了
            PostQuitMessage(0);
            break;

        default:				//それら以外なら
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}