SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftMask/OCX 7.0 - Masked Edit Control
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftPrintPreview/DLL 2.0 - Print Preview Control (discontinued)
SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftDirectory 3.5 - File/Folder Control (discontinued)
SftMask/OCX 7.0 - Masked Edit Control
SftOptions 1.0 - Registry/INI Control (discontinued)
SftPrintPreview/OCX 1.0 - Print Preview Control (discontinued)
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftTabs/NET 6.0 - Tab Control (discontinued)
SftTree/NET 2.0 - Tree Control
This sample illustrates SftTree/DLL control output.
The source code is located at C:\Program Files (x86)\Softelvdm\SftPrintPreview DLL 2.0\Samples\MFC\PreviewSftTree\PreviewSftTreeView.cpp or C:\Program Files\Softelvdm\SftPrintPreview DLL 2.0\Samples\MFC\PreviewSftTree\PreviewSftTreeView.cpp (on 32-bit Windows versions).
#include "stdafx.h"
#include "PreviewSftTree.h"
#include "PreviewSftTreeDoc.h"
#include "TreePreview.h"
#include "PreviewSftTreeView.h"
#define IDC_TREE 100 /* Tree control ID */
#define LINETEXT TEXT("Softel vdm, Inc. - www.softelvdm.com")
#define COLUMNS 3 // # of columns in tree control
IMPLEMENT_DYNCREATE(CPreviewSftTreeView, CView)
BEGIN_MESSAGE_MAP(CPreviewSftTreeView, CView)
//{{AFX_MSG_MAP(CPreviewSftTreeView)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, OnFilePrintDirect)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
/* Handling expanding/collapsing items */
ON_SFTTREEN_LBUTTONDBLCLK_TEXT(IDC_TREE, OnLButtonExpandCollapse)
ON_SFTTREEN_LBUTTONDOWN_BUTTON(IDC_TREE, OnLButtonExpandCollapse)
ON_SFTTREEN_LBUTTONDBLCLK_BUTTON(IDC_TREE, OnLButtonExpandCollapse)
ON_SFTTREEN_LBUTTONDOWN_PLUSMIN(IDC_TREE, OnLButtonExpandCollapse)
ON_SFTTREEN_LBUTTONDBLCLK_PLUSMIN(IDC_TREE, OnLButtonExpandCollapse)
/* Handling column resizing (double-clicks) */
ON_SFTTREEN_LBUTTONDBLCLK_COLUMNRES(IDC_TREE, OnLButtonDblClkColumnResize)
END_MESSAGE_MAP()
CPreviewSftTreeView::CPreviewSftTreeView()
{
srand( (unsigned)time( NULL ) ); // Init random number generator
// load all bitmaps
for (int i = 0 ; i < MAX_BITMAPS ; ++i)
m_Bitmaps[i].LoadBitmap(IDB_BITMAP0+i);
{
HDC hDC = ::GetDC(NULL);
int height = MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72);// 8 point font
m_TreeFont.CreateFont(- height, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE|DEFAULT_PITCH,
TEXT("Microsoft Sans Serif"));
_ASSERT(m_TreeFont.m_hObject);
::ReleaseDC(NULL, hDC);
}
}
CPreviewSftTreeView::~CPreviewSftTreeView()
{
}
BOOL CPreviewSftTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
// By registering our own class, we can eliminate CS_HREDRAW and CS_VREDRAW which
// cause flicker
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CView::PreCreateWindow(cs);
}
void CPreviewSftTreeView::OnDraw(CDC* pDC)
{
CPreviewSftTreeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
#ifdef _DEBUG
void CPreviewSftTreeView::AssertValid() const
{
CView::AssertValid();
}
void CPreviewSftTreeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CPreviewSftTreeDoc* CPreviewSftTreeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPreviewSftTreeDoc)));
return (CPreviewSftTreeDoc*)m_pDocument;
}
#endif //_DEBUG
/**********************************************************************/
/* Initialize Tree Control Window */
/**********************************************************************/
int CPreviewSftTreeView::GetABitmapNumber()
{
return rand() % MAX_BITMAPS;
}
HBITMAP CPreviewSftTreeView::GetABitmap()
{
return m_Bitmaps[GetABitmapNumber()];
}
CBitmap& CPreviewSftTreeView::GetABitmapRef()
{
return m_Bitmaps[GetABitmapNumber()];
}
void CPreviewSftTreeView::AddItem(CSftTree& Tree, int level, BOOL fChild, LPCTSTR lpszText, BOOL fLabel, BOOL fCell, BOOL fRow)
{
SFT_PICTURE Pic;
int i, index;
index = m_Tree.AddString(lpszText);/* Add an item */
m_Tree.SetItemLevel(index, level);/* change level */
Sft_InitPicture(&Pic);
Sft_SetPictureBitmap(&Pic, GetABitmap());
m_Tree.SetItemPicture(index, &Pic);
if (fLabel) {
Sft_InitPicture(&Pic);
Sft_SetPictureBitmap(&Pic, GetABitmap());
m_Tree.SetItemLabel(index, GetABitmapRef());
m_Tree.SetRowText(index, TEXT("Text"));
}
if (fCell) {
for (i = 0 ; i < COLUMNS ; ++i) {
SFTTREE_CELLINFOPARM CellInfo;
CellInfo.version = 5;
CellInfo.index = index;
CellInfo.iCol = i;
m_Tree.GetCellInfo(&CellInfo);
CellInfo.Cell.flag = SFTTREE_BMP_LEFT|SFTTREE_TEXT_LEFT;
Sft_SetPictureBitmap(&CellInfo.Cell.CellPicture1, GetABitmap());
m_Tree.SetCellInfo(&CellInfo);
}
}
if (fRow) {
SFTTREE_ROWINFOPARM RowInfo;
RowInfo.version = 5;
RowInfo.index = index;
m_Tree.GetRowInfo(&RowInfo);
Sft_SetPictureBitmap(&RowInfo.Row.RowPicture1, GetABitmap());
RowInfo.Row.flag = SFTTREE_BMP_LEFT|SFTTREE_TEXT_LEFT;
m_Tree.SetRowInfo(&RowInfo);
}
for (i = 1 ; i < COLUMNS ; ++i) {
TCHAR szBuffer[80];
if (((index + 3*i) % (COLUMNS+5)) == 0) {
wsprintf(szBuffer, TEXT("This is a very long text line in column %d."), i);
m_Tree.SetText(index, i, szBuffer);
if (i < COLUMNS -1) {
// leave next cell blank
++i;
if (fCell) {
// clear cell bitmap in each cell
SFTTREE_CELLINFOPARM CellInfo;
CellInfo.version = 5;
CellInfo.index = index;
CellInfo.iCol = i;
m_Tree.GetCellInfo(&CellInfo);
CellInfo.Cell.flag = SFTTREE_BMP_LEFT|SFTTREE_TEXT_LEFT;
Sft_ClearPicture(&CellInfo.Cell.CellPicture1);
m_Tree.SetCellInfo(&CellInfo);
}
}
} else {
wsprintf(szBuffer, TEXT("Column %d(%ld)"), i, index);
m_Tree.SetText(index, i, szBuffer);
}
}
}
void CPreviewSftTreeView::InitTreeWindow()
{
SFT_PICTURE Pic;
SFT_PICTURE aThreeItemPictures[3];
m_Tree.SetShowHeader(TRUE); /* Show column headers */
/* Register the label picture size. All label pictures */
/* used must be the same size. Only one picture needs to */
/* be registered, even if several are used. */
Sft_InitPicture(&Pic);
Sft_SetPictureBitmap(&Pic, m_Bitmaps[0]);/* Load a label bitmap */
m_Tree.SetItemLabelPicture(-1, &Pic);/* Register the label picture size */
/* Register the plus/minus bitmaps. These bitmaps are */
/* used for all items in the tree control. All three */
/* bitmaps must be the same size. You cannot override */
/* the plus/minus bitmap for individual items. */
m_Tree.SetPlusMinus(m_Bitmaps+54);/* Use +/- bitmaps */
/* Register the item pictures. These pictures are used */
/* for all items in the tree control. All three pictures */
/* must be the same size. */
Sft_InitPicture(&aThreeItemPictures[0]);
Sft_InitPicture(&aThreeItemPictures[1]);
Sft_InitPicture(&aThreeItemPictures[2]);
Sft_SetPictureBitmap(&aThreeItemPictures[0], m_Bitmaps[0]);/* Expandable picture */
Sft_SetPictureBitmap(&aThreeItemPictures[1], m_Bitmaps[1]);/* Expanded picture */
Sft_SetPictureBitmap(&aThreeItemPictures[2], m_Bitmaps[2]);/* Leaf picture */
m_Tree.SetPictures(aThreeItemPictures); /* Use item pictures */
m_Tree.SetItemPictureAlign(TRUE); /* Align item bitmaps */
/* Register the cell picture size. All cell pictures used */
/* must be the same size. Only one picture needs to be */
/* registered, even if several are used. */
{
SFTTREE_CELLINFOPARM CellInfo;
CellInfo.version = 5;
CellInfo.index = -1; /* Registering picture size */
Sft_InitPicture(&CellInfo.Cell.CellPicture1);
Sft_SetPictureBitmap(&CellInfo.Cell.CellPicture1, m_Bitmaps[0]);
m_Tree.SetCellInfo(&CellInfo); /* Register use of cell pictures */
}
m_Tree.SetTreeLineStyle(SFTTREE_TREELINE_DOT0);/* Dotted tree lines (incl. level 0) */
m_Tree.SetShowButtons(TRUE); /* Expand/collapse buttons (level 1..n) */
m_Tree.SetShowButton0(TRUE); /* Show expand/collapse buttons (level 0) */
m_Tree.SetButtons(SFTTREE_BUTTON_AUTOMATIC);/* Automatic button style */
m_Tree.SetShowGrid(TRUE); /* Show grid */
m_Tree.SetGridStyle(SFTTREE_GRID_BOTH_DOT);/* Dotted grid lines */
m_Tree.SetShowTruncated(TRUE); /* Show ... if truncated */
m_Tree.SetSelectionStyle(SFTTREE_SELECTION_CELL1);/* Select first cell only */
m_Tree.SetSelectionArea(SFTTREE_SELECTIONAREA_ALLCELLS);/* Selection changes by clicking on an item's cells */
m_Tree.SetFlyby(TRUE); /* Flyby highlighting */
m_Tree.SetScrollTips(TRUE); /* Show Scrolltips */
m_Tree.SetReorderColumns(TRUE); /* Column reordering */
m_Tree.SetOpenEnded(TRUE); /* Last column width */
m_Tree.SetShowHeaderButtons(TRUE); /* Show column header as buttons */
/* Define columns */
{
SFTTREE_COLUMN_EX aCol[3] = {
{ 0, 0, /* Reserved */
100, /* Width (in pixels) */
ES_LEFT | SFTTREE_TOOLTIP, /* Cell alignment */
ES_LEFT, /* Title style */
TEXT("Title0"), /* Column header title */
NULL, NULL, /* Reserved field and bitmap handle */
SFTTREE_BMP_RIGHT, /* Picture alignment */
0, 0, 0, /* Reserved fields */
SFTTREE_NOCOLOR, /* Cell background color */
SFTTREE_NOCOLOR, /* Cell foreground color */
SFTTREE_NOCOLOR, /* Selected cell background color */
SFTTREE_NOCOLOR, /* Selected cell foreground color */
0, /* Real column position (set by SetColumns call) */
0, /* Display column number (display position) */
SFTTREE_COL_MERGE | /* Column can merge with next */
SFTTREE_COL_MERGEINTO | /* Previous column can merge into this column */
0, /* Column flag */
0, /* Minimum column width */
},
{ 0, 0, /* Reserved */
100, /* Width (in pixels) */
ES_LEFT | SFTTREE_TOOLTIP, /* Cell alignment */
ES_LEFT, /* Title style */
TEXT("Title1"), /* Column header title */
NULL, NULL, /* Reserved field and bitmap handle */
SFTTREE_BMP_RIGHT, /* Picture alignment */
0, 0, 0, /* Reserved fields */
SFTTREE_NOCOLOR, /* Cell background color */
SFTTREE_NOCOLOR, /* Cell foreground color */
SFTTREE_NOCOLOR, /* Selected cell background color */
SFTTREE_NOCOLOR, /* Selected cell foreground color */
0, /* Real column position (set by SetColumns call) */
1, /* Display column number (display position) */
SFTTREE_COL_MERGE | /* Column can merge with next */
SFTTREE_COL_MERGEINTO | /* Previous column can merge into this column */
0, /* Column flag */
0, /* Minimum column width */
},
{ 0, 0, /* Reserved */
100, /* Width (in pixels) */
ES_LEFT | SFTTREE_TOOLTIP, /* Cell alignment */
ES_LEFT, /* Title style */
TEXT("Title2"), /* Column header title */
NULL, NULL, /* Reserved field and bitmap handle */
SFTTREE_BMP_RIGHT, /* Picture alignment */
0, 0, 0, /* Reserved fields */
SFTTREE_NOCOLOR, /* Cell background color */
SFTTREE_NOCOLOR, /* Cell foreground color */
SFTTREE_NOCOLOR, /* Selected cell background color */
SFTTREE_NOCOLOR, /* Selected cell foreground color */
0, /* Real column position (set by SetColumns call) */
2, /* Display column number (display position) */
SFTTREE_COL_MERGE | /* Column can merge with next */
SFTTREE_COL_MERGEINTO | /* Previous column can merge into this column */
0, /* Column flag */
0, /* Minimum column width */
}
};
m_Tree.SetColumns(3, aCol); /* Set column attributes */
}
/* Use column header pictures. All pictures used must be */
/* the same size. */
{
LPSFTTREE_COLUMN_EX lpCol;
int nCols;
nCols = m_Tree.GetColumns(&lpCol);/* Get column attributes */
Sft_SetPictureBitmap(&lpCol[0].Picture1, GetABitmap());/* Set column header picture */
Sft_ClearPicture(&lpCol[1].Picture1);/* Clear column header picture */
Sft_SetPictureBitmap(&lpCol[2].Picture1, GetABitmap());/* Set column header picture */
m_Tree.SetColumns(nCols, lpCol); /* Set new column attributes */
}
m_Tree.SetShowRowHeader(SFTTREE_ROWSTYLE_BUTTONCOUNT0);/* Row style */
/* Register the row header picture size. All row header */
/* pictures used must be the same size. Only one picture */
/* needs to be registered, even if several are used. */
{
SFTTREE_ROWINFOPARM RowInfo;
RowInfo.version = 5;
RowInfo.index = -1;
Sft_InitPicture(&RowInfo.Row.RowPicture1);
Sft_SetPictureBitmap(&RowInfo.Row.RowPicture1, GetABitmap());
m_Tree.SetRowInfo(&RowInfo);
}
m_Tree.SetRowColText(_T("?")); /* Row/column header text */
Sft_InitPicture(&Pic);
Sft_SetPictureBitmap(&Pic, GetABitmap());/* Row/column header picture */
m_Tree.SetRowColPicture(&Pic); /* Row/column picture */
m_Tree.SetRowColPictureStyle(SFTTREE_BMP_RIGHT);/* Row/column picture alignment */
m_Tree.SetCharSearchMode(SFTTREE_CHARSEARCH_ALLCHARS, -1);/* Consider all characters typed */
/* Change the default colors */
{
SFTTREE_COLORS Colors;
m_Tree.GetCtlColors(&Colors); /* Get current color settings */
Colors.colorTreeLines = COLOR_BTNSHADOW | 0x80000000L;/* Tree line color */
Colors.colorTreeLinesGrayed = COLOR_BTNSHADOW | 0x80000000L;/* Tree line color (disabled control) */
Colors.colorSelBgNoFocus = COLOR_BTNFACE | 0x80000000L;/* Selection background color (no input focus) */
Colors.colorSelFgNoFocus = COLOR_BTNTEXT | 0x80000000L;/* Selection foreground color (no input focus) */
m_Tree.SetCtlColors(&Colors); /* Set new colors */
}
{
int count = 0;
int i;
for (i = 0 ; i < 200 ; ++i) {
TCHAR szBuffer[80];
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 0, FALSE, szBuffer, FALSE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 1, FALSE, szBuffer, TRUE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 2, FALSE, szBuffer, FALSE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 3, TRUE, szBuffer, FALSE, TRUE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 3, TRUE, szBuffer, TRUE, FALSE, TRUE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 2, FALSE, szBuffer, FALSE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 3, TRUE, szBuffer, FALSE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 2, TRUE, szBuffer, FALSE, TRUE, TRUE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 1, FALSE, szBuffer, FALSE, FALSE, FALSE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 2, TRUE, szBuffer, TRUE, FALSE, TRUE);
wsprintf(szBuffer, TEXT("Item %d"), count++);
AddItem(m_Tree, 2, TRUE, szBuffer, FALSE, TRUE, FALSE);
}
}
/* Make all column widths optimal, so text and pictures are */
/* not clipped horizontally. */
m_Tree.MakeColumnOptimal(-1, 0, FALSE);/* Make column widths optimal */
/* Make row header width optimal, so text and pictures are */
/* not clipped horizontally. */
m_Tree.MakeRowHeaderOptimal(0, FALSE);/* Make row header width optimal */
m_Tree.RecalcHorizontalExtent(0, FALSE);/* Update horizontal scroll bar */
}
/////////////////////////////////////////////////////////////////////////////
// CPreviewSftTreeView message handlers
int CPreviewSftTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_Tree.CreateEx(
0,
SFTTREESTYLE_NOTIFY | /* Notify parent window */
SFTTREESTYLE_LEFTBUTTONONLY | /* Only respond to left mouse button */
SFTTREESTYLE_SCROLL | /* Honor WS_H/VSCROLL */
WS_HSCROLL | WS_VSCROLL | /* Vertical and horizontal scrollbars */
WS_VISIBLE | WS_CHILD, /* Visible, child window */
CRect(0, 0, 0, 0), /* Location */
this, /* Parent window */
IDC_TREE)) /* Tree control ID */
return -1;
// initialize tree with data
m_Tree.SetRedraw(FALSE);
m_Tree.SetFont(&m_TreeFont, FALSE);
InitTreeWindow();
m_Tree.SetRedraw(TRUE);
m_Tree.Invalidate(TRUE);
return 0;
}
void CPreviewSftTreeView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (m_Tree)
m_Tree.MoveWindow(0, 0, cx, cy);
}
/* Respond to events as the user clicks on different tree */
/* components. The events handled here can be changed to */
/* suit your application. */
void CPreviewSftTreeView::OnLButtonExpandCollapse()
{
/* get index of item to expand/collapse */
int index = m_Tree.GetExpandCollapseIndex();
/* get current expand/collapsed status */
BOOL fExpanded = m_Tree.GetItemExpand(index);
/* if control key is used we'll expand all dependents */
BOOL fDepth = (::GetKeyState(VK_CONTROL)&0x8000);
if (fExpanded)
m_Tree.Collapse(index, TRUE);
else
m_Tree.Expand(index, TRUE, fDepth);
}
/* Respond to events as the user double-clicks on the */
/* column resizing area. The events handled here can be */
/* changed to suit your application. */
void CPreviewSftTreeView::OnLButtonDblClkColumnResize()
{
/* Resize column optimally */
int realCol = m_Tree.GetResizeColumn();
if (realCol >= 0) {
m_Tree.MakeColumnOptimal(realCol);/* Make column width optimal */
m_Tree.RecalcHorizontalExtent(0, FALSE);/* Update horizontal scroll bar */
}
}
