When the owner window of the container has been scrolled horizontally or vertically the container should be notified about the change so it can adjust the coordinates accordingly.
To set the offset values for the container, call L_ContainerSetOffset.
To determine the current offset values, call L_ContainerGetOffset.
This can often be handled while processing the WM\_HSCROLL
, WM\_SIZE
, and WM\_VSCROLL
messages.
static L_VOID OnSize(
HWND hWnd,
pCONTAINERHANDLE pContainer,
pBITMAPHANDLE pBitmap,
LPRECT prcView,
L_INT cx,
L_INT cy,
L_INT nZoom,
L_INT *pnHScroll, /*last horizontal scroll position*/
L_INT *pnVScroll /*last vertical scroll position*/)
{
SCROLLINFO si;
L_INT nXOffset, nYOffset;
if (NULL != pBitmap && pBitmap->Flags.Allocated)
{
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
// vertical scroll.
GetScrollInfo(hWnd, SB_VERT, &si);
si.nMin = 0;
si.nMax = BITMAPHEIGHT(pBitmap);
si.nPage = MulDiv(cy, 100, nZoom);
SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
GetScrollInfo(hWnd, SB_VERT, &si);
*pnVScroll = si.nPos;
// horizontal scroll
GetScrollInfo(hWnd, SB_HORZ, &si);
si.nMin = 0;
si.nMax = BITMAPWIDTH(pBitmap);
si.nPage = MulDiv(cx, 100, nZoom);
SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
GetScrollInfo(hWnd, SB_HORZ, &si);
*pnHScroll = si.nPos;
}
else
{
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE;
si.nMin = 0;
si.nMax = 0;
SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
*pnHScroll = 0;
*pnVScroll = 0;
}
// set the painting rectangle.
SetRect(prcView, 0, 0, BITMAPWIDTH(pBitmap), BITMAPHEIGHT(pBitmap));
if (nZoom < 100)
{
nXOffset = MulDiv(*pnHScroll, 100, nZoom);
nYOffset = MulDiv(*pnVScroll, 100, nZoom);
}
else
{
nXOffset = *pnHScroll;
nYOffset = *pnVScroll;
}
OffsetRect(prcView, -nXOffset, -nYOffset);
prcView->left = MulDiv(prcView->left, nZoom, 100);
prcView->top = MulDiv(prcView->top, nZoom, 100);
prcView->right = MulDiv(prcView->right, nZoom, 100);
prcView->bottom = MulDiv(prcView->bottom, nZoom, 100);
L_ContainerSetOffset(pContainer, -prcView->left, -prcView->top, 0);
}