本文整理汇总了C++中DisplayModel::GetPageInfo方法的典型用法代码示例。如果您正苦于以下问题:C++ DisplayModel::GetPageInfo方法的具体用法?C++ DisplayModel::GetPageInfo怎么用?C++ DisplayModel::GetPageInfo使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DisplayModel
的用法示例。
在下文中一共展示了DisplayModel::GetPageInfo方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ScrollTo
void LinkHandler::ScrollTo(PageDestination *dest)
{
assert(owner && owner->linkHandler == this);
int pageNo = dest->GetDestPageNo();
if (pageNo <= 0)
return;
if (owner->dm->AsChmEngine()) {
owner->dm->AsChmEngine()->GoToDestination(dest);
return;
}
DisplayModel *dm = owner->dm;
PointI scroll(-1, 0);
RectD rect = dest->GetDestRect();
if (rect.IsEmpty()) {
// PDF: /XYZ top left
// scroll to rect.TL()
PointD scrollD = dm->engine->Transform(rect.TL(), pageNo, dm->ZoomReal(), dm->Rotation());
scroll = scrollD.Convert<int>();
// default values for the coordinates mean: keep the current position
if (DEST_USE_DEFAULT == rect.x)
scroll.x = -1;
if (DEST_USE_DEFAULT == rect.y) {
PageInfo *pageInfo = dm->GetPageInfo(dm->CurrentPageNo());
scroll.y = -(pageInfo->pageOnScreen.y - dm->GetWindowMargin()->top);
scroll.y = max(scroll.y, 0); // Adobe Reader never shows the previous page
}
}
else if (rect.dx != DEST_USE_DEFAULT && rect.dy != DEST_USE_DEFAULT) {
// PDF: /FitR left bottom right top
RectD rectD = dm->engine->Transform(rect, pageNo, dm->ZoomReal(), dm->Rotation());
scroll = rectD.TL().Convert<int>();
// Rect<float> rectF = dm->engine->Transform(rect, pageNo, 1.0, dm->rotation()).Convert<float>();
// zoom = 100.0f * min(owner->canvasRc.dx / rectF.dx, owner->canvasRc.dy / rectF.dy);
}
else if (rect.y != DEST_USE_DEFAULT) {
// PDF: /FitH top or /FitBH top
PointD scrollD = dm->engine->Transform(rect.TL(), pageNo, dm->ZoomReal(), dm->Rotation());
scroll.y = max(scrollD.Convert<int>().y, 0); // Adobe Reader never shows the previous page
// zoom = FitBH ? ZOOM_FIT_CONTENT : ZOOM_FIT_WIDTH
}
// else if (Fit || FitV) zoom = ZOOM_FIT_PAGE
// else if (FitB || FitBV) zoom = ZOOM_FIT_CONTENT
/* // ignore author-set zoom settings (at least as long as there's no way to overrule them)
if (zoom != INVALID_ZOOM) {
// TODO: adjust the zoom level before calculating the scrolling coordinates
dm->zoomTo(zoom);
UpdateToolbarState(owner);
}
// */
dm->GoToPage(pageNo, scroll.y, true, scroll.x);
}
示例2: OnSelectAll
void OnSelectAll(WindowInfo* win, bool textOnly) {
if (!HasPermission(Perm_CopySelection))
return;
if (IsFocused(win->hwndFindBox) || IsFocused(win->hwndPageBox)) {
Edit_SelectAll(GetFocus());
return;
}
if (win->AsChm()) {
win->AsChm()->SelectAll();
return;
}
if (!win->AsFixed())
return;
DisplayModel* dm = win->AsFixed();
if (textOnly) {
int pageNo;
for (pageNo = 1; !dm->GetPageInfo(pageNo)->shown; pageNo++)
;
dm->textSelection->StartAt(pageNo, 0);
for (pageNo = win->ctrl->PageCount(); !dm->GetPageInfo(pageNo)->shown; pageNo--)
;
dm->textSelection->SelectUpTo(pageNo, -1);
win->selectionRect = RectI::FromXY(INT_MIN / 2, INT_MIN / 2, INT_MAX, INT_MAX);
UpdateTextSelection(win);
} else {
DeleteOldSelectionInfo(win, true);
win->selectionRect = RectI::FromXY(INT_MIN / 2, INT_MIN / 2, INT_MAX, INT_MAX);
win->currentTab->selectionOnPage = SelectionOnPage::FromRectangle(dm, win->selectionRect);
}
win->showSelection = win->currentTab->selectionOnPage != nullptr;
win->RepaintAsync();
}
示例3: ZoomToSelection
void ZoomToSelection(WindowInfo* win, float factor, bool scrollToFit, bool relative) {
PointI pt;
bool zoomToPt = false;
if (win->AsFixed()) {
DisplayModel* dm = win->AsFixed();
// when not zooming to fit (which contradicts zooming to a specific point), ...
if (!relative && (ZOOM_FIT_PAGE == factor || ZOOM_FIT_CONTENT == factor) && scrollToFit) {
zoomToPt = false;
}
// either scroll towards the center of the current selection (if there is any) ...
else if (win->showSelection && win->currentTab->selectionOnPage) {
RectI selRect;
for (SelectionOnPage& sel : *win->currentTab->selectionOnPage) {
selRect = selRect.Union(sel.GetRect(dm));
}
ClientRect rc(win->hwndCanvas);
pt.x = 2 * selRect.x + selRect.dx - rc.dx / 2;
pt.y = 2 * selRect.y + selRect.dy - rc.dy / 2;
pt.x = limitValue(pt.x, selRect.x, selRect.x + selRect.dx);
pt.y = limitValue(pt.y, selRect.y, selRect.y + selRect.dy);
int pageNo = dm->GetPageNoByPoint(pt);
zoomToPt = dm->ValidPageNo(pageNo) && dm->PageVisible(pageNo);
}
// or towards the top-left-most part of the first visible page
else {
int page = dm->FirstVisiblePageNo();
PageInfo* pageInfo = dm->GetPageInfo(page);
if (pageInfo) {
RectI visible = pageInfo->pageOnScreen.Intersect(win->canvasRc);
pt = visible.TL();
int pageNo = dm->GetPageNoByPoint(pt);
zoomToPt = !visible.IsEmpty() && dm->ValidPageNo(pageNo) && dm->PageVisible(pageNo);
}
}
}
win->ctrl->SetZoomVirtual(factor * (relative ? win->ctrl->GetZoomVirtual(true) : 1), zoomToPt ? &pt : nullptr);
UpdateToolbarState(win);
}