Provides an interface with the viewer to allow it to receive messages that inform the control that the palette has been changed.
#include "ltivw.h"
L_LTIVW_API L_BOOL EXT_FUNCTION L_DispContainerHandlePalette(hCellWnd, uMessage, wParam, uFlags)
Handle to the cell window.
Value that indicate the message that will be sent to the viewer main window.
wParam value to be passed to the message.
Reserved for future use. Pass 0.
Value | Meaning |
---|---|
SUCCESS | The function was successful. |
< 1 | An error occurred. Refer to Return Codes. |
This function is used to display images correctly when working on 8-bit viewing systems.
The allowed messages to be recived through the parameter uMessage are:
WM_PALETTECHANGED
WM_PALETTEISCHANGING
WM_QUERYNEWPALETTE
WM_SYSCOLORCHANGE
In order to use this function, first set the uFlags parameter of the L_DispContainerCreate function to CONTAINER_HANDLEPALETTE.
The toolkit comes in Win32 and x64 editions that can support development of software applications for any of the following environments:
Windows 10
Windows 8
Windows 7
Windows Vista
Windows XP
Windows 2000
This example creates a medical viewer control that works on 8-bit palette display monitors.
typedef struct tagDATA
{
HBITMAPLIST hBitmapList;
L_BOOL bWindowLevel;
L_INT nAction;
HDISPCONTAINER hCon;
L_INT nApplyToAllSubCells;
HWND hWndAnimationDialog;
}
DATA, * LPDATA;
HWND hWndParent;
#define SETDATA(hwnd, h) L_SETWINDOWLONGPTR(hwnd, GWLP_USERDATA, (HANDLE)(h))
#define LOCKDATA(hwnd) ((LPDATA) GlobalLock((HANDLE)L_GETWINDOWLONGPTR(hwnd, GWLP_USERDATA)))
#define UNLOCKDATA(hwnd) GlobalUnlock((HANDLE)L_GETWINDOWLONGPTR(hwnd, GWLP_USERDATA))
L_INT CreateNewCell(HWND hWnd, L_TCHAR * szText)
{
L_INT nRet, nIndex;
LPDATA pData = (LPDATA)LOCKDATA(hWnd);
nRet = L_LoadBitmapList(szText, &pData->hBitmapList, 0, ORDER_BGRORGRAY, NULL, NULL);
if (nRet != SUCCESS)
return nRet;
HWND hConWnd = L_DispContainerGetWindowHandle(pData->hCon, 0);
HWND hCellWnd = L_DispContainerCreateCell(hConWnd, 0);
nIndex = L_DispContainerInsertCell(pData->hCon, hCellWnd, -1, 0);
nRet = L_DispContainerSetCellBitmapList(hCellWnd,
pData->hBitmapList,
TRUE,
0);
return SUCCESS;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
LPDATA pData = NULL;
pData = (LPDATA)LOCKDATA(hWnd);
L_INT nCellIndex = 0;
HWND hCellWnd = NULL;
hCellWnd = L_DispContainerGetCellWindowHandle(pData->hCon, nCellIndex, 0);
switch(uMessage)
{
case WM_SYSCOLORCHANGE:
case WM_QUERYNEWPALETTE:
if (hCellWnd != NULL)
{
L_DispContainerHandlePalette(hCellWnd, uMessage, 0, 0);
L_DispContainerRepaintCell(hCellWnd, 0);
}
break;
case WM_PALETTEISCHANGING:
case WM_PALETTECHANGED:
if (hCellWnd != NULL)
{
L_DispContainerHandlePalette(hCellWnd, uMessage, wParam, 0);
L_DispContainerRepaintCell(hCellWnd, 0);
}
break;
}
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
L_INT DispContainerHandlePaletteExample(HINSTANCE hInstance)
{
MSG uMessage;
WNDCLASS wndclass;
HANDLE hMem;
LPDATA pData;
HACCEL hAccel;
RECT rcRect;
DISPCONTAINERPROPERTIES DispContainerProp;
DISPCELLPROPERTIES DispCellProp;
L_TCHAR szText[L_MAXPATH];
L_INT nRet;
//register the Image child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = sizeof(HANDLE);
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockBrush(GRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("HandlePaletteExample");
if (!RegisterClass(&wndclass))
return 0;
hWndParent = CreateWindowEx(WS_EX_CLIENTEDGE,
TEXT("HandlePaletteExample"),
TEXT("Image Viewer Demo"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
hMem = GlobalAlloc (GHND, sizeof (DATA));
SETDATA (hWndParent, hMem);
if(!hMem)
return(FALSE);
pData = (LPDATA)LOCKDATA(hWndParent);
memset(pData, 0, sizeof(LPDATA));
pData->hCon = NULL;
// you must unlock the medical suite in order to be able to use the medical viewer.
//UNLOCKSUPPORT();
// Initialize the container by making it the same size as its parent.
GetClientRect(hWndParent, &rcRect);
pData->hCon = L_DispContainerCreate(hWndParent, &rcRect, CONTAINER_HANDLEPALETTE);
// If there is a problem occur while
if (pData->hCon == NULL)
{
L_INT nError = GetLastError();
wsprintf(szText, TEXT("Error %d"), nError);
MessageBox(hWndParent, szText, TEXT("Aborting"), MB_OK);
L_DispContainerDestroy(pData->hCon, 0);
GlobalFree(hMem);
return FALSE;
}
HWND hCellWnd = L_DispContainerGetCellWindowHandle(pData->hCon, 0, 0);
// Add some action and activate them
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_WINDOWLEVEL, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ALPHA, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_OFFSET , 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_MAG, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_SCALE , 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_STACK , 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_RULER, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_ELLIPSE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_RECTANGLE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_TEXT, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_ARROW, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_ANGLE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_ANNOTATION_HILITE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_RECTANGLE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_NUDGETOOL, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_SHRINKTOOL, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_ELLIPSE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_POLYGON, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_FREEHAND, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_MAGICWAND, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_COLORRANGE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_CIRCLE, 0);
L_DispContainerAddAction(hCellWnd, CONTAINER_ACTION_REGION_SQUARE, 0);
// assign the action to a mouse button.
L_DispContainerSetAction(hCellWnd, CONTAINER_ACTION_WINDOWLEVEL, CONTAINER_MOUSE_BUTTON_LEFT, 0);
L_DispContainerSetAction(hCellWnd, CONTAINER_ACTION_OFFSET, CONTAINER_MOUSE_BUTTON_RIGHT, 0);
L_DispContainerSetAction(hCellWnd, CONTAINER_ACTION_SCALE, CONTAINER_MOUSE_BUTTON_MIDDLE, 0);
L_DispContainerSetAction(hCellWnd, CONTAINER_ACTION_STACK, CONTAINER_MOUSE_WHEEL, 0);
SetCursor(LoadCursor(NULL, IDC_WAIT));
// set the image viewer interface to show two cells, that are arranged horizontaly
DispContainerProp.uStructSize = sizeof(DISPCONTAINERPROPERTIES);
DispContainerProp.uNumCols = 2;
DispContainerProp.uNumRows = 1;
DispContainerProp.uMask = DCPF_NUMROWS | DCPF_NUMCOLS;
nRet = L_DispContainerSetProperties(pData->hCon, &DispContainerProp, 0);
CreateNewCell(hWndParent, MAKE_IMAGE_PATH(TEXT("xa.dcm")));
// Set some tags.
L_DispContainerSetCellTag(hCellWnd, 2, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_USERDATA, TEXT("EX. ID 230-36-5448"), 0);
L_DispContainerSetCellTag(hCellWnd, 4, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_FRAME, NULL,0);
L_DispContainerSetCellTag(hCellWnd, 6, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_SCALE, NULL,0);
L_DispContainerSetCellTag(hCellWnd, 2, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_WLCENTERWIDTH, NULL,0);
L_DispContainerSetCellTag(hCellWnd, 1, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_FIELDOFVIEW, NULL,0);
L_DispContainerSetCellTag(hCellWnd, 1, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("Good, Guy"), 0);
L_DispContainerSetCellTag(hCellWnd, 2, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("PID 125-98-445"), 0);
L_DispContainerSetCellTag(hCellWnd, 3, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("DOB 08/02/1929"), 0);
L_DispContainerSetCellTag(hCellWnd, 5, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("03/16/1999"), 0);
L_DispContainerSetCellTag(hCellWnd, 0, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_RULERUNIT, NULL, 0);
DispCellProp.uStructSize = sizeof(DISPCELLPROPERTIES);
DispCellProp.bIsFit = TRUE;
DispCellProp.uMask = DCCELLPF_IMAGE_FIT;
nRet = L_DispContainerSetCellProperties(hCellWnd, &DispCellProp, 0);
CreateNewCell(hWndParent, MAKE_IMAGE_PATH(TEXT("mr.dcm")));
HWND hCellWnd1 = L_DispContainerGetCellWindowHandle(pData->hCon, 1, 0);
// set some tags
L_DispContainerSetCellTag(hCellWnd1, 1, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_USERDATA, TEXT("MRI"), 0);
L_DispContainerSetCellTag(hCellWnd1, 2, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_USERDATA, TEXT("EX. ID G-1194-24"), 0);
L_DispContainerSetCellTag(hCellWnd1, 4, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_FRAME, NULL,0);
L_DispContainerSetCellTag(hCellWnd1, 6, DISPWIN_ALIGN_TOPLEFT, DISPWIN_TYPE_SCALE, NULL,0);
L_DispContainerSetCellTag(hCellWnd1, 2, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_WLCENTERWIDTH, NULL,0);
L_DispContainerSetCellTag(hCellWnd1, 1, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_FIELDOFVIEW, NULL,0);
L_DispContainerSetCellTag(hCellWnd1, 0, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_USERDATA, TEXT("THK 10 mm"), 0);
L_DispContainerSetCellTag(hCellWnd1, 3, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_USERDATA, TEXT("TR 1333.33"), 0);
L_DispContainerSetCellTag(hCellWnd1, 4, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_USERDATA, TEXT("TE 11.98"), 0);
L_DispContainerSetCellTag(hCellWnd1, 6, DISPWIN_ALIGN_BOTTOMLEFT, DISPWIN_TYPE_USERDATA, TEXT("Comm longaxis - Normal"), 0);
L_DispContainerSetCellTag(hCellWnd1, 0, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("Community Hospital"), 0);
L_DispContainerSetCellTag(hCellWnd1, 1, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("Nice, Fellow"), 0);
L_DispContainerSetCellTag(hCellWnd1, 2, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("PID 123-45-6789"), 0);
L_DispContainerSetCellTag(hCellWnd1, 3, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("DOB 05/13/1936"), 0);
L_DispContainerSetCellTag(hCellWnd1, 4, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("Sex M"), 0);
L_DispContainerSetCellTag(hCellWnd1, 5, DISPWIN_ALIGN_TOPRIGHT, DISPWIN_TYPE_USERDATA, TEXT("06/26/1995"), 0);
// set the cell interface so it shows 4 frames at once.
DispCellProp.uNumCols = 2;
DispCellProp.uNumRows = 2;
DispCellProp.bIsFit = TRUE;
DispCellProp.bOnMove = TRUE;
DispCellProp.uMask = DCCELLPF_COLS | DCCELLPF_ROWS | DCCELLPF_IMAGE_FIT | DCCELLPF_APPLYONMOVE;
nRet = L_DispContainerSetCellProperties(hCellWnd1, &DispCellProp, 0);
SetCursor(LoadCursor(NULL, IDC_ARROW));
ShowWindow(hWndParent, SW_MAXIMIZE);
UpdateWindow(hWndParent);
hAccel = LoadAccelerators(hInstance, TEXT("HandlePaletteExample"));
while (GetMessage (&uMessage, NULL, 0, 0))
{
if(!TranslateMDISysAccel (hWndParent, &uMessage) &&
!TranslateAccelerator (hWndParent, hAccel, &uMessage))
{
TranslateMessage (&uMessage);
DispatchMessage (&uMessage);
}
}
GlobalFree(hMem);
return (L_INT)uMessage.wParam;
}