private void DrawAndUpdate() { Draw(); #region 更新到窗口上 var pathDirty = Rectangle.Ceiling(_gPathDirty.GetBounds()); pathDirty.Offset(_screenBounds.X, _screenBounds.Y); pathDirty.Intersect(_screenBounds); pathDirty.Offset(-_screenBounds.X, -_screenBounds.Y); //挪回来变为基于窗口的坐标 if (ShowPath) { _canvasWindow.SetDiBitmap(_bitmap, /*_pathDirtyRect*/ pathDirty); } if (_labelChanged) //ShowCommandName) { var labelDirtyRect = _labelRect.Width > _lastLabelRect.Width ? _labelRect : _lastLabelRect; labelDirtyRect.Height = _labelRect.Height > _lastLabelRect.Height ? _labelRect.Height : _lastLabelRect.Height; _canvasWindow.SetDiBitmap(_bitmap, Rectangle.Ceiling(labelDirtyRect)); } else if (_labelVisible) { var labelDirty = Rectangle.Ceiling(_labelRect); var intercected = pathDirty.IntersectsWith(labelDirty); if (intercected && !pathDirty.Contains(labelDirty)) { labelDirty.Intersect(pathDirty); _canvasWindow.SetDiBitmap(_bitmap, labelDirty); } } #endregion }
private void DrawAndUpdate(bool altPath = false) { #region var labelDirtyRect = _labelDirtyRect.Width > _labelLastDirtyRect.Width ? _labelDirtyRect : _labelLastDirtyRect; labelDirtyRect.Height = _labelDirtyRect.Height > _labelLastDirtyRect.Height ? _labelDirtyRect.Height : _labelLastDirtyRect.Height; #endregion _bitmap.DrawWith(g => { // g.Clear(Color.FromArgb(128,0,0,0)); //如果是识别与未识别之间转换,则使用region而非dirtyRect来重绘 if (altPath) { g.Clip = _pathDirtyRegion; } else { g.SetClip(_pathDirtyRect); } if (_labelChanged) { g.SetClip(labelDirtyRect, CombineMode.Union); } g.Clear(Color.Transparent); #region 1) 绘制路径 if (ShowPath && _pathVisible) { g.DrawPath(_shadowPen, _gPath); g.DrawPath(_borderPen, _gPath); g.DrawPath(_pathPen, _gPath); } #endregion #region 2) 绘制标签 if (ShowCommandName && _labelVisible) { var labelDirty = Rectangle.Ceiling(_labelDirtyRect); var intercected = _pathDirtyRect.IntersectsWith(labelDirty); //如果Label的内容改变,则整个重绘 //不然,就判断哪些区域收到了path的影响,然只更新受影响的一小部分。 if (_labelChanged) { g.SetClip(labelDirty); } else if (!intercected) { return; } else if (!_pathDirtyRect.Contains(labelDirty)) { labelDirty.Intersect(_pathDirtyRect); g.SetClip(labelDirty); } using (var pen = new Pen(Color.White, 1.5f * _dpiFactor)) using (var shadow = new Pen(Color.FromArgb(40, 0, 0, 0), 3f * _dpiFactor)) { DrawRoundedRectangle(g, RectangleF.Inflate(_labelDirtyRect, -1f * _dpiFactor, -1f * _dpiFactor), (int)(12 * _dpiFactor), shadow, Color.Transparent); DrawRoundedRectangle(g, RectangleF.Inflate(_labelDirtyRect, -2.6f * _dpiFactor, -2.6f * _dpiFactor), (int)(12 * _dpiFactor), pen, _labelBgColor); if (_labelColor != Color.White) { using (var stroke = new Pen(Color.White, 1.5f * _dpiFactor)) g.DrawPath(stroke, _labelPath); } using (Brush brush = new SolidBrush(_labelColor)) g.FillPath(brush, _labelPath); } } #endregion }); #region 3) 更新到窗口上 if (ShowPath) { _canvasWindow.SetDiBitmap(_bitmap, _pathDirtyRect); } if (ShowCommandName) { var labelDirty = Rectangle.Ceiling(labelDirtyRect); var intercected = _pathDirtyRect.IntersectsWith(labelDirty); if (_labelChanged) { _canvasWindow.SetDiBitmap(_bitmap, labelDirty); } else if (intercected && !_pathDirtyRect.Contains(labelDirty)) { labelDirty.Intersect(_pathDirtyRect); _canvasWindow.SetDiBitmap(_bitmap, labelDirty); } } #endregion }