Editing a Container Object

Start with the project you created in Collecting container events:

1.

Add the following popup menu structure to the main menu you created in Implementing the Container - Initializing, Creating and Freeing:

Edit &Object
&Line   with ID = IDM_EDITOBJECT_LINE
&Square   with ID = IDM_EDITOBJECT_SQUARE
&Rect   with ID = IDM_EDITOBJECT_RECT
&Circle   with ID = IDM_EDITOBJECT_CIRCLE
&Ellipse   with ID = IDM_EDITOBJECT_ELLIPSE
P&olyline   with ID = IDM_EDITOBJECT_POLYLINE
&Bezier   with ID = IDM_EDITOBJECT_BEZIER
&Arc   with ID = IDM_EDITOBJECT_ARC
&Text   with ID = IDM_EDITOBJECT_TEXT

2.

Add the following code to the WndProc function, just before the "return 0L ;" of the WM_CREATE message:

EnableMenuItem ( GetMenu ( hWnd ), 2, MF_BYPOSITION | MF_GRAYED ) ;

3.

Add the following lines to the WndProc function, after the EnableMenuItem function call in the "case IDM_FILE_OPEN" of the WM_COMMAND message:

EnableMenuItem ( GetMenu ( hWnd ), 2, MF_BYPOSITION | MF_ENABLED ) ;

4.

Add the following functions before the OnOpen function definition:

L_VOID OnEditObjectLine ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERLINEDATA LineData ;

   LineData.vptLine[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   LineData.vptLine[0].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ;
   LineData.vptLine[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   LineData.vptLine[1].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ; 

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_LINE ;
   Data.pObjectData = &LineData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectSquare ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERSQUAREDATA SquareData ;

   SquareData.vptSquare[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   SquareData.vptSquare[0].y = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   SquareData.vptSquare[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   SquareData.vptSquare[1].y = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_SQUARE ;
   Data.pObjectData = &SquareData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectRect ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERRECTDATA RectData ;

   RectData.vptRect[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   RectData.vptRect[0].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ;
   RectData.vptRect[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   RectData.vptRect[1].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ; 

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_RECT ;
   Data.pObjectData = &RectData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectCircle ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERCIRCLEDATA CircleData ;

   CircleData.vptCircle[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   CircleData.vptCircle[0].y = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   CircleData.vptCircle[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   CircleData.vptCircle[1].y = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_CIRCLE ;
   Data.pObjectData = &CircleData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectEllipse ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERELLIPSEDATA EllipseData ;

   EllipseData.vptEllipse[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   EllipseData.vptEllipse[0].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ;
   EllipseData.vptEllipse[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   EllipseData.vptEllipse[1].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ; 

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_ELLIPSE ;
   Data.pObjectData = &EllipseData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectPolyline ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERPOLYLINEDATA PolylineData ;
   VECTORPOINT vptPolyline [ 4 ] ; 

   vptPolyline[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   vptPolyline[0].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ; 
   vptPolyline[1].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   vptPolyline[1].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4; 
   vptPolyline[2].x = ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   vptPolyline[2].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   vptPolyline[3].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   vptPolyline[3].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ; 
   
   PolylineData.pvptPoints = vptPolyline ; 
   PolylineData.nPointCount = 4 ;
   
   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_POLYLINE ;
   Data.pObjectData = &PolylineData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectBezier ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERBEZIERDATA BezierData ;

   BezierData.vptBezier[0].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   BezierData.vptBezier[0].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4; 
   BezierData.vptBezier[1].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 2 ; 
   BezierData.vptBezier[1].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ;
   BezierData.vptBezier[2].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 2 ; 
   BezierData.vptBezier[2].y = ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4; 
   BezierData.vptBezier[3].x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   BezierData.vptBezier[3].y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4 ;
   
   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_BEZIER ;
   Data.pObjectData = &BezierData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectArc ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERARCDATA ArcData ;

   ArcData.vptCenter.x = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 2 ; 
   ArcData.vptCenter.y = ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 2 ; 
   ArcData.Radius = ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4 ; 
   ArcData.StartAngle = 10 ;
   ArcData.SweepAngle = 45 ;

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_ARC ;
   Data.pObjectData = &ArcData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

L_VOID OnEditObjectText ( pCONTAINERHANDLE pContainer, pBITMAPHANDLE pBitmap ) 
{
   CONTAINEROBJECTDATA Data ;
   CONTAINERTEXTDATA TextData ;

   TextData.pszText  = TEXT("LEAD TECHNOLOGIES, INC.") ;
   TextData.cbLength = lstrlen( TextData.pszText ) * sizeof (L_TCHAR);
   SetRect ( &TextData.rcText, 
             ( BITMAPWIDTH ( pBitmap ) - 1 ) / 4, 
             ( BITMAPHEIGHT ( pBitmap ) - 1 ) / 4, 
             ( ( BITMAPWIDTH ( pBitmap ) - 1 ) * 3 ) / 4, 
             ( ( BITMAPHEIGHT ( pBitmap ) - 1 ) * 3 ) / 4 ) ;

   // set the container object data 
   Data.nSize = sizeof ( CONTAINEROBJECTDATA ) ; 
   Data.nObjectType = CONTAINER_OBJECT_TYPE_TEXT ;
   Data.pObjectData = &TextData ; 

   // start editing an object
   // double click the left-mouse button to end editing
   // click right-mouse button to abort editing
   L_ContainerEditObject ( pContainer, &Data ) ;
}

5.

Add the following code to the WndProc function, after the statement "return 0L ;" of the case IDM_DRAWOBJECT_TEXT of the WM_COMMAND message:


case IDM_EDITOBJECT_LINE:
   OnEditObjectLine ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_SQUARE:
   OnEditObjectSquare ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_RECT:
   OnEditObjectRect ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_CIRCLE:
   OnEditObjectCircle ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_ELLIPSE:
   OnEditObjectEllipse ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_POLYLINE:
   OnEditObjectPolyline ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_BEZIER:
   OnEditObjectBezier ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_ARC:
   OnEditObjectArc ( pContainer, &hBitmap ) ;
   return 0L ;

case IDM_EDITOBJECT_TEXT:
   OnEditObjectText ( pContainer, &hBitmap ) ;
   return 0L ;

6.

Compile and run the project by selecting Build->Rebuild Solution from the menu, and then Debug->Start Without Debugging.