/// <summary> /// See C++ documentation /// </summary> public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr, bool fDrawSel, IVwRootSite pvrs) { IVwSynchronizer synchronizer = prootb.Synchronizer; if (synchronizer != null) { try { if (synchronizer.IsExpandingLazyItems) { return; } } catch (Exception e) { Console.WriteLine("call to IsExpandingLazyItems caused exceptionException e ={0}", e); } } IVwGraphicsWin32 qvg = VwGraphicsWin32Class.Create(); Rectangle rcp = rcpDraw; using (Graphics screen = Graphics.FromHdc(hdc)) using (var memoryBuffer = new MemoryBuffer(rcp.Width, rcp.Height)) { memoryBuffer.Graphics.FillRectangle(new SolidBrush(ColorUtil.ConvertBGRtoColor(bkclr)), 0, 0, rcp.Width, rcp.Height); qvg.Initialize(memoryBuffer.Graphics.GetHdc()); VwPrepDrawResult xpdr = VwPrepDrawResult.kxpdrAdjust; IVwGraphics qvgDummy = null; try { Rect rcDst, rcSrc; while (xpdr == VwPrepDrawResult.kxpdrAdjust) { pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst); Rectangle temp = rcDst; temp.Offset(-rcp.Left, -rcp.Top); rcDst = temp; qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch; qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch; xpdr = prootb.PrepareToDraw(qvg, rcSrc, rcDst); pvrs.ReleaseGraphics(prootb, qvgDummy); qvgDummy = null; } if (xpdr != VwPrepDrawResult.kxpdrInvalidate) { pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst); Rectangle temp = rcDst; temp.Offset(-rcp.Left, -rcp.Top); rcDst = temp; qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch; qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch; try { prootb.DrawRoot(qvg, rcSrc, rcDst, fDrawSel); } catch (Exception e) { Console.WriteLine("DrawRoot e = {0} qvg = {1} rcSrc = {2} rcDst = {3} fDrawSel = {4}", e, qvg, rcSrc, rcDst, fDrawSel); } pvrs.ReleaseGraphics(prootb, qvgDummy); qvgDummy = null; } } catch (Exception) { if (qvgDummy != null) { pvrs.ReleaseGraphics(prootb, qvgDummy); } qvg.ReleaseDC(); throw; } if (xpdr != VwPrepDrawResult.kxpdrInvalidate) { screen.DrawImageUnscaled(memoryBuffer.Bitmap, rcp.Left, rcp.Top, rcp.Width, rcp.Height); } qvg.ReleaseDC(); } }
/// <summary> /// See C++ documentation /// </summary> public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr, bool fDrawSel, IVwRootSite pvrs) { IVwSynchronizer synchronizer = prootb.Synchronizer; if (synchronizer != null) { try { if (synchronizer.IsExpandingLazyItems) { return; } } catch (Exception e) { Console.WriteLine("call to IsExpandingLazyItems caused exceptionException e ={0}", e); } } IVwGraphicsWin32 qvg = VwGraphicsWin32Class.Create(); Rectangle rcp = rcpDraw; using (Graphics screen = Graphics.FromHdc(hdc)) using (var memoryBuffer = new MemoryBuffer(rcp.Width, rcp.Height)) { memoryBuffer.Graphics.FillRectangle(new SolidBrush(ColorUtil.ConvertBGRtoColor(bkclr)), 0, 0, rcp.Width, rcp.Height); qvg.Initialize(memoryBuffer.Graphics.GetHdc()); VwPrepDrawResult xpdr = VwPrepDrawResult.kxpdrAdjust; IVwGraphics qvgDummy = null; try { Rect rcDst, rcSrc; while (xpdr == VwPrepDrawResult.kxpdrAdjust) { pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst); Rectangle temp = rcDst; temp.Offset(-rcp.Left, -rcp.Top); rcDst = temp; qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch; qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch; xpdr = prootb.PrepareToDraw(qvg, rcSrc, rcDst); pvrs.ReleaseGraphics(prootb, qvgDummy); qvgDummy = null; } if (xpdr != VwPrepDrawResult.kxpdrInvalidate) { pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst); Rectangle temp = rcDst; temp.Offset(-rcp.Left, -rcp.Top); rcDst = temp; qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch; qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch; try { prootb.DrawRoot(qvg, rcSrc, rcDst, fDrawSel); } catch (Exception e) { Console.WriteLine("DrawRoot e = {0} qvg = {1} rcSrc = {2} rcDst = {3} fDrawSel = {4}", e, qvg, rcSrc, rcDst, fDrawSel); } pvrs.ReleaseGraphics(prootb, qvgDummy); qvgDummy = null; } } catch (Exception) { if (qvgDummy != null) pvrs.ReleaseGraphics(prootb, qvgDummy); qvg.ReleaseDC(); throw; } if (xpdr != VwPrepDrawResult.kxpdrInvalidate) { screen.DrawImageUnscaled(memoryBuffer.Bitmap, rcp.Left, rcp.Top, rcp.Width, rcp.Height); } qvg.ReleaseDC(); } }