四角形のクリップ オブジェクトでクリップする方法
注意
Windows 10上のアプリの場合は、DirectComposition ではなく Windows.UI.Composition API を使用することをお勧めします。 詳細については、「 Visual レイヤーを使用してデスクトップ アプリをモダン化する」を参照してください。
このトピックでは、四角形のクリップ オブジェクトを使用してビジュアル ツリーまたはビジュアル ツリーをクリップする方法について説明します。
このトピックの例では、マウスの位置を中心とする四角形のクリップを定義し、コンポジション ターゲット ウィンドウのクライアント領域の中央に配置されたビジュアルにクリップを適用します。 このスクリーン ショットは、四角形のクリップ オブジェクトをビジュアルに適用した結果を示しています。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Microsoft Win32
- コンポーネント オブジェクト モデル (COM)
Instructions
手順 1: DirectComposition オブジェクトを初期化する
- デバイス オブジェクトとコンポジション ターゲット オブジェクトを作成します。
- ビジュアルを作成し、そのコンテンツを設定して、ビジュアル ツリーに追加します。
詳細については、「 DirectComposition を初期化する方法」を参照してください。
手順 2: 四角形のクリップ オブジェクトを作成する
四角形のクリップ オブジェクトのインスタンスを作成するには、 IDCompositionDevice::CreateRectangleClip メソッドを使用します。
HRESULT hr = S_OK;
// Create the rectangle clip object.
if (m_pClip == NULL)
{
hr = m_pDevice->CreateRectangleClip(&m_pClip);
}
手順 3: 四角形クリップ オブジェクトのプロパティを設定する
四角形クリップ オブジェクトの IDCompositionRectangleClip インターフェイスのメソッドを呼び出して、クリップ四角形のプロパティを設定します。
次の例では、現在のマウス位置を中心とするクリップ四角形を定義します。
m_offsetX
メンバー変数と m_offsetY
メンバー変数には、ビジュアルの OffsetX プロパティと OffsetY プロパティの値が含まれます。
if (SUCCEEDED(hr))
{
// Get the location of the mouse.
POINT ptMouse = { };
GetCursorPos(&ptMouse);
ScreenToClient(m_hwnd, &ptMouse);
// Create a 100-by-100 pixel rectangular clip that is
// centered at the mouse location, and is mapped to
// the rectangle of the visual.
m_pClip->SetLeft((ptMouse.x - m_offsetX) - 50.f);
m_pClip->SetTop((ptMouse.y - m_offsetY) - 50.f);
m_pClip->SetRight((ptMouse.x - m_offsetX) + 50.f);
m_pClip->SetBottom((ptMouse.y - m_offsetY) + 50.f);
}
IDCompositionRectangleClip インターフェイスには、角が丸いクリップ四角形を定義するための次のメソッドが含まれていることに注意してください。
手順 4: ビジュアルの Clip プロパティを設定する
IDCompositionVisual::SetClip メソッドを使用して、ビジュアルの Clip プロパティを四角形のクリップ オブジェクトに関連付けます。
if (SUCCEEDED(hr))
{
// Set the rectangle clip object as the Clip property
// of the visual.
hr = m_pVisual->SetClip(m_pClip);
}
手順 5: コンポジションをコミットする
IDCompositionDevice::Commit メソッドを呼び出して、処理のためにコマンドのバッチを Microsoft DirectComposition にコミットします。 クリップの四角形を適用した結果がターゲット ウィンドウに表示されます。
if (SUCCEEDED(hr))
{
// Commit the visual to be composed and displayed.
hr = m_pDevice->Commit();
}
手順 6: DirectComposition オブジェクトを解放する
必要なくなった四角形のクリップ オブジェクトと、デバイス オブジェクト、コンポジション ターゲット オブジェクト、およびビジュアル オブジェクトを解放してください。 次の例では、アプリケーション定義 の SafeRelease マクロを呼び出して DirectComposition オブジェクトを解放します。
SafeRelease(&m_pClip);
SafeRelease(&m_pDevice);
SafeRelease(&m_pD3D11Device);
SafeRelease(&m_pCompTarget);
SafeRelease(&m_pVisual);
SafeRelease(&m_pSurface);
関連トピック