LEADTOOLS Raster Imaging C DLL Help > Getting Started > For Beginners > Implementing an Automated Annotation Program |
Take the following steps to create and run a program that implements automated annotations. Remember, the purpose of the annotation tutorials is to provide you a quick and easy way to generate an annotation program. For more in depth annotation programming, refer to the Annotate demo.
1. |
Create a new directory in the LEADTOOLS 18\Examples\CDLL directory called AnnAuto. |
2. |
Copy everything in the LoadSave directory into the AnnAuto directory. |
3. |
Compile the project as is and run LoadSave.exe to familiarize yourself with the basic program. |
4. |
Open the imports.cpp file and make the additions shown in green : |
#if defined(WIN64)
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltkrn_x.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltdis_x.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltfil_x.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltdlgkrn_x.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltdlgfile_x.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltann_x.lib")
#else
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltkrn_u.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltdis_u.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltfil_u.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltdlgkrn_u.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltdlgfile_u.lib")
#pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltann_u.lib")
#endif // #if defined(WIN64)
5. |
Define the following global variables in Loadsave.cpp : |
HANNOBJECT hContainer = 0; // Container annotation object
HANNOBJECT hAutomation = 0; // Automation object
HWND hWndToolbar = 0; // Window for the annotation toolbar
6. |
In Window_OnCreate in LoadSave.cpp, add the following code before "return (TRUE);" : |
// Create the annotation toolbar and position its top left corner at 0,0
POINT ToolbarPt = {0,0};
L_AnnCreateToolBar(hWnd, &ToolbarPt, ANNTOOLALIGN_LEFT | ANNTOOLALIGN_TOP, TRUE, &hWndToolbar, 0, NULL);
7. |
After the Window_OnCreate function, add the following function: |
L_VOID SetupAnnotations(HWND hWnd)
{
// Delete any existing annotation container, automation objects
if(hAutomation)
{
L_AnnSetActiveState(hAutomation, ANNACTIVE_DISABLED);
L_AnnDestroy(hAutomation, ANNFLAG_NOINVALIDATE);
hAutomation = 0;
}
if(hContainer)
{
L_AnnDestroy(hContainer, ANNFLAG_NOINVALIDATE);
hContainer = 0;
}
// Create the automation object
L_AnnCreate(ANNOBJECT_AUTOMATION, &hAutomation);
// Set the dots per inch for interpreting physical measurements
L_AnnSetDpiX(hAutomation, 600, 0);
L_AnnSetDpiY(hAutomation, 600, 0);
// Set the number of possible undo actions
L_AnnSetUndoDepth(hAutomation, 3);
// Create the annotation container, which we will use as the root container
ANNRECT ContainerRect;
ContainerRect.left = 0;
ContainerRect.top = 0;
ContainerRect.right = BITMAPWIDTH(&Data.BitmapHandle) -1;
ContainerRect.bottom = BITMAPHEIGHT(&Data.BitmapHandle) - 1;
L_AnnCreateContainer(hWnd, &ContainerRect, TRUE, &hContainer);
// Set the scalars and offsets
L_AnnSetScalarX(hContainer, 1, 0);
L_AnnSetScalarY(hContainer, 1, 0);
L_AnnSetOffsetX(hContainer, (L_DOUBLE) 0, 0);
L_AnnSetOffsetY(hContainer, (L_DOUBLE) 0, 0);
// Assign the automation object to the container
L_AnnSetAutoContainer(hAutomation, hContainer);
// Enable the automation object
L_AnnSetActiveState(hAutomation, ANNACTIVE_ENABLED);
// Set design mode, which allows creation of annotations
L_AnnSetUserMode(hContainer, ANNUSER_DESIGN);
}
8. |
In the Window_OnCommand, add a call to SetupAnnotations() (shown in green ) |
case IDM_OPEN:
nRet = Get_OpenFile (hWnd);
if (nRet == 2)
; /* No file was selected for opening, so do nothing. */
else if (nRet == SUCCESS)
{
SetupAnnotations(hWnd);
FORWARD_WM_QUERYNEWPALETTE (hWnd, SendMessage);
}
else
{
wsprintf (buf, TEXT("Error %d Loading %s"), nRet,
(LPTSTR) Data.szFilename);
MessageBox (hWnd, buf, TEXT("Error"), MB_OK);
}
break;
9. |
In the Window_OnPaint function, call L_AnnDraw after the call to L_PaintDC |
L_AnnDraw(hdc, &ps.rcPaint, hContainer);
10. |
In the Window_OnDestroy function, add the following immediately before "/* Post WM_QUIT to end the application *" : |
// Cleanup for annotations
L_AnnDestroy(hContainer, ANNFLAG_NOINVALIDATE);
L_AnnDestroy(hAutomation, ANNFLAG_NOINVALIDATE);
11. |
Add the following case to the switch statement in the MainWndProc procedure: |
LRESULT CALLBACK MainWndProc (HWND hWnd, L_UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
HANDLE_MSG (hWnd, WM_CREATE, Window_OnCreate);
HANDLE_MSG (hWnd, WM_COMMAND, Window_OnCommand);
HANDLE_MSG (hWnd, WM_PALETTECHANGED, Window_OnPaletteChanged);
HANDLE_MSG (hWnd, WM_QUERYNEWPALETTE, Window_OnQueryNewPalette);
HANDLE_MSG (hWnd, WM_PAINT, Window_OnPaint);
HANDLE_MSG (hWnd, WM_DESTROY, Window_OnDestroy);
HANDLE_MSG (hWnd, WM_ACTIVATE, Window_OnActivate);
HANDLE_MSG (hWnd, WM_PALETTEISCHANGING, Window_OnPaletteChanging);
HANDLE_MSG (hWnd, WM_SYSCOLORCHANGE, Window_SysColorChange);
HANDLE_MSG (hWnd, WM_LTANNEVENT, Window_AnnEvent);
}
return DefWindowProc (hWnd, Message, wParam, lParam);
}
12. |
Add the code below for Window_AnnEvent immediately before the existing code for Window_OnPaint . |
LRESULT Window_AnnEvent(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(hWnd);
switch(wParam)
{
case LTANNEVENT_TOOLCHECKED:
L_AnnSetTool(hAutomation, (L_UINT)lParam);
break;
case LTANNEVENT_AUTOENDSET:
// Set tool back to ANNTOOL_SELECT after finished creating annotation
L_AnnSetToolBarChecked(hWndToolbar, ANNTOOL_SELECT);
break;
}
return 0;
}
13. |
Add a forward declaration at the very end of Loadsave.h |
LRESULT Window_AnnEvent(HWND hWnd, WPARAM wParam, LPARAM lParam);
14. |
On the Build menu, select Build LoadSave.exe. |
15. |
On the Debug menu, select Start Without Debugging. |
16. |
Save this project to use for testing other annotation code samples and for implementing the Using Automated Annotations in Run Mode tutorial. |