When processing the scrolling message for a window that owns a container associated with an automation handle, the user must set the container offsets. This can be done using L_ContainerSetOffset.
The following example shows how to do this for the WM_SIZE message:
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);
}