L_DispContainerGetActionCallBack

#include "ltivw.h"

L_LTIVW_API L_INT L_DispContainerGetActionCallBack(hCellWnd, ppfnCallBack, ppUserData)

HWND hCellWnd;

/* handle to the cell window */

DISPCONTAINERACTIONCALLBACK * ppfnCallBack;

/* pointer to be updated with the callback function */

LPVOID * ppUserData;

/* void pointer to be updated with user data */

Gets the current action callback function along with the user data, which were set using L_DispContainerSetActionCallBack.

Parameter

Description

hCellWnd

A handle to the window that represents the Medical Viewer Cell.

ppfnCallBack

Pointer to a pointer to a callback function to be updated with the last action callback function set using L_DispContainerSetActionCallBack.

ppUserData

Void pointer to be updated with the value of user defined data associated with the tag callback. If you are not interested in the user-defined data, pass NULL for this parameter.

Returns

SUCCESS

The function was successful.

< 1

An error occurred. Refer to Return Codes.

Required DLLs and Libraries

LTIVW

For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.

See Also

Functions:

L_DispContainerSetTagCallBack, L_DispContainerGetTagCallBack, L_DispContainerSetActionCallBack, DISPCONTAINERTAGCALLBACK, DISPCONTAINERACTIONCALLBACK

Topics:

Applying Actions

 

Image Viewer Functions: Applying Actions

Example

This function will add one cell and apply a custom action and tag on it.

#if defined LEADTOOLS_V17_OR_LATER
// This structure will be the user data to sent for both action and tag callback.
typedef struct tagFIRSTCELLDATA
{
   L_INT       nValue;
   L_INT       nOldX;
   L_INT       nBrightness;
}
FIRSTCELLDATA,  * pFIRSTCELLDATA;


// Tag call back will write the brightness value of the top left corner of the cell.
L_INT  EXT_CALLBACK TagCallBack(HWND hCellWnd,
                                L_INT    nCellIndex,
                                HDC      hDC,
                                RECT *   lpRect,
                                L_VOID * pUserData)
{
   UNREFERENCED_PARAMETER(hCellWnd);
  pFIRSTCELLDATA pFirstCellData = (pFIRSTCELLDATA)pUserData;
  if (nCellIndex == 0)
   {
      L_TCHAR a[10] = TEXT("\0");
      static LOGFONT lf;
      HFONT hFont, hOldFont;
      lf.lfHeight = lpRect->bottom - lpRect->top ;
      lf.lfItalic = TRUE;
      wsprintf(lf.lfFaceName, TEXT("Times new Roman\0"));
      SetTextAlign(hDC, TA_LEFT | TA_TOP);
      SetTextColor(hDC, RGB(255, 255, 255));
      hFont = CreateFontIndirect(&lf);
      hOldFont = SelectFont(hDC, hFont);
      if (pUserData != NULL)
         wsprintf(a, TEXT("B = %d"), pFirstCellData->nValue);
      TextOut(hDC, lpRect->left, lpRect->top, a, lstrlen(a));
      SelectFont(hDC, hOldFont);
      DeleteFont(hFont);
   }
   return TRUE;
}

// This callback is called every time the user clicks on the left mouse button.
// This will modifies the brightness value as the user drags the mouse cursor to the left or to the right
// this function applies the brightness effect only on the first cell.
L_INT EXT_CALLBACK ActionCallBack(HBITMAPLIST  * phBitmapList,
                                  L_UINT         uCount,
                                  L_INT          nAction,
                                  L_UINT         uMessage,
                                  L_UINT         wParam,
                                  POINT   *      ptMousePos,
                                  L_VOID  *      pUserData)
{
   pFIRSTCELLDATA pFirstCellData = (pFIRSTCELLDATA)pUserData;
   L_INT          nI;
   L_INT          nCount;
   BITMAPHANDLE   Bitmap;
   HWND           hWnd; 

   UNREFERENCED_PARAMETER(wParam);
   UNREFERENCED_PARAMETER(nAction);
   UNREFERENCED_PARAMETER(uCount);

   switch(uMessage)
   {

   case WM_LBUTTONDOWN:
      pFirstCellData->nOldX = ptMousePos->x;
      break;
   case WM_MOUSEMOVE:
      L_GetBitmapListCount(phBitmapList[0], (L_UINT *)&nCount);

      pFirstCellData->nValue = pFirstCellData->nBrightness + ptMousePos->x - pFirstCellData->nOldX;
      pFirstCellData->nValue = max(-1000, min(1000, pFirstCellData->nValue));

      for (nI = 0; nI < nCount; nI++)
      {
         L_GetBitmapListItem (phBitmapList[0], nI, &Bitmap, sizeof(BITMAPHANDLE));
         L_SetPaintContrast (&Bitmap, pFirstCellData->nValue);
         L_SetBitmapListItem (phBitmapList[0], nI, &Bitmap);
      }

      // redraw the cell.
      hWnd = L_DispContainerGetCellWindowHandle(hCon, 0, 0);
      InvalidateRect(hWnd, NULL, FALSE);
      break;

   case WM_LBUTTONUP:
      pFirstCellData->nBrightness = pFirstCellData->nValue;

      break;
   }
   return TRUE;
}


#define CONTAINER_ACTION_BRIGHTNESS 101
DISPCONTAINERACTIONCALLBACK pOldActionCallBack;
DISPCONTAINERTAGCALLBACK    pOldTagCallBack;

 L_INT DispContainerGetActionCallBackExample(HDISPCONTAINER hCon)
{
   L_INT                   nCellIndex;
   pFIRSTCELLDATA          pFirstCellData;
   L_INT                   nCount;
   L_INT                   nRet;
   HBITMAPLIST             hBitmapList;
   DISPOWNERACTIONPROPS    OwnerActionProp;

   if (hCon == NULL)
      return ERROR_NO_MEMORY ;

   // removes all the cells and starts over again.
   nCount = L_DispContainerGetCellCount (hCon, 0);
   if (nCount)
   {
      nRet = L_DispContainerRemoveCell(hCon, -1, 0);
      if(nRet != SUCCESS)
         return nRet;
   }

   // load a bitmap list.
   nRet = L_LoadBitmapList (TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\Image2.cmp"), &hBitmapList, 0, ORDER_BGRORGRAY, NULL, NULL);

   // if the image is corrupted, not found, or not supported, the program will destroy the container and terminate
   if (nRet != SUCCESS)
   {
      L_DispContainerDestroy (hCon, 0);
      return nRet;
   }

   HWND hConWnd = L_DispContainerGetWindowHandle(hCon, 0);
   HWND hCellWnd = L_DispContainerCreateCell(hConWnd, 0);

   // Insert a new cell at the end of the container cell queue.
   nCellIndex = L_DispContainerInsertCell (hCon, hCellWnd, -1, 0);

   // Attach the loaded bitmaplist to the newly inserted cell.
   nRet = L_DispContainerSetCellBitmapList (hCellWnd,
                                           hBitmapList,
                                           TRUE,
                                           0);
   if(nRet != SUCCESS)
      return nRet;

   // Get the old action and tag callback.
   // We assumed here that there is neither old user data exist for the tag nor for the action.
   nRet = L_DispContainerGetTagCallBack(hCellWnd, &pOldTagCallBack, NULL);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerGetActionCallBack (hCellWnd, &pOldActionCallBack, NULL);
   if(nRet != SUCCESS)
      return nRet;

   // Add some tags to the cell
   nRet = L_DispContainerSetCellTag(hCellWnd, 0, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_OWNERDRAW, NULL, 0);
   if(nRet != SUCCESS)
      return nRet;

   // add the custom action to the container.
   nRet = L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_BRIGHTNESS, 0);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerSetAction (hCellWnd, CONTAINER_ACTION_BRIGHTNESS, CONTAINER_MOUSE_BUTTON_LEFT, DCACTION_ACTIVEONLY);
   if(nRet != SUCCESS)
      return nRet;
   OwnerActionProp.DispContainerActionProps.bCircularMouseMove = FALSE;
   OwnerActionProp.DispContainerActionProps.hCursor = NULL;
   OwnerActionProp.DispContainerActionProps.nChange = 100;
   OwnerActionProp.DispContainerActionProps.uStructSize = sizeof(DISPOWNERACTIONPROPS);

   nRet = L_DispContainerSetActionProperties(hCellWnd, CONTAINER_ACTION_BRIGHTNESS, 0, &OwnerActionProp, 0);
   if(nRet != SUCCESS)
      return nRet;

   pFirstCellData = (pFIRSTCELLDATA)GlobalAllocPtr(GHND, sizeof(FIRSTCELLDATA));
   pFirstCellData->nBrightness = 0;

   // Sets the new callback functions for the action and for the tag.
   nRet = L_DispContainerSetActionCallBack(hCellWnd, ActionCallBack, (L_VOID  *)pFirstCellData);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerSetTagCallBack(hCellWnd, TagCallBack, (L_VOID * )pFirstCellData);
   if(nRet != SUCCESS)
      return nRet;
   return SUCCESS;
}

#else



// This structure will be the user data to sent for both action and tag callback.
typedef struct tagFIRSTCELLDATA
{
   L_INT       nValue;
   L_INT       nOldX;
   L_INT       nBrightness;
}
FIRSTCELLDATA,  * pFIRSTCELLDATA;


// Tag call back will write the brightness value of the top left corner of the cell.
L_INT  EXT_CALLBACK TagCallBack(L_INT    nCellIndex,
                                HDC      hDC,
                                RECT *   lpRect,
                                L_VOID * pUserData)
{
  pFIRSTCELLDATA pFirstCellData = (pFIRSTCELLDATA)pUserData;
  if (nCellIndex == 0)
   {
      L_TCHAR a[10] = TEXT("\0");
      static LOGFONT lf;
      HFONT hFont, hOldFont;
      lf.lfHeight = lpRect->bottom - lpRect->top ;
      lf.lfItalic = TRUE;
      wsprintf(lf.lfFaceName, TEXT("Times new Roman\0"));
      SetTextAlign(hDC, TA_LEFT | TA_TOP);
      SetTextColor(hDC, RGB(255, 255, 255));
      hFont = CreateFontIndirect(&lf);
      hOldFont = SelectFont(hDC, hFont);
      if (pUserData != NULL)
         wsprintf(a, TEXT("B = %d"), pFirstCellData->nValue);
      TextOut(hDC, lpRect->left, lpRect->top, a, lstrlen(a));
      SelectFont(hDC, hOldFont);
      DeleteFont(hFont);
   }
   return TRUE;
}

// This callback is called every time the user clicks on the left mouse button.
// This will modifies the brightness value as the user drags the mouse cursor to the left or to the right
// this function applies the brightness effect only on the first cell.
L_INT EXT_CALLBACK ActionCallBack(L_INT /*nCellIndex*/,
                                  HBITMAPLIST  * phBitmapList,
                                  L_UINT         uCount,
                                  L_INT          nAction,
                                  L_UINT         uMessage,
                                  L_UINT         wParam,
                                  POINT   *      ptMousePos,
                                  L_VOID  *      pUserData)
{
   pFIRSTCELLDATA pFirstCellData = (pFIRSTCELLDATA)pUserData;
   L_INT          nI;
   L_INT          nCount;
   BITMAPHANDLE   Bitmap;
   HWND           hWnd; 

  
  UNREFERENCED_PARAMETER(wParam);
  UNREFERENCED_PARAMETER(nAction);
  UNREFERENCED_PARAMETER(uCount);
   switch(uMessage)
   {

   case WM_LBUTTONDOWN:
      pFirstCellData->nOldX = ptMousePos->x;
      break;
   case WM_MOUSEMOVE:
      L_GetBitmapListCount(phBitmapList[0], (L_UINT *)&nCount);

      pFirstCellData->nValue = pFirstCellData->nBrightness + ptMousePos->x - pFirstCellData->nOldX;
      pFirstCellData->nValue = max(-1000, min(1000, pFirstCellData->nValue));

      for (nI = 0; nI < nCount; nI++)
      {
         L_GetBitmapListItem (phBitmapList[0], nI, &Bitmap, sizeof(BITMAPHANDLE));
         L_SetPaintContrast (&Bitmap, pFirstCellData->nValue);
         L_SetBitmapListItem (phBitmapList[0], nI, &Bitmap);
      }

      // redraw the cell.
      hWnd = L_DispContainerGetCellWindowHandle(hCon, 0, 0);
      InvalidateRect(hWnd, NULL, FALSE);
      break;

   case WM_LBUTTONUP:
      pFirstCellData->nBrightness = pFirstCellData->nValue;

      break;
   }
   return TRUE;
}


#define CONTAINER_ACTION_BRIGHTNESS 101
DISPCONTAINERACTIONCALLBACK pOldActionCallBack;
DISPCONTAINERTAGCALLBACK    pOldTagCallBack;

 L_INT DispContainerGetActionCallBackExample(HDISPCONTAINER hCon)
{
   L_INT                   nCellIndex;
   pFIRSTCELLDATA          pFirstCellData;
   L_INT                   nCount;
   L_INT                   nRet;
   HBITMAPLIST             hBitmapList;
   DISPOWNERACTIONPROPS    OwnerActionProp;

   if (hCon == NULL)
      return ERROR_NO_MEMORY ;

   // removes all the cells and starts over again.
   nCount = L_DispContainerGetCellCount (hCon, 0);
   if (nCount)
   {
      nRet = L_DispContainerRemoveCell(hCon, -1, TRUE, 0);
      if(nRet != SUCCESS)
         return nRet;
   }

   // load a bitmap list.
   nRet = L_LoadBitmapList (TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\Image2.cmp"), &hBitmapList, 0, ORDER_BGRORGRAY, NULL, NULL);

   // if the image is corrupted, not found, or not supported, the program will destroy the container and terminate
   if (nRet != SUCCESS)
   {
      L_DispContainerDestroy (hCon, FALSE, 0);
      return nRet;
   }

   // Insert a new cell at the end of the container cell queue.
   nCellIndex = L_DispContainerInsertCell (hCon, -1, 0);

   // Attach the loaded bitmaplist to the newly inserted cell.
   nRet = L_DispContainerSetCellBitmapList (hCon,
                                           nCellIndex,
                                           hBitmapList,
                                           TRUE,
                                           0);
   if(nRet != SUCCESS)
      return nRet;

   // Get the old action and tag callback.
   // We assumed here that there is neither old user data exist for the tag nor for the action.
   nRet = L_DispContainerGetTagCallBack(hCon, &pOldTagCallBack, NULL);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerGetActionCallBack (hCon, &pOldActionCallBack, NULL);
   if(nRet != SUCCESS)
      return nRet;

   // Add some tags to the cell
   nRet = L_DispContainerSetCellTag(hCon, nCellIndex, 0, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_OWNERDRAW, NULL, 0);
   if(nRet != SUCCESS)
      return nRet;

   // add the custom action to the container.
   nRet = L_DispContainerAddAction(hCon, CONTAINER_ACTION_BRIGHTNESS, 0);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerSetAction (hCon, CONTAINER_ACTION_BRIGHTNESS, CONTAINER_MOUSE_BUTTON_LEFT, DCACTION_ACTIVEONLY);
   if(nRet != SUCCESS)
      return nRet;
   OwnerActionProp.DispContainerActionProps.bCircularMouseMove = FALSE;
   OwnerActionProp.DispContainerActionProps.hCursor = NULL;
   OwnerActionProp.DispContainerActionProps.nChange = 100;
   OwnerActionProp.DispContainerActionProps.uStructSize = sizeof(DISPOWNERACTIONPROPS);

   nRet = L_DispContainerSetActionProperties(hCon, CONTAINER_ACTION_BRIGHTNESS, 0, 0, &OwnerActionProp, 0);
   if(nRet != SUCCESS)
      return nRet;

   pFirstCellData = (pFIRSTCELLDATA)GlobalAllocPtr(GHND, sizeof(FIRSTCELLDATA));
   pFirstCellData->nBrightness = 0;

   // Sets the new callback functions for the action and for the tag.
   nRet = L_DispContainerSetActionCallBack(hCon, ActionCallBack, (L_VOID  *)pFirstCellData);
   if(nRet != SUCCESS)
      return nRet;
   nRet = L_DispContainerSetTagCallBack(hCon, TagCallBack, (L_VOID * )pFirstCellData);
   if(nRet != SUCCESS)
      return nRet;
   return SUCCESS;
}

#endif