/// <summary> /// Renders this element and all its child elements. /// </summary> /// <param name="dc">The drawing context to use for rendering.</param> protected override void RenderRecursive(DrawingContext dc) { if (_redirect) { dc = _displayModule._drawingContext; base.RenderRecursive(dc); int x, y, w, h; dc.GetClippingRectangle(out x, out y, out w, out h); _displayModule.Paint(dc.Bitmap, x, y, w, h); } else { base.RenderRecursive(dc); } }
private voiddelegate invalidate; // WORKAROUND private void Instance_PostRender(DrawingContext dc) { // The below workaround handles the issue that the OLED screen driver API cannot handle partial screen updates // WORKAROUND - when the clipping rectangle is not the full size, invalidate the whole window so we get called again with the full size int x, y, width, height; dc.GetClippingRectangle(out x, out y, out width, out height); if (x != 0 || y != 0 || width != dc.Width || height != dc.Height) { //Debug.Print("Paint rectangle: x " + x + " y " + y + " w " + width + " h " + height); if (invalidate == null) invalidate = new voiddelegate(WPFWindow.Invalidate); // WORKAROUND Program.BeginInvoke(invalidate, null); // WORKAROUND return; // WORKAROUND } Paint(dc.Bitmap); }
public override void OnRender(DrawingContext dc) { if (_pushClippingRectangle) { try { dc.PushClippingRectangle(x0, y0, xDimension, yDimension); } catch (ArgumentException ex) { Log.Comment("Caught " + ex.Message + " when Pushing a clipping rectangle at (" + x0 + ", " + y0 + ")" + " and Width = " + xDimension + " Height = " + yDimension); _argumentException = true; } } if (_popClippingRectangle) { dc.PopClippingRectangle(); } if (_getClippingRectangle) { dc.GetClippingRectangle(out x1, out y1, out wd, out ht); } if (_drawLine) { dc.DrawLine(_pen, x0, y0, x1, y1); } if (_drawRectangle) { try { dc.DrawRectangle(_brush, _pen, r, s, xDimension, yDimension); } catch (ArgumentException ex) { Log.Comment("Caught " + ex.Message + " when drawing a Rectangle at (" + r + ", " + s + ")" + " Width = " + xDimension + " Height = " + yDimension); _argumentException = true; } } if (_drawEllipse) { dc.DrawEllipse(_brush, _pen, r, s, xDimension, yDimension); } if (_drawPolygon) { dc.DrawPolygon(_brush, _pen, pts); } if (_clear) { dc.Clear(); } if (_setPixel) { dc.SetPixel(_color, r, s); } if (_drawImage) { try { dc.DrawImage(bmp1, r, s); } catch (NullReferenceException ex) { Log.Comment("Caught " + ex.Message + " when drawing a null Image"); _nullReferenceException = true; } } if (_drawCroppedImage) { try { dc.DrawImage(bmp1, r, s, x0, y0, xDimension, yDimension); } catch (ArgumentException ex) { Log.Comment("Caught " + ex.Message + " when drawing an Image at (" + r + ", " + s + ")" + "from a source Image at(" + x0 + ", " + y0 + ") Width = " + xDimension + " Height = " + yDimension); _argumentException = true; } catch (NullReferenceException ex) { Log.Comment("Caught " + ex.Message + " when drawing a null Image"); _nullReferenceException = true; } } if (_translate) { dc.Translate(r, s); } if (_blendImage) { dc.BlendImage(bmp2, x0, y0, x1, y1, xDimension, yDimension, _opacity); } if (_drawText) { _textFits = dc.DrawText(ref _str, _font, _color, r, s, xDimension, yDimension, _alignment, _trimming); } base.OnRender(dc); _pBitmap = dc.Bitmap; Master_Media.autoEvent.Set(); }