Draw Method [InkRenderer Class]
Draw Method [InkRenderer Class]
HRESULT Draw ( [in] long hdc, [in] IInkStrokes* strokes );
[Microsoft® Visual Basic® 6.0]
Public Sub Draw( _ hdc As Long, _ strokes As InkStrokes _ )
[in] Specifies the hWnd of the device context on which to draw.
[in] Specifies the strokes to draw.
|E_POINTER||A parameter contained an invalid pointer.|
|E_INK_MISMATCHED_INK_OBJECT||The strokes parameter is associated with a different InkDisp object.|
|E_INVALIDARG||An argument is invalid.|
|E_INK_INCOMPATIBLE_OBJECT||The stroke or the drawingAttributes parameter does not point to a valid object.|
|E_INK_EXCEPTION||An exception occurred inside the method.|
|E_UNEXPECTED||Unexpected parameter or property type.|
The pen width is multiplied (or scaled) by the square root of the determinant of the view transform.
For example, consider that the pen width is 53, the square root of the determinant is 50, and the bounding box is (0,0,1000,1000). The pen width adjustment to the bounding box in each direction is calculated as (53*50)/2, and the right and bottom sides are incremented by one. This results in a rendered bounding box of (-1325,-1325,2326,2326).
The InkRenderer forces the viewport and window origins to 0,0. Any existing settings are saved and restored, but is not used by the InkRenderer. To perform scrolling, use the InkRenderer object's view and object transform methods.
[Visual Basic 6.0]
This Visual Basic 6.0 example shows a way to do a hit test on ink strokes. Starting with a standard .exe application and adding a reference to the Tablet PC Type Library, this example adds a check box, CheckHitTestMode, which toggles between inking and hit testing with the mouse or pen. When the box is checked, MouseMove events are used to store the mouse location information and force a repaint. The Paint event handler redraws each stroke in blue if part of it is inside the hit test radius, and black otherwise. A circle is drawn around the mouse pointer in red if the hit test radius intersects any strokes, and black if it does not. The Paint event uses the Draw method of the InkRenderer in the InkCollector to redraw when in hit test mode, rather than letting the ink draw itself with the AutoRedraw property set to True.
Option Explicit Dim mouseX As Long Dim mouseY As Long Dim inkX As Long Dim inkY As Long Dim inkRadius As Long Dim theInkCollector As InkCollector Private Sub CheckHitTestMode_Click() 'Toggle the ink collection mode theInkCollector.Enabled = Not theInkCollector.Enabled theInkCollector.AutoRedraw = Not theInkCollector.AutoRedraw Refresh End Sub Private Sub Form_Load() 'Set ScaleMode to pixels to make calculating easier Me.ScaleMode = vbPixels 'Set up the InkCollector Set theInkCollector = New InkCollector theInkCollector.hWnd = Me.hWnd theInkCollector.Enabled = True 'Preload the inkRadius to the inkspace equivalent of '20 pixels inkRadius = 20 theInkCollector.Renderer.PixelToInkSpace Me.hDC, inkRadius, 0 'Start with the hit test mode turned off CheckHitTestMode.Value = 0 End Sub Private Sub Form_MouseMove( _ Button As Integer, Shift As Integer, X As Single, Y As Single) If CheckHitTestMode.Value = 1 Then mouseX = X mouseY = Y inkX = X inkY = Y theInkCollector.Renderer.PixelToInkSpace Me.hDC, inkX, inkY Refresh End If End Sub Private Sub Form_Paint() If CheckHitTestMode.Value = 1 Then 'Set the standard ink drawing attributes to black Dim theDrawingAttributes As New InkDrawingAttributes theDrawingAttributes.Color = vbBlack theInkCollector.Ink.Strokes.ModifyDrawingAttributes theDrawingAttributes theInkCollector.Renderer.Draw Me.hDC, theInkCollector.Ink.Strokes 'Get the collection of hit strokes Dim hitStrokes As InkStrokes Set hitStrokes = _ theInkCollector.Ink.HitTestCircle(inkX, inkY, inkRadius) If hitStrokes.Count > 0 Then 'Draw the hit test circle in red Me.ForeColor = vbRed 'Draw the hit strokes in blue theDrawingAttributes.Color = vbBlue Dim theStroke As IInkStrokeDisp For Each theStroke In hitStrokes theInkCollector.Renderer.DrawStroke Me.hDC, theStroke, theDrawingAttributes Next Else 'Draw the hit test circle in black Me.ForeColor = vbBlack End If 'Draw the strokes, and the hit test circle Circle (mouseX, mouseY), 20 End If End Sub