Collecting Container Events
Start with the project you created in Using Container objects
1. |
Add the following callback function before the OnOpen function definition: |
L_VOID ConvertFloatToString (L_INT flt, L_TCHAR szBuff[], L_INT nPrecise)
{
L_INT left, right;
TCHAR lChar[10] = TEXT("\0");
TCHAR rChar[10] = TEXT("\0");
L_INT nPercentage;
nPercentage = (L_INT)pow((L_DOUBLE) 10, (L_DOUBLE) nPrecise);
left = flt / nPercentage;
if (left)
right = abs(flt % (left * nPercentage));
else
right = abs(flt);
wsprintf(lChar, TEXT("%d"), left);
if (right > 9)
wsprintf(rChar, TEXT("%d"), right);
else
wsprintf(rChar, TEXT("0%d"), right);
wsprintf(szBuff, TEXT("%s.%s"), lChar, rChar);
}
L_INT EXT_CALLBACK LeadContainerProc
(
pCONTAINERHANDLE pContainer,
CONTAINEREVENTTYPE nEventType,
L_VOID *pEventData,
L_VOID *pUserData
)
{
pCONTAINEROBJECTDATA pContainerObjectData = ( pCONTAINEROBJECTDATA ) pEventData ;
L_TCHAR pszState [ 80 ] ;
L_TCHAR buffer [ 500 ] ;
HWND hwndOwner ;
L_TCHAR xP1[10]; memset(xP1, 0, 10);
L_TCHAR yP1[10]; memset(yP1, 0, 10);
L_TCHAR xP2[10]; memset(xP2, 0, 10);
L_TCHAR yP2[10]; memset(yP2, 0, 10);
L_TCHAR xP3[10]; memset(xP3, 0, 10);
L_TCHAR yP3[10]; memset(yP3, 0, 10);
L_TCHAR xP4[10]; memset(xP4, 0, 10);
L_TCHAR yP4[10]; memset(yP4, 0, 10);
switch ( pContainerObjectData->fState )
{
case CONTAINER_STATE_BEGIN:
lstrcpy ( pszState, TEXT("Begin, ") ) ;
break ;
case CONTAINER_STATE_PROCESS:
lstrcpy ( pszState, TEXT("Process, ") ) ;
break ;
case CONTAINER_STATE_END:
lstrcpy ( pszState, TEXT("End, ") ) ;
break ;
case CONTAINER_STATE_ABORT:
lstrcpy ( pszState, TEXT("Abort, ") ) ;
break ;
}
switch ( nEventType )
{
case CONTAINER_EVENT_TYPE_DRAW:
{
switch ( pContainerObjectData->nObjectType )
{
// process the point object events
case CONTAINER_OBJECT_TYPE_POINT:
{
CONTAINERPOINTDATA PointData ;
PointData = * ( ( pCONTAINERPOINTDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (PointData.vptPoint.x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (PointData.vptPoint.y * 1000), yP1, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s)"),
TEXT("Point: "),
pszState,
xP1,
yP1 ) ;
}
break ;
// process the line object events
case CONTAINER_OBJECT_TYPE_LINE:
{
CONTAINERLINEDATA LineData ;
LineData = * ( ( pCONTAINERLINEDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (LineData.vptLine[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (LineData.vptLine[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (LineData.vptLine[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (LineData.vptLine[1].y * 1000), yP2, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s)"),
TEXT("Line: "),
pszState,
xP1,
yP1,
xP2,
yP2 ) ;
}
break ;
// process the square object events
case CONTAINER_OBJECT_TYPE_SQUARE:
{
CONTAINERSQUAREDATA SquareData ;
SquareData = * ( ( pCONTAINERSQUAREDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (SquareData.vptSquare[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (SquareData.vptSquare[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (SquareData.vptSquare[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (SquareData.vptSquare[1].y * 1000), yP2, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s)"),
TEXT("Square: "),
pszState,
xP1,
yP1,
xP2,
yP2 ) ;
}
break ;
// process the rectangle object events
case CONTAINER_OBJECT_TYPE_RECT:
{
CONTAINERRECTDATA RectData ;
RectData = * ( ( pCONTAINERRECTDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (RectData.vptRect[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (RectData.vptRect[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (RectData.vptRect[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (RectData.vptRect[1].y * 1000), yP2, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s)"),
TEXT("Rect: "),
pszState,
xP1,
yP1,
xP2,
yP2 ) ;
}
break ;
// process the circle object events
case CONTAINER_OBJECT_TYPE_CIRCLE:
{
CONTAINERCIRCLEDATA CircleData ;
CircleData = * ( ( pCONTAINERCIRCLEDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (CircleData.vptCircle[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (CircleData.vptCircle[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (CircleData.vptCircle[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (CircleData.vptCircle[1].y * 1000), yP2, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s)"),
TEXT("Circle: "),
pszState,
xP1,
yP1,
xP2,
yP2 ) ;
}
break ;
// process the ellipse object events
case CONTAINER_OBJECT_TYPE_ELLIPSE:
{
CONTAINERELLIPSEDATA EllipseData ;
EllipseData = * ( ( pCONTAINERELLIPSEDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (EllipseData.vptEllipse[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (EllipseData.vptEllipse[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (EllipseData.vptEllipse[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (EllipseData.vptEllipse[1].y * 1000), yP2, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s)"),
TEXT("Ellipse: "),
pszState,
xP1,
yP1,
xP2,
yP2 ) ;
}
break ;
// process the polyline object events
case CONTAINER_OBJECT_TYPE_POLYLINE:
{
CONTAINERPOLYLINEDATA PolylineData ;
PolylineData = * ( ( pCONTAINERPOLYLINEDATA ) ( pContainerObjectData->pObjectData ) ) ;
wsprintf ( buffer,
TEXT("%s %s %d"),
TEXT("Polyline: "),
pszState,
PolylineData.nPointCount ) ;
}
break ;
// process the bezier object events
case CONTAINER_OBJECT_TYPE_BEZIER:
{
CONTAINERBEZIERDATA BezierData ;
BezierData = * ( ( pCONTAINERBEZIERDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (BezierData.vptBezier[0].x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[0].y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[1].x * 1000), xP2, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[1].y * 1000), yP2, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[2].x * 1000), xP3, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[2].y * 1000), yP3, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[3].x * 1000), xP4, 3);
ConvertFloatToString((L_INT) (BezierData.vptBezier[3].y * 1000), yP4, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) (%s, %s) (%s, %s) (%s, %s)"),
TEXT("Bezier: "),
pszState,
xP1,
yP1,
xP2,
yP2,
xP3,
yP3,
xP4,
yP4 ) ;
}
break ;
// process the arc object events
case CONTAINER_OBJECT_TYPE_ARC:
{
CONTAINERARCDATA ArcData ;
ArcData = * ( ( pCONTAINERARCDATA ) ( pContainerObjectData->pObjectData ) ) ;
ConvertFloatToString((L_INT) (ArcData.vptCenter.x * 1000), xP1, 3);
ConvertFloatToString((L_INT) (ArcData.vptCenter.y * 1000), yP1, 3);
ConvertFloatToString((L_INT) (ArcData.Radius * 1000), xP2, 3);
ConvertFloatToString((L_INT) (ArcData.StartAngle * 1000), yP2, 3);
ConvertFloatToString((L_INT) (ArcData.SweepAngle * 1000), xP3, 3);
wsprintf ( buffer,
TEXT("%s %s (%s, %s) %s, %s, %s"),
TEXT("Arc: "),
pszState,
xP1,
yP1,
xP2,
yP2,
xP3 ) ;
}
break ;
// process the text object events
case CONTAINER_OBJECT_TYPE_TEXT:
{
CONTAINERTEXTDATA TextData ;
TextData = * ( ( pCONTAINERTEXTDATA ) ( pContainerObjectData->pObjectData ) ) ;
wsprintf ( buffer,
TEXT("%s %s %s (%d, %d) (%d, %d)"),
TEXT("Text: "),
pszState,
TextData.pszText,
TextData.rcText.left,
TextData.rcText.top,
TextData.rcText.right,
TextData.rcText.bottom ) ;
}
break ;
}
break ;
}
}
L_ContainerGetOwner ( pContainer, &hwndOwner ) ;
SetWindowText ( hwndOwner, buffer ) ;
return SUCCESS ;
}
2. |
Add the following function call to the WndProc function, just before the CheckMenuRadioItem function call in the WM_CREATE message: |
L_ContainerSetCallback ( pContainer, LeadContainerProc, NULL ) ;
3. |
Compile and run the project by selecting Build->Rebuild Solution from the menu, and then Debug->Start Without Debugging. |