1

これは、Windows 8 の従来のサンプルからわずかに変更された Direct Manipulation Sample アプリです。単一のビューポートとコンテンツ (市松模様のテクスチャ) を除くすべての要素を削除しました。IDirectManipulationVewport::SetViewportRect() を原点へのオフセット (例: SetViewportRect(100, 100, client_rect.right, client_rect.bottom)) に設定すると、コンテンツが 100, 100 に配置されることを期待します。ただし、コンテンツは常にウィンドウ (親 IDirectCompositionVisual) の起点。

ここに画像の説明を入力

IDirectManipulationViewport::SetViewportTransform() も変換マトリックスで試しましたが、結果は同じです。

ビューポートを原点ではなくビジュアルに配置する正しい方法は何ですか? 出来ますか?または、別の子 IDirectCompositionVisual をビューポートで作成し、それを SetOffsetX/Y で配置して、それにコンテンツを追加する必要がありますか?

ここにドキュメントへのリンクがあります

Rita Han の回答後の UPD: サンプルに次の変更を加えるだけの場合:

//modify viewport rectangle in CAppWindow::_SizeDependentChanges()
_viewportOuterRect.left = 100;
_viewportOuterRect.top = 100;

//align content at the center in HRESULT CAppWindow::_InitializeManagerAndViewport()
primaryContentOuter->SetHorizontalAlignment(DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER);
primaryContentOuter->SetVerticalAlignment(DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER);

//change zoom boundaries to enable zoom out
hr = primaryContentOuter->SetZoomBoundaries(0.1f, 5.0f);

ズームアウトすると、次のように表示されます: ここに画像の説明を入力 赤 - 実際には正しくないビューポートの四角形 (_viewportOuterRect.left と top の座標は無視されますが、サイズは変更されます)。

緑 - 予想されるビューポートの四角形。

青 - 予想されるコンテンツの配置位置。

4

1 に答える 1

1

このサンプルは私にとってはうまくいきます。試してみてください。あなたのケースのために私が修正した関連コード:

    ::GetClientRect(_hWnd, &_viewportOuterRect);
    _viewportOuterRect.left = 100;
    _viewportOuterRect.top = 100;
    if(SUCCEEDED(hr))
    {
        hr = _viewportOuter->SetViewportRect(&_viewportOuterRect);
    }

出力:

ここに画像の説明を入力

于 2019-02-12T07:05:15.660 に答える