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 和顶部坐标被忽略,但大小已更改)。

绿色 - 预期的视口矩形。

蓝色 - 预期的内容对齐位置。

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 回答