Took scrolling into account on uiArea with drawing (untested) and mouse events (tested). This is the preliminary work for moving scrolling from pixels to DIPs. But first, a test of scrolled drawing.

This commit is contained in:
Pietro Gagliardi 2015-12-18 22:06:48 -05:00
parent adc72c9d0b
commit 13fa2e213d
2 changed files with 25 additions and 1 deletions

View File

@ -8,7 +8,9 @@ static HRESULT doPaint(uiArea *a, ID2D1RenderTarget *rt, RECT *clip)
uiAreaDrawParams dp;
COLORREF bgcolorref;
D2D1_COLOR_F bgcolor;
D2D1_MATRIX_3X2_F scrollTransform;
// no need to save or restore the graphics state to reset transformations; it's handled by resetTarget() in draw.c, called during the following
dp.Context = newContext(rt);
loadAreaSize(a, rt, &(dp.AreaWidth), &(dp.AreaHeight));
@ -17,9 +19,24 @@ static HRESULT doPaint(uiArea *a, ID2D1RenderTarget *rt, RECT *clip)
dp.ClipY = clip->top;
dp.ClipWidth = clip->right - clip->left;
dp.ClipHeight = clip->bottom - clip->top;
if (a->scrolling) {
dp.ClipX += a->hscrollpos;
dp.ClipY += a->vscrollpos;
}
ID2D1RenderTarget_BeginDraw(rt);
if (a->scrolling) {
ZeroMemory(&scrollTransform, sizeof (D2D1_MATRIX_3X2_F));
scrollTransform._11 = 1;
scrollTransform._22 = 1;
scrollTransform._31 = a->hscrollpos;
scrollTransform._32 = a->vscrollpos;
ID2D1RenderTarget_SetTransform(rt, &scrollTransform);
}
// TODO push axis aligned clip
// TODO only clear the clip area
// TODO clear with actual background brush
bgcolorref = GetSysColor(COLOR_BTNFACE);
@ -31,11 +48,12 @@ static HRESULT doPaint(uiArea *a, ID2D1RenderTarget *rt, RECT *clip)
bgcolor.a = 1.0;
ID2D1RenderTarget_Clear(rt, &bgcolor);
// no need to save or restore the graphics state to reset transformations; it's handled by resetTarget() in draw.c, called by newContext() above
(*(ah->Draw))(ah, a, &dp);
freeContext(dp.Context);
// TODO pop axis aligned clip
return ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
}

View File

@ -103,6 +103,12 @@ static void areaMouseEvent(uiArea *a, uintmax_t down, uintmax_t up, WPARAM wPar
ypix = (double) GET_Y_LPARAM(lParam);
// these are in pixels; we need points
pixelsToDIP(a, &xpix, &ypix);
me.X = xpix;
me.Y = ypix;
if (a->scrolling) {
me.X += a->hscrollpos;
me.Y += a->vscrollpos;
}
loadAreaSize(a, NULL, &(me.AreaWidth), &(me.AreaHeight));