Available in LEADTOOLS Medical Imaging toolkits. |
L_DispContainerSetLowMemoryUsageCallBack
#include "l_bitmap.h"
L_LTIVW_API L_INT EXT_FUNCTION L_DispContainerSetLowMemoryUsageCallBack(hCellWnd, pfnCallBack, pUserData)
HWND hCellWnd; |
/* handle to the cell window */ |
DISPCONTAINERFRAMEREQUESTEDCALLBACK pfnCallBack; |
/* callback function */ |
LPVOID pUserData; |
/* pointer to more parameters for the callback */ |
Sets a callback function which will be fired every time the control requests a new frame and the low memory usage feature is enabled (for more information see the L_DispContainerEnableCellLowMemoryUsage).
Parameter |
Description |
hCellWnd |
A handle to the window that represents the Medical Viewer Cell. |
pfnCallBack |
Callback function, which will be fired when the control requests a new frame and the low memory usage feature, is enabled (for more information refer to L_DispContainerEnableCellLowMemoryUsage). The callback function must adhere to the function prototype described in DISPCONTAINERFRAMEREQUESTEDCALLBACK. |
pUserData |
Void pointer that you can use to pass one or more additional parameters that the callback function needs. |
|
To use this feature, assign a value to a variable or create a structure that contains as many fields as you need. Then, in this parameter, pass the address of the variable or structure, casting it to L_VOID *. The callback function, which receives the address in its own pUserData parameter, can cast it to a pointer of the appropriate data type to access your variable or structure. |
|
If the additional parameters are not needed, you can pass NULL in this parameter. |
Returns
SUCCESS |
The function was successful. |
< 1 |
An error occurred. Refer to Return Codes. |
Comments
The low memory usage feature works by making the control stop from loading all of the frames at runtime. Instead, the control will load only the frames that are currently visible on the cell. The control will send a request each time the user scrolls down or up, changes the number of visible frames, etc. For example, suppose the cell layout is a 2X2 (See L_DispContainerSetCellProperties), and the user needs to load more than 100000 frames. Instead of loading them all, this function will send a callback (DISPCONTAINERFRAMEREQUESTEDCALLBACK) when the cell is loaded, requesting 4 frames (1, 2, 3 and 4) (because the cell is 2X2). Once the user scrolls down the cell to view frame number 5, frame number 1 will be disposed of because it is no longer visible, and the callback will be fired to request frame number 5. When frames are requested, the user is supposed to send them to the control using the function L_DispContainerSetRequestedImage.
To get the current frames request callback function, call L_DispContainerGetLowMemoryUsageCallBack
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. |
Platforms
See Also
Example
This example shows how to use the low memroy usage feature to display a medical image with multiple pages. it will also invert all the bitmap to show the invert function works even if the bitmap is not loaded yet.
#if defined LEADTOOLS_V17_OR_LATER #if defined (LEADTOOLS_V16_OR_LATER) L_INT EXT_CALLBACK FramesRequestedCallBack (L_INT nCellIndex, L_UINT * puFramesRequested, L_UINT uLength, L_VOID * pUserData) { L_INT nI; LOADFILEOPTION LoadOption; BITMAPHANDLE * pBitmap; HDISPCONTAINER hCon = (HDISPCONTAINER)pUserData; if (uLength == 0) return 0; HWND hCellWnd = L_DispContainerGetCellWindowHandle(hCon, nCellIndex, 0); L_GetDefaultLoadFileOption(&LoadOption, sizeof(LOADFILEOPTION)); pBitmap = (pBITMAPHANDLE)malloc(sizeof(BITMAPHANDLE) * uLength); for (nI = 0; nI < (L_INT)uLength; nI++) { LoadOption.PageNumber = puFramesRequested[nI]; L_LoadBitmap(TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\xa.dcm"), &pBitmap[nI], sizeof(BITMAPHANDLE), 0, ORDER_BGRORGRAY, &LoadOption, NULL); } L_DispContainerSetRequestedImage(hCellWnd, pBitmap, (L_INT *) puFramesRequested, uLength, 0); return SUCCESS; } L_INT DispContainerEnableCellLowMemoryUsageExample(HDISPCONTAINER hCon) { DISPCONTAINERFRAMEREQUESTEDCALLBACK oldCallBack; L_VOID * pOldUserData; FILEINFO FileInfo; pDISPCONTAINERBITMAPINFO pBitmapInfo; L_INT nI; L_FileInfo(TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\xa.dcm"), &FileInfo, sizeof(FILEINFO), 0, NULL); pBitmapInfo = (DISPCONTAINERBITMAPINFO *)malloc(sizeof(DISPCONTAINERBITMAPINFO) * FileInfo.TotalPages); for (nI = 0; nI < FileInfo.TotalPages; nI++) { pBitmapInfo[nI].uHeight = FileInfo.Height; pBitmapInfo[nI].uWidth = FileInfo.Width; pBitmapInfo[nI].uXResolution = FileInfo.XResolution; pBitmapInfo[nI].uYResolution = FileInfo.YResolution; } HWND hConWnd = L_DispContainerGetWindowHandle(hCon, 0); HWND hCellWnd = L_DispContainerCreateCell(hConWnd, 0); L_DispContainerInsertCell(hCon, hCellWnd, 0, 0); L_DispContainerGetLowMemoryUsageCallBack(hCellWnd, &oldCallBack, &pOldUserData); L_DispContainerSetLowMemoryUsageCallBack(hCellWnd, FramesRequestedCallBack, hCon); L_DispContainerEnableCellLowMemoryUsage(hCellWnd, 0, FileInfo.TotalPages, pBitmapInfo, 0); // invert all the frames in the cell. for (nI = 0; nI < FileInfo.TotalPages; nI ++) { L_DispContainerInvertBitmap(hCellWnd, nI, 0); } return SUCCESS; } #endif #else #if defined (LEADTOOLS_V16_OR_LATER) L_INT EXT_CALLBACK FramesRequestedCallBack (L_INT nCellIndex, L_UINT * puFramesRequested, L_UINT uLength, L_VOID * pUserData) { L_INT nI; LOADFILEOPTION LoadOption; BITMAPHANDLE * pBitmap; HDISPCONTAINER hCon = (HDISPCONTAINER)pUserData; if (uLength == 0) return 0; L_GetDefaultLoadFileOption(&LoadOption, sizeof(LOADFILEOPTION)); pBitmap = (pBITMAPHANDLE)malloc(sizeof(BITMAPHANDLE) * uLength); for (nI = 0; nI < (L_INT)uLength; nI++) { LoadOption.PageNumber = puFramesRequested[nI]; L_LoadBitmap(TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\xa.dcm"), &pBitmap[nI], sizeof(BITMAPHANDLE), 0, ORDER_BGRORGRAY, &LoadOption, NULL); } L_DispContainerSetRequestedImage(hCon, nCellIndex, pBitmap, (L_INT *) puFramesRequested, uLength, 0); return SUCCESS; } L_INT DispContainerEnableCellLowMemoryUsageExample(HDISPCONTAINER hCon) { DISPCONTAINERFRAMEREQUESTEDCALLBACK oldCallBack; L_VOID * pOldUserData; FILEINFO FileInfo; pDISPCONTAINERBITMAPINFO pBitmapInfo; L_INT nI; L_FileInfo(TEXT("%UserProfile%\\My Documents\\LEADTOOLS Images\\xa.dcm"), &FileInfo, sizeof(FILEINFO), 0, NULL); pBitmapInfo = (DISPCONTAINERBITMAPINFO *)malloc(sizeof(DISPCONTAINERBITMAPINFO) * FileInfo.TotalPages); for (nI = 0; nI < FileInfo.TotalPages; nI++) { pBitmapInfo[nI].uHeight = FileInfo.Height; pBitmapInfo[nI].uWidth = FileInfo.Width; pBitmapInfo[nI].uXResolution = FileInfo.XResolution; pBitmapInfo[nI].uYResolution = FileInfo.YResolution; } L_DispContainerInsertCell(hCon, 0, 0); L_DispContainerGetLowMemoryUsageCallBack(hCon, &oldCallBack, &pOldUserData); L_DispContainerSetLowMemoryUsageCallBack(hCon, FramesRequestedCallBack, hCon); L_DispContainerEnableCellLowMemoryUsage(hCon, 0, 0, FileInfo.TotalPages, pBitmapInfo, TRUE, 0); // invert all the frames in the cell. for (nI = 0; nI < FileInfo.TotalPages; nI ++) { L_DispContainerInvertBitmap(hCon, 0, nI, 0); } return SUCCESS; } #endif #endif