void CBigScrollView::SetScaleToFitSize(SIZE sizeTotal) { // do not use CScrollView::SetScaleToFit(); // this function change the size of the view ! wxSize sizeClient, sizeSb; GetTrueClientSize(sizeClient, sizeSb); if (m_nMapMode != MM_TEXT) { wxASSERT(m_nMapMode > 0); // must be set CWindowDC dc(NULL); dc.SetMapMode(m_nMapMode); dc.DPtoLP(&sizeClient); } if (sizeClient.cy < MulDiv(sizeTotal.cy, sizeClient.cx, sizeTotal.cx)) { // add 1% to eliminate scroll bars sizeTotal.cy = MulDiv(sizeTotal.cy, 101, 100); sizeTotal.cx = MulDiv(sizeTotal.cx, sizeClient.cy, sizeTotal.cy); sizeTotal.cy = sizeClient.cy; } else { // add 1% to eliminate scroll bars sizeTotal.cx = MulDiv(sizeTotal.cx, 101, 100); sizeTotal.cx = sizeClient.cx; sizeTotal.cy = MulDiv(sizeTotal.cy, sizeClient.cx, sizeTotal.cx); } SetScrollSizes(m_nMapMode, sizeTotal); }
// Send the mouse message void CRDVView::SendMouseMessage(WORD wWM,UINT nFlags,CPoint Point,short zDelta) { // Transmit the mouse event CPoint MousePosition = GetScrollPosition(); // Test for zooming if (!m_bViewZoom) { // Get the client area CSize size,sizeSb; GetTrueClientSize(size,sizeSb); CRect Client; GetClientRect(&Client); // Get floating point versions of the coordinates double dPointX = (double)Point.x; double dPointY = (double)Point.y; double dWidth = (double)m_cxWidth; double dHeight = (double)m_cyHeight; double dSizeX = (double)Client.Width(); double dSizeY = (double)Client.Height(); // Adjust mouse coordinate to match the zoom out aspect ratio dPointX = dWidth / dSizeX * dPointX + 0.5; dPointY = dHeight / dSizeY * dPointY + 0.5; // Assign the new mouse coordinate Point.x = (LONG)dPointX; Point.y = (LONG)dPointY; } else { // Factor in the scroll positions Point += MousePosition; } // Test the keystate nFlags = 0; if (GetKeyState(VK_CONTROL) & 0x8000) nFlags |= 1; if (GetKeyState(VK_SHIFT) & 0x8000) nFlags |= 2; // Add the mouse message m_vMouseMsg.push_back(CMouseMsg(wWM,nFlags,Point,zDelta)); }
CSize CPreviewView::CalcPageDisplaySize() // calculate the current page size // set 'm_nSecondPageOffset' to start of second page // return size of current page less margins { CSize windowSize, scrollSize; GetTrueClientSize(windowSize, scrollSize); // subtract out vertical scrollbar if zoomed out and page range is known // and there is more than one page. if (m_nZoomState == ZOOM_OUT && (m_pPreviewInfo->GetMaxPage() != 0xffff) && (m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() != 0)) windowSize.cx -= scrollSize.cx; m_nSecondPageOffset = (windowSize.cx - PREVIEW_MARGIN) / 2; windowSize.cx = (m_nPages == 2) ? (windowSize.cx - 3*PREVIEW_MARGIN) / 2 : windowSize.cx - 2*PREVIEW_MARGIN; windowSize.cy -= 2*PREVIEW_MARGIN; return windowSize; }
void CScrollWnd::UpdateBars() { // UpdateBars may cause window to be resized - ignore those resizings if (m_bInsideUpdate) return; // Do not allow recursive calls // Lock out recursion m_bInsideUpdate = TRUE; // update the horizontal to reflect reality // NOTE: turning on/off the scrollbars will cause 'OnSize' callbacks ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0); CRect rectClient; BOOL bCalcClient = TRUE; // allow parent to do inside-out layout first CWnd* pParentWnd = GetParent(); if (pParentWnd != NULL) { // if parent window responds to this message, use just // client area for scroll bar calc -- not "true" client area if ((BOOL)pParentWnd->SendMessage(WM_RECALCPARENT, 0, (LPARAM)(LPCRECT)&rectClient) != 0) { // use rectClient instead of GetTrueClientSize for // client size calculation. bCalcClient = FALSE; } } CSize sizeClient; CSize sizeSb; if (bCalcClient) { // get client rect if (!GetTrueClientSize(sizeClient, sizeSb)) { // no room for scroll bars (common for zero sized elements) CRect rect; GetClientRect(&rect); if (rect.right > 0 && rect.bottom > 0) { // if entire client area is not invisible, assume we have // control over our scrollbars EnableScrollBarCtrl(SB_BOTH, FALSE); } m_bInsideUpdate = FALSE; return; } } else { // let parent window determine the "client" rect GetScrollBarSizes(sizeSb); sizeClient.cx = rectClient.right - rectClient.left; sizeClient.cy = rectClient.bottom - rectClient.top; } // enough room to add scrollbars CSize sizeRange; CPoint ptMove; CSize needSb; // get the current scroll bar state given the true client area GetScrollBarState(sizeClient, needSb, sizeRange, ptMove, bCalcClient); if (needSb.cx) sizeClient.cy -= sizeSb.cy; if (needSb.cy) sizeClient.cx -= sizeSb.cx; // first scroll the window as needed ScrollToDevicePosition(ptMove); // will set the scroll bar positions too // this structure needed to update the scrollbar page range SCROLLINFO info; info.fMask = SIF_PAGE|SIF_RANGE; info.nMin = 0; // now update the bars as appropriate EnableScrollBarCtrl(SB_HORZ, needSb.cx); if (needSb.cx) { info.nPage = sizeClient.cx; info.nMax = m_totalDev.cx-1; if (!SetScrollInfo(SB_HORZ, &info, TRUE)) SetScrollRange(SB_HORZ, 0, sizeRange.cx, TRUE); } EnableScrollBarCtrl(SB_VERT, needSb.cy); if (needSb.cy) { info.nPage = sizeClient.cy; info.nMax = m_totalDev.cy-1; if (!SetScrollInfo(SB_VERT, &info, TRUE)) SetScrollRange(SB_VERT, 0, sizeRange.cy, TRUE); } // remove recursion lockout m_bInsideUpdate = FALSE; }
void CXTPPropertyPage::UpdateBars() { if (m_totalDev == CSize(0, 0) || !m_bCreated) return; // UpdateBars may cause window to be resized - ignore those resizings if (m_bInsideUpdate) return; // Do not allow recursive calls // Lock out recursion m_bInsideUpdate = TRUE; // update the horizontal to reflect reality // NOTE: turning on/off the scrollbars will cause 'OnSize' callbacks ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0); CRect rectClient; BOOL bCalcClient = TRUE; CSize sizeClient; CSize sizeSb; // get client rect if (!GetTrueClientSize(sizeClient, sizeSb)) { // no room for scroll bars (common for zero sized elements) CRect rect; GetClientRect(&rect); if (rect.right > 0 && rect.bottom > 0) { // if entire client area is not invisible, assume we have // control over our scrollbars EnableScrollBarCtrl(SB_BOTH, FALSE); } m_bInsideUpdate = FALSE; return; } // enough room to add scrollbars CSize sizeRange; CPoint ptMove; CSize needSb; // get the current scroll bar state given the true client area GetScrollBarState(sizeClient, needSb, sizeRange, ptMove, bCalcClient); if (needSb.cx) sizeClient.cy -= sizeSb.cy; if (needSb.cy) sizeClient.cx -= sizeSb.cx; // first scroll the window as needed ScrollToDevicePosition(ptMove); // will set the scroll bar positions too // this structure needed to update the scrollbar page range SCROLLINFO info; info.fMask = SIF_PAGE|SIF_RANGE; info.nMin = 0; // now update the bars as appropriate EnableScrollBarCtrl(SB_HORZ, needSb.cx); if (needSb.cx) { info.nPage = sizeClient.cx; info.nMax = m_totalDev.cx-1; if (!SetScrollInfo(SB_HORZ, &info, TRUE)) SetScrollRange(SB_HORZ, 0, sizeRange.cx, TRUE); } EnableScrollBarCtrl(SB_VERT, needSb.cy); if (needSb.cy) { info.nPage = sizeClient.cy; info.nMax = m_totalDev.cy-1; if (!SetScrollInfo(SB_VERT, &info, TRUE)) SetScrollRange(SB_VERT, 0, sizeRange.cy, TRUE); } // remove recursion lockout m_bInsideUpdate = FALSE; }