レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API クリッピングの概要

「クリッピング」とは、 アプリケーション ウィンドウのクライアント領域内のリージョンやパスに出力を限定する処理です。Microsoft(R) Win32ベースのアプリケーションでは、 クリッピングはさまざまな用途に使われます。ワード プロセッサや表計算アプリケーションでは、 キーボード入力がページや表の余白に表示されないようにクリップします。CADアプリケーションや描画アプリケーションでは、 ほかの図などに上書きしないようにクリップします。

「クリッピング リージョン」とは、 直線または曲線の辺で構成されるリージョンです。「クリップ パス」とは、 直線、 ベジエ曲線、 及びその両方の組み合わせの辺で構成されるリージョンです。リージョンについて詳しくは、 リージョンの概要を参照してください。パスについて詳しくは、 パスの概要を参照してください。

次に示すトピックでは、 クリッピングについて説明します。

クリッピング リージョン

クリップ パス

クリッピングの使用

クリッピング関数

クリッピング リージョン

クリッピング リージョンとは、 アプリケーションがデバイス コンテキスト (DC) で選択可能なグラフィック オブジェクトの1つです。通常、 クリッピング リージョンは長方形です。デバイス コンテキストには、 デフォルトまたは定義済みのクリッピング リージョンが用意されている場合とされていない場合があります。たとえば、 BeginPaint関数からデバイス コンテキスト ハンドルを取得すると、 そのDCには、 再描画が必要な無効長方形に対応する長方形クリッピング リージョンが含まれています。しかし、 CreateDC関数やGetDC関数を呼び出してデバイス コンテキスト ハンドルを取得すると、 そのDCにはデフォルトのクリッピング リージョンは含まれていません。BeginPaint関数により返されるデバイス コンテキストについて、 詳しくはペイントと描画を参照してください。CreateDC関数とGetDC関数により返されるデバイス コンテキストについて、 詳しくはデバイス コンテキストの概要を参照してください。

クリッピング リージョンには、 さまざまな操作を実行できます。操作には、 リージョンを識別するハンドルを必要とするものとしないものがあります。たとえば、 デバイス コンテキストのクリッピング リージョンには、 次に示す操作を直接実行できます。

・ 直線や円弧、 ビットマップ、 テキスト、 塗りつぶされた図形などのグラフィック オブジェクトの座標をPtVisible関数に渡すことによって、 そのグラフィック オブジェクトがリージョンの境界線内にあるかどうかを判断できます。

RectVisible関数を呼び出すことによって、 クライアント領域の一部がリージョンと交差しているかどうかを判断できます。

OffsetClipRgn関数を呼び出すことによって、 既存のリージョンを指定したオフセットだけ移動できます。

ExcludeClipRect関数を呼び出すことによって、 クライアント領域内の長方形部分を現在のクリッピング リージョンから除外できます。

IntersectClipRect関数を呼び出すことによって、 クライアント領域の長方形部分を現在のクリッピング リージョンを組み合わせることができます。

リージョンを識別するハンドルを取得したら、 次に示すようなリージョンに対する一般的な操作を実行できます。

CombineRgn関数を呼び出すことによって、 現在のクリッピング リージョンのコピーともう1つのリージョンを組み合わせることができます。

EqualRgn関数を呼び出すことによって、 現在のクリッピング リージョンのコピーともう1つのリージョンを比較できます。

PtInRegion関数を呼び出すことによって、 ポイントが現在のクリッピング リージョンのコピー内にあるかどうかを判断できます。

 

クリップ パス

クリップ パスは、 クリッピング リージョンと同様に、 デバイス コンテキストで選択可能なグラフィック オブジェクトです。クリップ パスは、 クリッピング リージョンとは異なり、 常にアプリケーションが作成し、 不規則な図形によるクリッピングに使われます。たとえば、 テキスト文字列の文字のアウトラインを構成する直線と曲線を使って、 クリップ パスを定義できます。

クリップ パスを作成するには、 まず、 必要な図形を示すパスを作成しなければなりません。パスは、 BeginPath関数とEndPath関数の呼び出しの間に適切なGDI描画関数を呼び出して作成します。この関数の集合は、 パス ブラケットと呼ばれます。パスとパス ブラケットについて詳しくは、 パスの概要を参照してください。

パスを作成したら、 SelectClipPath関数を呼び出して、 クリップ パスに変換します。この関数には、 デバイス コンテキストと使用モードを指定します。使用モードは、 Windowsが新しいクリップ パスをデバイス コンテキストの元のクリッピング リージョンに組み合わせるときの方法を示します。使用モードを次の表に示します。

 

モード 説明

RGN_AND クリップ パスには、 デバイス コンテキストのクリッピング リージョンと現在のパスの交差部分 (重なっている領域) が含まれます。

RGN_COPY クリップ パスは現在のパスになります。

RGN_DIFF クリップ パスには、 デバイス コンテキストのクリッピング リージョンから現在のパスに交差する部分を除いたものが含まれます。

RGN_OR クリップ パスには、 デバイス コンテキストのクリッピング リージョンと現在のパスの結合部分 (組み合わせた領域) が含まれます。

RGN_XOR クリップ パスには、 デバイス コンテキストのクリッピング リージョンと現在のパスの結合部分から交差部分を除外したものが含まれます。

 

クリッピングの使用

ここでは、文字列で構成されるクリップ パスを作成するコード例を示します。この例では論理フォントを作成し、 論理フォントを使ってクリップ パス内に文字列を描画し、 水平線と垂直線を描画してパスを塗りつぶします。

/*

* DoClipPat - Draws a clip path using the specified string

* Return value - TRUE if successful; FALSE otherwise

* lplf - address of a LOGFONT structure that defines the font to

* use to draw the clip path

* lpsz - address of a string to use for the clip path

*/ 

BOOL DoClipPath(LPLOGFONT lplf, LPSTR lpsz)

{

LOGFONT lf; /* logical font structure */

HFONT hfont; /* new logical font handle */

HFONT hfontOld; /* original logical font handle */

HDC hdc; /* display DC handle */

 

int nXStart, nYStart; /* drawing coordinates */

RECT rc; /* rectangle structure for painting window */

SIZE sz; /* size structure that receives text extents */

int nStrLen; /* length of the string */

int i; /* loop counter */ 

/* Retrieve a cached DC for the window. */

 

hdc = GetDC(hwnd);

 

/* Erase the current window contents. */

 

GetClientRect(hwnd, &rc);

FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH)); 

/*

* Use the specified font to create a logical font and select it 

* into the DC.

*/ 

hfont = CreateFontIndirect(lplf);

if (hfont == NULL)

return FALSE;

hfontOld = SelectObject(hdc, hfont); 

/* Create a clip path. */ 

nStrLen = lstrlen(lpsz);

BeginPath(hdc);

TextOut(hdc, nXStart, nYStart, lpsz, nStrLen);

EndPath(hdc);

SelectClipPath(hdc, RGN_DIFF); 

/*

* Retrieve the dimensions of the rectangle surrounding

* the text.

*/ 

GetTextExtentPoint32(hdc, lpsz, nStrLen, &sz); 

/* Draw horizontal lines through the clip path. */ 

for (i = nYStart + 1; i < (nYStart + sz.cy); i += 3) { 

MoveToEx(hdc, nXStart, i, (LPPOINT) NULL);

LineTo(hdc, (nXStart + sz.cx), i);

} 

/* Draw vertical lines through the clip path. */ 

for (i = nXStart + 1; i < (nXStart + sz.cx); i += 3){

MoveToEx(hdc, i, nYStart, (LPPOINT) NULL);

LineTo(hdc, i, (nYStart + sz.cy));

} 

/* Select the original font into the DC and release the DC. */ 

SelectObject(hdc, hfontOld);

DeleteObject(hfont);

ReleaseDC(hwnd, hdc); 

return TRUE;

}

長方形のクリッピング リージョンを作成する方法を示す例については、 リージョンの概要を参照してください。

 

クリッピング関数

クリッピングに関する関数を次に示します。

ExcludeClipRect

ExtSelectClipRgn

GetClipBox

GetClipRgn

GetMetaRgn

IntersectClipRect

OffsetClipRgn

PtVisible

RectVisible

SelectClipPath

SelectClipRgn

SetMetaRgn

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします