Implementing Hit Testing

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 break; 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 ); 
    break; 
    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.NewPen.LogPen.lopnWidth.x = ( Pen.NewPen.LogPen.lopnWidth.x == 1 ) ? 4 : 1; 
       L_VecSetObjectAttributes ( &Vector, &Object, NULL, &Pen, NULL, NULL, 0L ); 
       // reflect our changes 
       InvalidateRect( hWnd, NULL, FALSE ); 
    } 
    break; 
    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 ); 
    } 
    break; 

  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.

Help Version 21.0.2021.4.7
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS Vector C API Help