- RECT bounds;
- bounds.left = lprcBounds->left;
- bounds.top = lprcBounds->top;
- bounds.right = lprcBounds->right;
- bounds.bottom = lprcBounds->bottom;
- _p_instance->onPaint(hdcDraw, bounds, bounds);
+ if( NULL == lprcBounds )
+ return E_INVALIDARG;
+
+ BOOL releaseDC = FALSE;
+ SIZEL size = _p_instance->getExtent();
+
+ if( NULL == ptd )
+ {
+ hicTargetDev = CreateDevDC(NULL);
+ releaseDC = TRUE;
+ }
+ DPFromHimetric(hicTargetDev, (LPPOINT)&size, 1);
+
+ RECTL bounds = { 0L, 0L, size.cx, size.cy };
+
+ int sdc = SaveDC(hdcDraw);
+ SetMapMode(hdcDraw, MM_ANISOTROPIC);
+ SetWindowOrgEx(hdcDraw, 0, 0, NULL);
+ SetWindowExtEx(hdcDraw, size.cx, size.cy, NULL);
+ OffsetViewportOrgEx(hdcDraw, lprcBounds->left, lprcBounds->top, NULL);
+ SetViewportExtEx(hdcDraw, lprcBounds->right-lprcBounds->left,
+ lprcBounds->bottom-lprcBounds->top, NULL);
+
+ _p_instance->onDraw(ptd, hicTargetDev, hdcDraw, &bounds, lprcWBounds);
+ RestoreDC(hdcDraw, sdc);
+
+ if( releaseDC )
+ DeleteDC(hicTargetDev);
+