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.

Click the "Class View" tab of the project workspace.

2.

Select the CMainFrame() branch.

3.

Right click, and choose "Add Member Function".

4.

For the Function Type enter "void".

5.

For the Function Declaration enter " StatusBarDisplay(LPSTR pszMsg)".

6.

Select the "Public" radio button.

7.

Click OK button.

8.

Add the following code to the newly created member function StatusBarDisplay():

void CMainFrame::StatusBarDisplay(LPTSTR pszMsg)
{
   m_wndStatusBar.SetPaneText(0, pszMsg, TRUE);
}

9.

Click to open the "MyVectorWindow" branch in the project workspace.

10.

Double click any of the MyVectorWindow member functions to open the file "MyVectorWindow.cpp".

11.

Add the following two lines after #include "MyVectorWindow.h":

#include "MainFrm.h"
extern CTutorialApp theApp;

12.

Click the "Class View" tab of the project workspace.

13.

Double click the MsgProcCallBack() member function of the MyVectorWindow class.

14.

Add the following variables local to MsgProcCallBack():

POINT pt;
L_INT nRet;
LVectorObject Object;
L_TCHAR szBuffer[200];
VECTORPEN Pen;

15.

Immediately before the "case WM_CHAR" line, add the following code:

case WM_MOUSEMOVE:
      // hit test object under mouse cursor
      pt.x = LOWORD( lParam );
      pt.y = HIWORD( lParam );
      nRet = HitTest(&pt, &Object );
      if( nRet == SUCCESS )
      {
         // theres an object, show its type in main window caption
         switch( Object.GetType() )
         {
         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") );
            
      ((CMainFrame *)(theApp.GetMainWnd()))->StatusBarDisplay(szBuffer);
      break;
      
   case WM_LBUTTONDOWN:
      // hit test object under mouse cursor
      pt.x = LOWORD( lParam );
      pt.y = HIWORD( lParam );
      nRet = HitTest(&pt, &Object );
      if( nRet == SUCCESS )
      {
         // theres an object, flip its pen width between 1 and 4
         Object.GetObjectAttributes(NULL, &Pen, NULL, NULL );
         Pen.NewPen.LogPen.lopnWidth.x = ( Pen.NewPen.LogPen.lopnWidth.x == 1 ) ? 4 : 1;
         Object.SetObjectAttributes(NULL, &Pen, NULL, NULL);
      }
      break;
      
   case WM_RBUTTONDOWN:
      // hit test object under mouse cursor
      pt.x = LOWORD( lParam );
      pt.y = HIWORD( lParam );
      nRet = HitTest(&pt, &Object );
      if( nRet == SUCCESS )
      {
         // there is an object, delete it
         Object.DeleteObject();
      }
   break;

16.

Compile and run the demo.

17.

From the program menu, browse to the "images" folder of your LEAD installation. Open the image random.dxf and click OK.

18.

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