Как использовать IDirectManipulationViewport :: SetViewportRect? - PullRequest
0 голосов
/ 10 февраля 2019

Вот немного измененное приложение «Образец прямой манипуляции» из классических образцов Windows 8.Я удалил все элементы, кроме одного окна просмотра и его содержимого (клетчатая текстура).Когда я устанавливаю IDirectManipulationVewport :: SetViewportRect () со смещением относительно источника (например, SetViewportRect (100, 100, client_rect.right, client_rect.bottom), я ожидаю, что содержимое будет выровнено в 100, 100. Однако содержимое всегда выравнивается поокно (родительский IDirectCompositionVisual) origin.

enter image description here

Я также пробовал IDirectManipulationViewport :: SetViewportTransform () с матрицей перевода, но результат тот же.

Как правильно расположить область просмотра в визуале, а не в источнике? Возможно ли это? Или я должен создать еще один дочерний IDirectCompositionVisual с областью просмотра, расположить его с помощью SetOffsetX / Y и добавить к нему содержимое?

Вот ссылка на документацию

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);

Если вы увеличите масштабвы увидите следующее: enter image description here красный - неверный прямоугольник окна просмотра (_viewportOuterRect.leftи верхние координаты игнорируются, однако размер изменяется).

зеленый - ожидаемый прямоугольник области просмотра.

синий - ожидаемая позиция выравнивания содержимого.

1 Ответ

0 голосов
/ 12 февраля 2019

Этот образец работает для меня, вы можете попробовать.Связанный код, который я изменил для вашего случая:

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

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...