diff --git a/windows/areadraw.c b/windows/areadraw.c index 95c3cbf0..93b4555f 100644 --- a/windows/areadraw.c +++ b/windows/areadraw.c @@ -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); } diff --git a/windows/areaevents.c b/windows/areaevents.c index 5af03e32..9943b423 100644 --- a/windows/areaevents.c +++ b/windows/areaevents.c @@ -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));