//BoxEightCorner.c #include "BoxEightCorner.h" #include "annotate.h" #include "utils.h" #include "limits.h" // CP# means Control Point or Handle // // // // CP0 CP1 // ************************* // * * // * * // * * // CP7 * * CP2 // * CP5 CP4 * // * ***************** * // * * * * // * * * * // * * * * // CP6 * * CP3 //************************************************************************************** // // Functions for BoxEightCorner // //************************************************************************************* L_VOID BoxEightCorner_AddHandle(HANNOBJECT hObject, ANNPOINT apt, pHANDLEDEF pHandleDef) { ANNHANDLE AnnHandle; L_UINT uFlags = ANNHANDLE_LOCATION | ANNHANDLE_CONTAINER_COORDINATES | ANNHANDLE_ID | ANNHANDLE_PEN_COLOR | ANNHANDLE_FILL_COLOR | ANNHANDLE_SHAPE; AnnHandle.uStructSize = sizeof(ANNHANDLE); AnnHandle.nShape = pHandleDef->nShape; AnnHandle.crPen = RGB(0,0,0); AnnHandle.hCursor= NULL; AnnHandle.aptContainer = apt; AnnHandle.nID = pHandleDef->nID; AnnHandle.crFill = pHandleDef->crFill; AnnHandle.bVisible = TRUE; AnnHandle.uFlags = uFlags; L_AnnAddUserHandle(hObject, &AnnHandle); } #define BOXEIGHTCORNER_NUMPOINTS 8 HANDLEDEF BoxEightCorner_HandleDef[BOXEIGHTCORNER_NUMPOINTS] = { HANDLE_ID_CP7, ANNHANDLE_SHAPE_CIRCLE, RGB(0,255,255), HANDLE_ID_CP0, ANNHANDLE_SHAPE_CIRCLE, RGB(0,0,0), HANDLE_ID_CP1, ANNHANDLE_SHAPE_CIRCLE, RGB(128,128,128), HANDLE_ID_CP2, ANNHANDLE_SHAPE_CIRCLE, RGB(255,0,0), HANDLE_ID_CP3, ANNHANDLE_SHAPE_CIRCLE, RGB(0,255,0), HANDLE_ID_CP4, ANNHANDLE_SHAPE_CIRCLE, RGB(0,0,255), HANDLE_ID_CP5, ANNHANDLE_SHAPE_CIRCLE, RGB(255,255,0), HANDLE_ID_CP6, ANNHANDLE_SHAPE_CIRCLE, RGB(255,0,255), }; // BoxEightCorner_AddUserHandles L_VOID BoxEightCorner_AddUserHandles(HANNOBJECT hPoly) { ANNPOINT aptPoly[BOXEIGHTCORNER_NUMPOINTS]; L_INT i; L_AnnGetPoints(hPoly, aptPoly); for (i=0; ircOldClip); rcClip = pData->rcOldClip; // L_AnnGetRect(hRect, &arcRect, NULL); L_AnnConvert(pData->hContainer, (LPPOINT)&rcRect, (pANNPOINT)&arcRect, 2, ANNCONVERT_TO_CLIENT); L_AnnGetRect(pData->hContainer, &arcContainer, NULL); L_AnnConvert(pData->hContainer, (LPPOINT)&rcClip, (pANNPOINT)&arcContainer, 2, ANNCONVERT_TO_CLIENT); switch(pData->nUserHandleID) { case HANDLE_ID_CP0: GetHandleInfo(hRect, HANDLE_ID_CP1, &pt1, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP7, &pt7, NULL, NULL); rcClip.right = pt1.x - BOXEIGHTCORNER_DIST; rcClip.left = pt7.x + BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP1: GetHandleInfo(hRect, HANDLE_ID_CP0, &pt0, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP2, &pt2, NULL, NULL); rcClip.left = pt0.x + BOXEIGHTCORNER_DIST; rcClip.right = pt2.x - BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP2: GetHandleInfo(hRect, HANDLE_ID_CP1, &pt1, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP3, &pt3, NULL, NULL); rcClip.left = pt1.x + BOXEIGHTCORNER_DIST; rcClip.bottom = pt3.y - BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP3: GetHandleInfo(hRect, HANDLE_ID_CP2, &pt2, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP4, &pt4, NULL, NULL); rcClip.top = pt2.y + BOXEIGHTCORNER_DIST; rcClip.left = pt4.x + BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP4: GetHandleInfo(hRect, HANDLE_ID_CP3, &pt3, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP5, &pt5, NULL, NULL); rcClip.left = pt5.x + BOXEIGHTCORNER_DIST; rcClip.right = pt3.x - BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP5: GetHandleInfo(hRect, HANDLE_ID_CP4, &pt4, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP6, &pt6, NULL, NULL); rcClip.left = pt6.x + BOXEIGHTCORNER_DIST; rcClip.right = pt4.x - BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP6: GetHandleInfo(hRect, HANDLE_ID_CP5, &pt5, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP7, &pt7, NULL, NULL); rcClip.top = pt7.y + BOXEIGHTCORNER_DIST; rcClip.right = pt5.x - BOXEIGHTCORNER_DIST; break; case HANDLE_ID_CP7: GetHandleInfo(hRect, HANDLE_ID_CP0, &pt0, NULL, NULL); GetHandleInfo(hRect, HANDLE_ID_CP6, &pt6, NULL, NULL); rcClip.right = pt0.x - BOXEIGHTCORNER_DIST; rcClip.bottom = pt6.y - BOXEIGHTCORNER_DIST; break; } L_AnnRestrictCursor(pData->hContainer, &rcClip, NULL, NULL, FALSE); } // L_VOID BoxEightCorner_Handle_LButtonDown(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { pData->ptStart = pMousePos->pt; switch (pData->nUserHandleID) { case HANDLE_ID_CP0: case HANDLE_ID_CP1: case HANDLE_ID_CP2: case HANDLE_ID_CP3: case HANDLE_ID_CP4: case HANDLE_ID_CP5: case HANDLE_ID_CP6: case HANDLE_ID_CP7: pData->ptStart = pMousePos->pt; L_AnnDefine(pData->hObjectChange, &pMousePos->pt, ANNDEFINE_BEGINMOVEPOINT); BoxEightCorner_RestrictPoint( pData, pData->hObjectChange); break; } } L_VOID BoxEightCorner_Handle_MouseMove(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { POINT ptMove = pMousePos->pt; L_AnnDefine(pData->hObjectChange, &ptMove, ANNDEFINE_APPEND); pMousePos->fUpdatePos = FALSE; } L_VOID BoxEightCorner_Handle_LButtonUp(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { POINT ptMove = pMousePos->pt; L_AnnDefine(pData->hObjectChange, &ptMove, ANNDEFINE_END); MoveHandle(pData->hObjectChange, pData->nUserHandleID, pMousePos->pt); } //*************** BoxEightCorner Create functions L_VOID BoxEightCorner_LButtonDown(HWND hWnd, LPCHILDDATA pData) { L_AnnAddUndoNode(pData->hAutomation); L_AnnCreateItem(pData->hContainer, ANNOBJECT_RECT, TRUE, &pData->hRect); L_AnnDefine(pData->hRect, &pData->ptStart, ANNDEFINE_BEGINSET); pData->fCapture = TRUE; L_AnnRestrictCursor(pData->hContainer, NULL, NULL, &pData->rcOldClip,TRUE); } L_VOID BoxEightCorner_MouseMove(LPCHILDDATA pData) { L_AnnDefine(pData->hRect, &pData->ptMove, ANNDEFINE_UPDATE); } L_VOID BoxEightCorner_LButtonUp(LPCHILDDATA pData, L_UINT uTool) { HANNOBJECT hPoly; ANNRECT arcRect; ANNPOINT aptPoly[8]; L_DOUBLE dWidth; // initial distance between (CP0, CP1) or (CP1, CP2) etc. // Finish creating the rectangle L_AnnDefine(pData->hRect, &pData->ptEnd, ANNDEFINE_END); // Get the bounds in container coordinates L_AnnGetRect(pData->hRect, &arcRect, NULL); // Delete the rectangle and create a polygon L_AnnRemove(pData->hRect); L_AnnDestroy(pData->hRect, 0); // Create the polygon by defining the four vertices L_AnnCreateItem(pData->hContainer, ANNOBJECT_POLYGON, FALSE, &hPoly); dWidth = (arcRect.right - arcRect.left) / 3; aptPoly[0].x = arcRect.left; aptPoly[0].y = arcRect.top; aptPoly[1] = aptPoly[0]; aptPoly[1].x += dWidth; aptPoly[2] = aptPoly[1]; aptPoly[2].x += dWidth; aptPoly[3] = aptPoly[2]; aptPoly[3].x += dWidth; aptPoly[4] = aptPoly[3]; aptPoly[4].y = arcRect.bottom; aptPoly[5] = aptPoly[2]; aptPoly[5].y = arcRect.bottom; aptPoly[6] = aptPoly[1]; aptPoly[6].y = arcRect.bottom; aptPoly[7] = aptPoly[0]; aptPoly[7].y = arcRect.bottom; L_AnnSetPoints(hPoly, aptPoly, 8); L_AnnSetVisible(hPoly, TRUE, 0, NULL); HideDefaultHandles(hPoly); BoxEightCorner_AddUserHandles(hPoly); L_AnnSetSelected(hPoly, TRUE, 0); // set the default settings from the automation object, and group the objects L_AnnSetAutoDefaults(pData->hAutomation, pData->hContainer, ANNFLAG_SELECTED|ANNFLAG_RECURSE); AnnSetID(hPoly, uTool, 0); }