コード例 #1
0
        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
        }
コード例 #2
0
        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
        }