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 17\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.