DynamicRenderer.ClipRectangle Property
DynamicRenderer.ClipRectangle Property |
Gets or sets the Rectangle structure that represents the rectangle in which to paint the dynamically rendered strokes.
Definition
Visual Basic .NET Public Property ClipRectangle As Rectangle C# public Rectangle ClipRectangle { get; set; } Managed C++ public: __property Rectangle* get_ClipRectangle();
public: __property void set_ClipRectangle(Rectangle*);
Property Value
System.Drawing.Rectangle. The rectangle, in pixels, in which to paint.
This property is read/write. This property has no default value.
Exceptions
COMException :
ObjectDisposedException : The DynamicRenderer object is disposed.
Remarks
The ClipRectangle property gets set immediately and applies to the stroke that is being drawn, unlike the DrawingAttributes property, which applies to the next stroke drawn. This allows the clip rectangle to grow as the stroke is drawn.
Note: Currently, if the ClipRectangle is expanded in mid-stroke, then a DynamicRenderer.Refresh call is required in order to see the new ink. This Refresh call will have to be made every time new ink appears in a new area. However, be aware that this could cause performance problems when inking in the new area.
Examples
[C#]
This C# example is a sample application that shows how to expand a form horizontally if a stroke gets near the right border of the window. If a packet is received that is within 100 pixels of the right border, then the window is expanded by 100 pixels. Note that we need to call DynamicRenderer.Refresh if the packet is in the newly-expanded region, and that we need to keep track of that region using the field oldWidth.
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using Microsoft.Ink; using Microsoft.StylusInput; using Microsoft.StylusInput.PluginData; namespace TestDynamicRendererClipRectangle { public class Form1 : System.Windows.Forms.Form, Microsoft.StylusInput.IStylusAsyncPlugin { private RealTimeStylus theRealTimeStylus; private DynamicRenderer theDynamicRenderer; private Renderer theRenderer; private int oldWidth; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { InitializeComponent(); theDynamicRenderer = new DynamicRenderer(this); theRenderer = new Renderer(); // Create the real time stylus used to receive stylus notifications theRealTimeStylus = new RealTimeStylus(this, true); // Add the dynamic renderer to the synchronous plugin notification chain. // Synchronous notifications occur on the pen thread. theRealTimeStylus.SyncPluginCollection.Add(theDynamicRenderer); // Add the form to the asynchronous plugin notification chain. This plugin // will be used to collect stylus data into an ink object. Asynchronous // notifications occur on the UI thread. theRealTimeStylus.AsyncPluginCollection.Add(this); // Enable the real time stylus and the dynamic renderer theRealTimeStylus.Enabled = true; theDynamicRenderer.Enabled = true; } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 266); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } // Use the oldWidth field to keep track of where the newly-expanded region is. private void Form1_Load(object sender, System.EventArgs e) { oldWidth = this.Width; } // Set interest in packets and stylus up public DataInterestMask DataInterest { get { return DataInterestMask.Packets | DataInterestMask.StylusUp; } } // Check to see if we are drawing near the right side of the form. // Remember, this method needs to be "light-weight" in order not to // slow performance. public void Packets(RealTimeStylus sender, PacketsData data) { // Find out where we are drawing in pixel space. Point location = new Point(data[0], data[1]); Graphics formGraphics = this.CreateGraphics(); theRenderer.InkSpaceToPixel(formGraphics, ref location); // Check to see if we are 100 pixels from the right edge if (this.Right - location.X < 100) { // Grow the form and the clip rectangle this.Width += 100; location = new Point(this.Right, this.Bottom); theRenderer.PixelToInkSpace(formGraphics, ref location); theDynamicRenderer.ClipRectangle = new Rectangle(0, 0, location.X, location.Y); } // Currently, we need to call Refresh on the DynamicRenderer if we are in the new // region in order for the ink to show up. if (location.X >= oldWidth - 100) { theDynamicRenderer.Refresh(); } } // Update the old width each time the stylus comes up public void StylusUp(RealTimeStylus sender, StylusUpData data) { oldWidth = this.Width; } // The remaining interface methods are not used in this sample application. public void CustomStylusDataAdded(RealTimeStylus sender, CustomStylusData data){} public void Error(RealTimeStylus sender, ErrorData data){} public void InAirPackets(RealTimeStylus sender, InAirPacketsData data){} public void RealTimeStylusDisabled(RealTimeStylus sender, RealTimeStylusDisabledData data) {} public void RealTimeStylusEnabled(RealTimeStylus sender, RealTimeStylusEnabledData data){} public void StylusDown(RealTimeStylus sender, StylusDownData data){} public void StylusOutOfRange(RealTimeStylus sender, StylusOutOfRangeData data) {} public void StylusInRange(RealTimeStylus sender, StylusInRangeData data) {} public void StylusButtonDown(RealTimeStylus sender, StylusButtonDownData data) {} public void StylusButtonUp(RealTimeStylus sender, StylusButtonUpData data) {} public void SystemGesture(RealTimeStylus sender, SystemGestureData data){} public void TabletAdded(RealTimeStylus sender, TabletAddedData data){} public void TabletRemoved(RealTimeStylus sender, TabletRemovedData data) {} } }
[Visual Basic .NET]
This Microsoft® Visual Basic® .NET example is a sample application that shows how to expand a form horizontally if a stroke gets near the right border of the window. If a packet is received that is within 100 pixels of the right border, then the window is expanded by 100 pixels. Note that we need to call DynamicRenderer.Refresh if the packet is in the newly-expanded region, and that we need to keep track of that region using the field oldWidth.
Imports Microsoft.Ink Imports Microsoft.StylusInput Public Class Form1 Inherits System.Windows.Forms.Form Implements IStylusAsyncPlugin Private theRealTimeStylus As RealTimeStylus Private theDynamicRenderer As DynamicRenderer Private theRenderer As Renderer Private oldWidth As Integer #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() Me.theDynamicRenderer = New DynamicRenderer(Me) Me.theRenderer = New Renderer() ' Create the real time stylus used to receive stylus notifications Me.theRealTimeStylus = New RealTimeStylus(Me, True) ' Add the dynamic renderer to the synchronous plugin notification chain. ' Synchronous notifications occur on the pen thread. Me.theRealTimeStylus.SyncPluginCollection.Add(theDynamicRenderer) ' Add the form to the asynchronous plugin notification chain. This plugin ' will be used to collect stylus data into an ink object. Asynchronous ' notifications occur on the UI thread. Me.theRealTimeStylus.AsyncPluginCollection.Add(Me) ' Enable the real time stylus and the dynamic renderer Me.theRealTimeStylus.Enabled = True Me.theDynamicRenderer.Enabled = True End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() components = New System.ComponentModel.Container() Me.Text = "Form1" End Sub #End Region ' Use the oldWidth field to keep track of where the newly-expanded region is. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.oldWidth = Me.Width End Sub ' Set interest in packets and stylus up Overridable Overloads ReadOnly Property DataInterest() As DataInterestMask Implements IStylusAsyncPlugin.DataInterest Get Return DataInterestMask.Packets Or DataInterestMask.StylusUp End Get End Property ' Check to see if we are drawing near the right side of the form. ' Remember, this method needs to be "light-weight" in order not to ' slow performance. Public Sub Packets(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.PacketsData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.Packets ' Find out where we are drawing in pixel space. Dim location As New Point(data(0), data(1)) Dim formGraphics As Graphics = Me.CreateGraphics() Me.theRenderer.InkSpaceToPixel(formGraphics, location) ' Check to see if we are 100 pixels from the right edge If Me.Right - location.X < 100 Then ' Grow the form and the clip rectangle Me.Width = Me.Width + 100 location = New Point(Me.Right, Me.Bottom) Me.theRenderer.PixelToInkSpace(formGraphics, location) Me.theDynamicRenderer.ClipRectangle = New Rectangle(0, 0, location.X, location.Y) End If ' Currently, we need to call Refresh on the DynamicRenderer if we are in the new ' region in order for the ink to show up. If location.X >= oldWidth - 100 Then theDynamicRenderer.Refresh() End If End Sub ' Update the old width each time the stylus comes up Public Sub StylusUp(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusUpData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusUp Me.oldWidth = Me.Width End Sub ' The remaining interface methods are not used in this sample application. Public Sub CustomStylusDataAdded(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.CustomStylusData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.CustomStylusDataAdded End Sub Public Sub [Error](ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.ErrorData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.Error End Sub Public Sub InAirPackets(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.InAirPacketsData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.InAirPackets End Sub Public Sub RealTimeStylusDisabled(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.RealTimeStylusDisabledData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.RealTimeStylusDisabled End Sub Public Sub RealTimeStylusEnabled(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.RealTimeStylusEnabledData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.RealTimeStylusEnabled End Sub Public Sub StylusButtonDown(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusButtonDownData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusButtonDown End Sub Public Sub StylusButtonUp(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusButtonUpData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusButtonUp End Sub Public Sub StylusDown(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusDownData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusDown End Sub Public Sub StylusInRange(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusInRangeData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusInRange End Sub Public Sub StylusOutOfRange(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.StylusOutOfRangeData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.StylusOutOfRange End Sub Public Sub SystemGesture(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.SystemGestureData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.SystemGesture End Sub Public Sub TabletAdded(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.TabletAddedData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.TabletAdded End Sub Public Sub TabletRemoved(ByVal sender As Microsoft.StylusInput.RealTimeStylus, ByVal data As Microsoft.StylusInput.PluginData.TabletRemovedData) Implements Microsoft.StylusInput.IStylusAsyncPlugin.TabletRemoved End Sub End Class