Specifies the shape when creating or transforming an annotation object. This function specifies one point in the current window each time it is called.
#include "l_bitmap.h"
L_LTANN_API L_INT L_AnnDefine2(hObject, apt, uState)
Handle to the annotation object.
Pointer to an ANNPOINT structure. The specified point is in container coordinates.
State of the process of modifying the annotation object. Possible values are:
| Value | Meaning |
|---|---|
| ANNDEFINE_SETANCHORPOINT | [13] This is an anchor point. Use this value when rotating an annotation object around a point other than its center. When doing this, call L_AnnDefine2 with this flag set prior to calling L_AnnDefine2 with the ANNDEFINE_BEGINROTATE flag set. |
| ANNDEFINE_BEGINMOVEPOINT | [11] This is a starting point, used when moving one point on an annotation object. This can be used to move a single point on any of the following annotation objects: |
| ANNOBJECT_LINE | |
| ANNOBJECT_POLYLINE | |
| ANNOBJECT_POLYGON | |
| ANNOBJECT_POINTER | |
| ANNOBJECT_FREEHAND | |
| ANNOBJECT_FREEHANDHOTSPOT | |
| ANNOBJECT_RULER | |
| ANNOBJECT_CROSSPRODUCT | |
| ANNOBJECT_PROTRACTOR | |
| ANNOBJECT_CURVE | |
| ANNOBJECT_CURVECLOSED | |
| You can use ANNDEFINE_BEGINMOVEPOINT to perform a simultaneous rotate and resize for the following objects: | |
| (Note that you must set an anchor point prior to using ANNDEFINE_BEGINMOVEPOINT) | |
| ANNOBJECT_RECT | |
| ANNOBJECT_ELLIPSE | |
| ANNOBJECT_HILITE | |
| ANNOBJECT_REDACT | |
| ANNOBJECT_TEXT | |
| ANNOBJECT_NOTE | |
| ANNOBJECT_STAMP | |
| ANNOBJECT_HOTSPOT | |
| When doing this, call L_AnnDefine2 with the ANNDEFINE_SETANCHORPOINT flag set prior to calling L_AnnDefine2 with the ANNDEFINE_BEGINMOVEPOINT flag set. |
| Value | Meaning |
|---|---|
| SUCCESS | The function was successful. |
| < 1 | An error occurred. Refer to Return Codes. |
This function is used only with the following states:
If you try to use a uState value other than ANNDEFINE_SETANCHORPOINT or ANNDEFINE_BEGINMOVEPOINT, the function returns ERROR_INV_PARAMETER.
This function is similar to L_AnnDefine, except that L_AnnDefine2 takes a point in container coordinates, whereas L_AnnDefine takes a point in client coordinates.
Use this function when additional accuracy is required when setting an anchor point, or doing a simultaneous rotate and resize. This function should be used in conjunction with L_AnnDefine.
As an example, suppose you want to rotate and resize the rectangle around the anchor point aptAnchor by moving the point aptMove, as shown in the following figure:

This can be done by using only L_AnnDefine, but because L_AnnDefine takes integral arguments and aptAnchor and aptMove are not integral, the rotate and resize will not be exact.
To solve this and accurately perform simultaneous rotation and resizing, use L_AnnDefine2 and L_AnnDefine as follows:
ANNPOINT aptAnchor;ANNPOINT aptMove;aptMove.x = 10.2;aptMove.y = 10.5aptAnchor.x = 10.2;aptAnchor.y = 50.5ptLocation.x = 10;ptLocation.y = 20;L_AnnDefine2(hObject, &aptAnchor, ANNDEFINE_SETANCHORPOINT);L_AnnDefine2(hObject, &aptMove, ANNDEFINE_BEGINROTATE);// One or more ANNDEFINE_APPENDL_AnnDefine(pData->hObjectChange, &pMousePos->pt, ANNDEFINE_APPEND);L_AnnDefine(pData->hObjectChange, &pMousePos->pt, ANNDEFINE_END);
Win32, x64.
This example uses static variables to simulate user input to rotate/resize a rectangle around a point on the bottom center line of the rectangle.
Initially the rectangle must not be rotated.
L_INT AnnDefine2Example(HANNOBJECT hRect){L_INT nRet;// Counter for simulating user inputstatic L_INT nCallCount = 0;L_UINT uType;ANNRECT arcRect;ANNPOINT aptAnchor; // Anchor point in container coordinatesANNPOINT aptMove; // Move point in container coordinatesL_POINT ptMove; // Move point in client coordinatesL_DOUBLE dAngle;HANNOBJECT hContainer;nRet = L_AnnGetType(hRect, &uType);if (nRet != SUCCESS)return nRet;if (uType != ANNOBJECT_RECT){_tprintf(_T("%s"), TEXT("Error: Object must be a rectangle."));return FAILURE;}nRet = L_AnnGetRotateAngle(hRect, &dAngle);if (nRet != SUCCESS)return nRet;if (dAngle != 0){_tprintf(_T("%s"), TEXT("Error: Object must not be rotated."));return nRet;}++nCallCount;switch (nCallCount){case 1:nRet = L_AnnGetRect(hRect, &arcRect, NULL);if (nRet != SUCCESS)return nRet;aptAnchor.x = (arcRect.left + arcRect.right) / 2;aptAnchor.y = arcRect.bottom;aptMove.x = (arcRect.left + arcRect.right) / 2;aptMove.y = arcRect.top;nRet = L_AnnDefine2(hRect, &aptAnchor, ANNDEFINE_SETANCHORPOINT);if (nRet != SUCCESS)return nRet;nRet = L_AnnDefine2(hRect, &aptMove, ANNDEFINE_BEGINMOVEPOINT);if (nRet != SUCCESS)return nRet;_tprintf(_T("%s"), TEXT("Call ExampleAnnDefine2 to complete the rotate/resize."));break;case 2:nRet = L_AnnGetRect(hRect, &arcRect, NULL);if (nRet != SUCCESS)return nRet;aptMove.x = arcRect.right;aptMove.y = arcRect.top;nRet = L_AnnGetTopContainer(hRect, &hContainer);if (nRet != SUCCESS)return nRet;nRet = L_AnnConvert(hContainer, &ptMove, &aptMove, 1, ANNCONVERT_TO_CLIENT);if (nRet != SUCCESS)return nRet;nRet = L_AnnDefine(hRect, &ptMove, ANNDEFINE_END);if (nRet != SUCCESS)return nRet;nCallCount = 0;_tprintf(_T("%s"), TEXT("Rotate/resize finished!"));break;}return SUCCESS;}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
