//BoxSide.c #include "BoxSide.h" #include "annotate.h" #include "utils.h" #include "limits.h" // CP# means Control Point or Handle // // HANDLE_ID_HORIZONTAL_TOP // ********************************* // * * // * * // HANDLE_ID_VERTICAL_LEFT * * HANDLE_ID_VERTICAL_RIGHT // * * // * * // ********************************* // HANDLE_ID_HORIZONTAL_BOTTOM //************************************************************************************** // // Functions for BoxSide // //************************************************************************************* L_VOID BoxSide_AddHandle(HANNOBJECT hObject, ANNPOINT apt0, ANNPOINT apt1, 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.x = (apt0.x + apt1.x) / 2; AnnHandle.aptContainer.y = (apt0.y + apt1.y) / 2; AnnHandle.nID = pHandleDef->nID; AnnHandle.crFill = pHandleDef->crFill; AnnHandle.uFlags = uFlags; L_AnnAddUserHandle(hObject, &AnnHandle); } #define BOXSIDE_NUMPOINTS 4 HANDLEDEF BoxSide_HandleDef[BOXSIDE_NUMPOINTS] = { HANDLE_ID_HORIZONTAL_TOP, ANNHANDLE_SHAPE_CIRCLE, RGB(0,0,0), HANDLE_ID_VERTICAL_RIGHT, ANNHANDLE_SHAPE_CIRCLE, RGB(128,128,128), HANDLE_ID_HORIZONTAL_BOTTOM, ANNHANDLE_SHAPE_CIRCLE, RGB(255,0,0), HANDLE_ID_VERTICAL_LEFT, ANNHANDLE_SHAPE_CIRCLE, RGB(0,255,0), }; // BoxSide_AddUserHandles L_VOID BoxSide_AddUserHandles(HANNOBJECT hRect) { ANNRECT arcRect; ANNPOINT apt0, apt1; L_AnnGetRect(hRect, &arcRect, NULL); apt0.x = arcRect.left; apt0.y = arcRect.top; apt1.x = arcRect.right; apt1.y = arcRect.top; BoxSide_AddHandle(hRect, apt0, apt1, BoxSide_HandleDef + 0); apt0.x = arcRect.right; apt0.y = arcRect.top; apt1.x = arcRect.right; apt1.y = arcRect.bottom; BoxSide_AddHandle(hRect, apt0, apt1, BoxSide_HandleDef + 1); apt0.x = arcRect.left; apt0.y = arcRect.bottom; apt1.x = arcRect.right; apt1.y = arcRect.bottom; BoxSide_AddHandle(hRect, apt0, apt1, BoxSide_HandleDef + 2); apt0.x = arcRect.left; apt0.y = arcRect.top; apt1.x = arcRect.left; apt1.y = arcRect.bottom; BoxSide_AddHandle(hRect, apt0, apt1, BoxSide_HandleDef + 3); } #define BOXSIDE_DIST 4; L_VOID BoxSide_RestrictPoint(LPCHILDDATA pData, HANNOBJECT hRect) { RECT rcClip; ANNRECT arcContainer; ANNRECT arcRect; RECT rcRect; GetClipCursor(&pData->rcOldClip); 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_HORIZONTAL_TOP: rcClip.bottom = rcRect.bottom - BOXSIDE_DIST; break; case HANDLE_ID_HORIZONTAL_BOTTOM: rcClip.top = rcRect.top + BOXSIDE_DIST; break; case HANDLE_ID_VERTICAL_LEFT: rcClip.right = rcRect.right - BOXSIDE_DIST; break; case HANDLE_ID_VERTICAL_RIGHT: rcClip.left = rcRect.left + BOXSIDE_DIST; break; } L_AnnRestrictCursor(pData->hContainer, &rcClip, NULL, NULL, FALSE); } // L_VOID BoxSide_Handle_LButtonDown(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { pData->ptStart = pMousePos->pt; switch (pData->nUserHandleID) { case HANDLE_ID_VERTICAL_LEFT: case HANDLE_ID_VERTICAL_RIGHT: case HANDLE_ID_HORIZONTAL_TOP: case HANDLE_ID_HORIZONTAL_BOTTOM: pData->ptStart = pMousePos->pt; L_AnnDefine(pData->hObjectChange, &pMousePos->pt, ANNDEFINE_BEGINRESIZE); BoxSide_RestrictPoint( pData, pData->hObjectChange); break; } } L_VOID BoxSide_Handle_MouseMove(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { POINT ptMove = pMousePos->pt; switch (pData->nUserHandleID) { case HANDLE_ID_VERTICAL_RIGHT: case HANDLE_ID_VERTICAL_LEFT: ptMove.y = pData->ptStart.y; break; case HANDLE_ID_HORIZONTAL_BOTTOM: case HANDLE_ID_HORIZONTAL_TOP: ptMove.x = pData->ptStart.x; break; } L_AnnDefine(pData->hObjectChange, &ptMove, ANNDEFINE_APPEND); pMousePos->fUpdatePos = FALSE; } L_VOID BoxSide_Handle_LButtonUp(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { POINT ptMove; ptMove = pMousePos->pt; switch (pData->nUserHandleID) { case HANDLE_ID_VERTICAL_RIGHT: case HANDLE_ID_VERTICAL_LEFT: ptMove.y = pData->ptStart.y; break; case HANDLE_ID_HORIZONTAL_BOTTOM: case HANDLE_ID_HORIZONTAL_TOP: ptMove.x = pData->ptStart.x; break; } L_AnnDefine(pData->hObjectChange, &ptMove, ANNDEFINE_END); } //*************** BoxSide Create functions L_VOID BoxSide_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 BoxSide_MouseMove(LPCHILDDATA pData) { L_AnnDefine(pData->hRect, &pData->ptMove, ANNDEFINE_UPDATE); } L_VOID BoxSide_LButtonUp(LPCHILDDATA pData, L_UINT uTool) { // Finish creating the rectangle L_AnnDefine(pData->hRect, &pData->ptEnd, ANNDEFINE_END); HideDefaultHandles(pData->hRect); BoxSide_AddUserHandles(pData->hRect); L_AnnSetSelected(pData->hRect, 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(pData->hRect, uTool, 0); }