Implementing Hit Testing

Start with the project you created in Using Vector Engines.

Take the following steps to add support for hit testing different vector objects:

1.

Add the following local variables right under the VECTORPOINT Point; statement in the WndProc function:

POINT pt;
VECTOROBJECT Object;
L_TCHAR szBuffer[ 80 ];
VECTORPEN Pen;

2.

Add the following lines right after the return 0L; statement of case WM_KEYDOWN:

case WM_MOUSEMOVE:
   // hit test object under mouse cursor
   pt.x = LOWORD( lParam );
   pt.y = HIWORD( lParam );
   nRet = L_VecHitTest( &Vector, &pt, &Object );
   if( nRet == SUCCESS )
   {
      // theres an object, show its type in main window caption
      switch( Object.nType )
      {
         case VECTOR_VERTEX: lstrcpy( szBuffer, TEXT("Vertex ")); break; 
         case VECTOR_LINE: lstrcpy( szBuffer, TEXT("Line ")); break; 
         case VECTOR_RECTANGLE: lstrcpy( szBuffer, TEXT("Rectangle ")); break; 
         case VECTOR_POLYLINE: lstrcpy( szBuffer, TEXT("Polyline")); break; 
         case VECTOR_POLYBEZIER: lstrcpy( szBuffer, TEXT("Polybezier")); break; 
         case VECTOR_POLYGON: lstrcpy( szBuffer, TEXT("Polygon")); break; 
         case VECTOR_ELLIPSE: lstrcpy( szBuffer, TEXT("Ellipse")); break; 
         case VECTOR_CIRCLE: lstrcpy( szBuffer, TEXT("Circle")); break; 
         case VECTOR_ARC: lstrcpy( szBuffer, TEXT("Arc")); break; 
         case VECTOR_TEXT: lstrcpy( szBuffer, TEXT("Text")); break; 
         case VECTOR_PIE: lstrcpy( szBuffer, TEXT("Pie")); break; 
         case VECTOR_CHORD: lstrcpy( szBuffer, TEXT("Chord")); break; 
         case VECTOR_RASTER: lstrcpy( szBuffer, TEXT("Raster ")); break; 
      }
   }
   else
      lstrcpy( szBuffer, TEXT("No object under mouse cursor"));

   SetWindowText( hWnd, szBuffer );
   return 0L;

case WM_LBUTTONDOWN:
   // hit test object under mouse cursor
   pt.x = LOWORD( lParam );
   pt.y = HIWORD( lParam );
   nRet = L_VecHitTest ( &Vector, &pt, &Object );
   if( nRet == SUCCESS )
   {
      // theres an object, flip its pen width between 1 and 4
      L_VecGetObjectAttributes ( &Vector, &Object, NULL, &Pen, NULL, NULL );
      Pen.LogPen.lopnWidth.x = ( Pen.LogPen.lopnWidth.x == 1 ) ? 4 : 1;
      L_VecSetObjectAttributes ( &Vector, &Object, NULL, &Pen, NULL, NULL, 0L );

      // reflect our changes
      InvalidateRect( hWnd, NULL, FALSE );
   }
   return 0L;

case WM_RBUTTONDOWN:
   // hit test object under mouse cursor
   pt.x = LOWORD( lParam );
   pt.y = HIWORD( lParam );
   nRet = L_VecHitTest ( &Vector, &pt, &Object );
   if( nRet == SUCCESS )
   {
      // theres an object, delete it
      L_VecDeleteObject ( &Vector, &Object, 0L );

      // reflect our changes
      InvalidateRect( hWnd, NULL, FALSE );
   }
   return 0L;

3.

Compile and run the demo.

4.

Select File/Open… from the program menu. Browse to c:\lead\images\random.dxf and click OK.

5.

You should be able now to see the object type under the mouse cursor on the main window caption. Left click an object to flip its pen width size between 1 and 4. Right click an object to delete it.