Image Viewer Cells

Features of Version 16 and above:

Actions

The properties of a frozen sub-cell cannot be modified except by manually setting them using LImageViewer::SetActionProperties. To determine whether a sub-cell is frozen, call LImageViewer::IsSubCellFrozen. To freeze all cells call LImageViewer::FreezeCell.

It is possible to invert, flip, and reverse images in a specified cell or sub-cell.

To invert an image call LImageViewer::InvertBitmap. To determine whether an image has been inverted, call LImageViewer::IsBitmapInverted.

To reverse an image call LImageViewer::ReverseBitmap. To determine whether an image has been reversed, call LImageViewer::IsBitmapReversed.

To flip an image call LImageViewer::FlipBitmap. To determine whether an image has been flipped, call FlippedLImageViewer::IsBitmapFlipped.

Call LImageViewer::GetRotateBitmapPerspectiveAngle to get the perspective rotation angle of the specified cell or sub-cell and set it by using LImageViewer::RotateBitmapPerspective.

Print a cell by calling LImageViewer::PrintCell.

Cell and Sub-cell Tags

To get a cell tag use the function LImageViewer::GetCellTag. To edit the tag use the LImageViewer::EditCellTag function. Cell tags can be removed by calling the LImageViewer::DeleteCellTag function.

The above functions works on the cell tag. The cell tag appears on all the frames in the cell. If you need to add a tag that appears only on one sub-cell use the LImageViewer::SetSubCellTag function. To get a tag, call the LImageViewr::GetSubCellTag function. To edit a sub-cell tag, call the LImageViewr::EditSubCellTag function, and delete it using the LImageViewer::DeleteSubCellTag function.

Painting a Cell

Features of Version 15 and above:

About Cells

An Image Viewer container may contain a number of child windows called cells. These cells may contain images, tags or rulers. Cells are resized to fit within the "blocks" that make up the rows and columns in the container. The number of rows and columns can be altered programmatically by calling LImageViewer::SetProperties to set the container properties. The number of rows and columns can be altered dynamically by the user positioning more "splitters" within the container.

Adding Cells

When a container is created, it is empty. To add a cell to a container, call LImageViewer::InsertCell. This function automatically creates a window for the cell when it inserts the cell into the container. A handle to that window can be retrieved by calling LImageViewer::GetCellWindowHandle. The number of cells that can be added to a container is limited only by the available memory. To get the current number of cells in a container, call LImageViewer::GetCellCount.

Positioning Cells

Cells are positioned within a container from left to right and top to bottom. When a cell is inserted in the container, any cells to the right of the inserted cell will be moved to the right one block, wrapping to the next row as each row is filled. The row and column position of each cell can be retrieved by calling LImageViewer::GetCellPosition. A cell can be repositioned, based on the index, by calling LImageViewer::RepositionCell.

Cell Properties

Each cell in the container has certain properties associated with it. The current properties for a cell can be retrieved by calling LImageViewer::GetCellProperties. To change the properties of a single cell, or to give all cells in the container the same properties, call LImageViewer::SetCellProperties.

Some properties apply to all cells within a container. These properties can be retrieved and set using LImageViewer::GetProperties and LImageViewer::SetProperties.

Cell Boundaries

Each cell in a container has boundaries, which are dictated by the splitters separating the rows and the columns. These boundaries cannot actually be reset programmatically, although you could change the number of rows and columns in the container. The boundaries can be obtained however, by calling LImageViewer::GetCellBounds.

Actions

Actions may be applied to the images attached to the cells in the container. Actions can be assigned to mouse buttons and keystroke combinations. These actions are then applied to one or more cells when the mouse button is pressed/dragged or the keystroke combination is pressed.

To prevent the mouse or keyboard from being used to apply an action to a cell, that cell can be frozen. To "freeze" a cell, call LImageViewer::FreezeCell with the bFreeze parameter set to TRUE. A frozen cell cannot be handled using the mouse or the keyboard, but it can be changed manually using either LImageViewer::SetCellProperties, or LImageViewer::SetActionProperties. To unfreeze a frozen cell, call LImageViewer::FreezeCell with the bFreeze parameter set to FALSE. To determine whether a cell is frozen, call LImageViewer::IsCellFrozen. Freeze a sub-cell by calling LImageViewer::FreezeSubCell. The properties of a frozen sub-cell cannot be modified except by manually setting them using LImageViewer::SetActionProperties. To determine whether a sub-cell is frozen, call LImageViewer::IsSubCellFrozen.

For more information about the available actions and the functions associated with them, refer to Applying Actions.

Selecting and Deselecting Cells

Cells within a container may be selected or deselected. When applying actions to cells, the user has the option to apply the action on one cell, all cells, or only selected cells. To select or deselect a cell, call LImageViewer::SelectCell. When selecting cells dynamically, selecting one cell by clicking on it will deselect all other cells. To select more than one cell, hold the CTRL key while clicking on the cells. To determine whether a cell is currently selected, call LImageViewer::IsCellSelected.

What a Cell Contains

Images

A cell can have one or more images attached to it by calling LImageViewer::SetCellBitmapList. If a bitmap list having multiple images is added, scroll bars will appear to allow scrolling through the images. To get the current list attached to a cell, call LImageViewer::GetCellBitmapList. It is best not to modify an existing bitmap list attached to a specific cell. However, if it is necessary to modify an attached bitmap list, certain steps should be taken. For more information on this procedure, refer to LImageViewer::SetCellBitmapList.

You can retrieve a bitmap handle from the bitmap list inside the cell using the function LImageViewer::GetBitmapHandle. Once you have it, you can apply any LEADTOOLS function. It is possible to invert the images in a specified cell or sub-cell by calling LImageViewer::InvertBitmap. To determine whether an image has been inverted, call LImageViewer::IsBitmapInverted. After you are done,  to make sure that your changes are reflected in the image viewer, call LImageViewer::SetBitmapHandle. This function will repaint the cell to visualize the new changes on the affected image. If you choose not to repaint the cell right immediately, you can repaint it later using  LImageViewer::RepaintCell.

Rulers

Cells may also contain rulers. Horizontal and vertical rulers are used to measure the actual size of the image in centimeters. These rulers are updated automatically if the image is resized. They are displayed or hidden, depending on the cell properties set using LImageViewer::SetCellProperties. The style and colors used to draw the rulers are set for the container using LImageViewer::SetProperties.

To calibrate a cell or sub-cell using the annotation ruler call LImageViewer::CalibrateRuler.

Tags

In addition to images and rulers, cells may also contain tags. Tags are text that is overlaid along the sides of the cell, and provide information about the image. A cell may have no tags, one tag, or more than one tag.  Cell tags appear on all frames in the cell. Each tag is added by calling LImageViewer::SetCellTag.

There are three types of tags:

Customizeable Title Bar

A title bar that contains up to eight developer-defined check boxes can be docked at the top of every sub-cell inside the image viewer.

Sub-Cells

Cells can act like mini containers. They can be divided into equivalent blocks based on the number of rows and columns set using the LImageViewer::SetCellProperties function. Splitters are not used to separate rows and columns in cells. Therefore, the number of cells and the size of each cell is set when this function is called. Each block within the cell contains one page of the bitmap list attached to the cell. Scrolling is also supported within the cell, although it is a little different from the container scrolling. In cell scrolling, the pages shift up by one page. Therefore, if the cell has pages 0, 1, 2, and 3, and the pages are scrolled down by one page 0 will disappear and page 1 will take its place.

There is very little independence for sub-cells. For most actions, such as scaling, if one sub-cell is scaled, all sub cells are scaled. However, the window leveling and alpha actions can be applied to individual sub-cells, without being applied to all sub-cells.

While sub-cells can be selected, only one-sub cell per cell can be selected at a time.

Dynamically, left double clicking on a sub-cell causes the cell to enter an "exploded" mode in which the sub-cell expands to cover the entire cell. Left double-clicking the cell a second time returns the sub-cell to its regular state.

To set the scale of a cell or sub-cell call LImageViewer::SetCellScale, and to set the properties of the scale action use the LImageViewer::SetActionProperties function. To retrieve the properties of the scale action use the LImageViewer::GetActionProperties function. To set the scale mode of a cell or sub-cell call the LImageViewer::SetCellScaleMode function and to get it call LImageViewer::GetCellScaleMode.

Removing a Cell

When a cell is no longer needed in a container it can be removed by calling LImageViewer::RemoveCell. If a cell is removed, any cells to the right of the removed cell will be shifted left. Cells will wrap to the preceding row as needed. All cells in a container can be removed by calling this function with the nCellIndex parameter set to –1.

Working with the LEADTOOLS Medical Image Viewer Control

Using the Medical Image Viewer Control

Image Viewer Cells

Applying Actions

Creating a Bitmap Region Inside the Image Viewer

Implementing Animation

Working with Annotations

Customizeable Title Bar

For more information, refer to:

Introduction

Example Programs

Summary of All Supported Image File Formats

See Also:

Microsoft Code Snippet Picker

LEADTOOLS Support Forums

LEADTOOLS Medical Imaging Support Forum