// HipMeasure.c #include "HipMeasure.h" #include #include "utils.h" //************************************************************************************** // // Functions for HipMeasure // //************************************************************************************* L_VOID HipMeasure_AddHandle(HANNOBJECT hObject, ANNPOINT aptLine[], pHANDLEDEF pHandleDef) { L_UINT uFlags = ANNHANDLE_LOCATION | ANNHANDLE_CONTAINER_COORDINATES | ANNHANDLE_ID | ANNHANDLE_PEN_COLOR | ANNHANDLE_FILL_COLOR | ANNHANDLE_SHAPE; ANNHANDLE AnnHandle; AnnHandle.uStructSize = sizeof(ANNHANDLE); AnnHandle.nShape = pHandleDef->nShape; AnnHandle.crPen = RGB(0,0,0); AnnHandle.hCursor= NULL; AnnHandle.aptContainer.x = (aptLine[0].x + aptLine[1].x) / 2; AnnHandle.aptContainer.y = (aptLine[0].y + aptLine[1].y) / 2; AnnHandle.nID = pHandleDef->nID; AnnHandle.crFill = pHandleDef->crFill; AnnHandle.uFlags = uFlags; L_AnnAddUserHandle(hObject, &AnnHandle); } #define HIPMEASURE_NUMPOINTS 2 HANDLEDEF HipMeasure_HandleDef[HIPMEASURE_NUMPOINTS] = { HANDLE_ID_CP0, ANNHANDLE_SHAPE_CIRCLE, RGB(0,0,0), HANDLE_ID_CP1, ANNHANDLE_SHAPE_CIRCLE, RGB(255,0,128), }; L_VOID HipMeasure_AddUserHandles(HANNOBJECT hObject) { L_INT nCount; ANNPOINT aptLine[2]; HANNOBJECT AnnObjectNeighbors[2]; // this object is made of two lines AnnGetNeighborObjects(hObject, AnnObjectNeighbors, &nCount); AnnSortNeighborObjects(hObject, AnnObjectNeighbors, nCount); // Horizontal line -- swap so that aptLine[0] is to the left aptLine[1] L_AnnGetPoints(AnnObjectNeighbors[0], aptLine); if (aptLine[0].x > aptLine[1].x) SwapAnnPoints(aptLine + 0, aptLine + 1); HipMeasure_AddHandle(AnnObjectNeighbors[0], aptLine, HipMeasure_HandleDef + 0); // Vertical line -- swap so that aptLine[0] is above aptLine[1] L_AnnGetPoints(AnnObjectNeighbors[1], aptLine); if (aptLine[0].y > aptLine[1].y) SwapAnnPoints(aptLine + 0, aptLine + 1); HipMeasure_AddHandle(AnnObjectNeighbors[1], aptLine, HipMeasure_HandleDef + 1); } //*************** HipMeasure Create functions HANNOBJECT HipMeasure_CreateLine(HANNOBJECT hContainer, POINT pt0, POINT pt1, L_UINT uTool, L_INT nID) { HANNOBJECT hLine; L_AnnCreateItem(hContainer, ANNOBJECT_LINE, FALSE, &hLine); L_AnnDefine(hLine, &pt0, ANNDEFINE_BEGINSET); L_AnnDefine(hLine, &pt1, ANNDEFINE_END); AnnSetID(hLine, uTool, nID); //Set tag to identify line 0,1,2 L_AnnSetVisible(hLine, TRUE, 0, NULL); L_AnnSetSelected(hLine, TRUE, 0); HideDefaultHandles(hLine); return hLine; } L_VOID HipMeasure_LButtonDown(HWND hWnd, LPCHILDDATA pData) { L_AnnAddUndoNode(pData->hAutomation); L_AnnCreateItem(pData->hContainer, ANNOBJECT_RECT, TRUE, &pData->ObjectHipMeasure.hRect); L_AnnDefine(pData->ObjectHipMeasure.hRect, &pData->ptStart, ANNDEFINE_BEGINSET); pData->fCapture = TRUE; L_AnnRestrictCursor(pData->hContainer, NULL, NULL, &pData->rcOldClip, TRUE); } L_VOID HipMeasure_MouseMove(LPCHILDDATA pData) { L_AnnDefine(pData->ObjectHipMeasure.hRect, &pData->ptMove, ANNDEFINE_UPDATE); } L_VOID HipMeasure_LButtonUp(LPCHILDDATA pData, L_UINT uTool) { ANNPOINT apt; L_DOUBLE dWidth; L_DOUBLE dHeight; ANNRECT arcRect; HANNOBJECT hPoint; L_AnnDefine(pData->ObjectHipMeasure.hRect, &pData->ptEnd, ANNDEFINE_END); HideDefaultHandles(pData->ObjectHipMeasure.hRect); AnnSetID(pData->ObjectHipMeasure.hRect, uTool, 0); //Set tag to identify line 0,1,2 L_AnnSetSelected(pData->ObjectHipMeasure.hRect, TRUE, 0); L_AnnGetRect(pData->ObjectHipMeasure.hRect, &arcRect, NULL); L_AnnCreateItem(pData->hContainer, ANNOBJECT_POINT, TRUE, &hPoint); dWidth = arcRect.right - arcRect.left; dHeight = arcRect.bottom - arcRect.top; apt.y = arcRect.top + 0.25 * (dHeight); if (pData->ObjectHipMeasure.nType == HIP_MEASURE_RIGHT) apt.x = arcRect.left + 0.75*dWidth; else apt.x = arcRect.left + 0.25*dWidth; L_AnnSetPoints(hPoint, &apt, 1); L_AnnSetBitmap(hPoint, &BitmapPoint, 0); L_AnnSetTransparent(hPoint, TRUE, 0); AnnSetID(hPoint, uTool, 1); //Set tag to identify line 0,1,2 L_AnnSetSelected(hPoint, TRUE, 0); HideDefaultHandles(hPoint); // set the default settings from the automation object, and group the objects L_AnnSetAutoDefaults(pData->hAutomation, pData->hContainer, ANNFLAG_SELECTED|ANNFLAG_RECURSE); L_AnnGroup(pData->hContainer, ANNFLAG_SELECTED|ANNFLAG_RECURSE, NULL); } //*************** HipMeasure Update functions L_VOID HipMeasure_Handle_LButtonDown(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { // No handles! } L_VOID HipMeasure_Handle_MouseMove(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { // No handles! } L_VOID HipMeasure_Handle_LButtonUp(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { // No handles! } //*************** HipMeasure Misc functions L_VOID HipMeasure_ClipCursor(LPCHILDDATA pData, HANNOBJECT hObject, POINT ptStart, L_BOOL bRestore) { L_INT32 nCount; ANNRECT arcBounds; RECT rcBounds; AnnGetNeighborObjects( hObject, pData->AnnObjectNeighbors, &nCount); AnnSortNeighborObjects(hObject, pData->AnnObjectNeighbors, nCount); // Restrict only the box--the line is unrestricted GetBoundingBox(pData->AnnObjectNeighbors, 1, &arcBounds); L_AnnConvert(pData->hContainer, (LPPOINT)&rcBounds, (pANNPOINT)&arcBounds, 2, ANNCONVERT_TO_CLIENT); L_AnnRestrictCursor(pData->hContainer, &rcBounds, &ptStart, &pData->rcOldClip, FALSE); }