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 drag & drop.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTree OCX 7.5\Samples\VC++\DragDrop\DragDropDlg.cpp or C:\Program Files\Softelvdm\SftTree OCX 7.5\Samples\VC++\DragDrop\DragDropDlg.cpp (on 32-bit Windows versions).
// DragDropDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DragDrop.h"
#include "DragDropDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDragDropDlg dialog
CDragDropDlg::CDragDropDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDragDropDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDragDropDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDragDropDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDragDropDlg)
DDX_Control(pDX, IDC_DROPTARGET, m_DropTarget);
DDX_Control(pDX, IDC_TITLE2, m_Title2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDragDropDlg, CDialog)
//{{AFX_MSG_MAP(CDragDropDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDragDropDlg message handlers
BOOL CDragDropDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_vTree = GetDlgItem(IDC_SFTTREE1)->GetControlUnknown();
ASSERT(m_vTree!=NULL);
m_TitleFont.CreatePointFont(140, _T("Microsoft Sans Serif"));
m_Title2.SetFont(&m_TitleFont);
long i;
i = m_vTree->Items->Add(_bstr_t(_T("Item 0")));
i = m_vTree->Items->Add(_bstr_t(_T("Item 1")));
m_vTree->Item[i]->Level = 1;
i = m_vTree->Items->Add(_bstr_t(_T("Item 2")));
m_vTree->Item[i]->Level = 2;
i = m_vTree->Items->Add(_bstr_t(_T("Item 3")));
m_vTree->Item[i]->Level = 1;
m_textDropTarget.Register(&m_DropTarget); // register as a drop target
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CDragDropDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDragDropDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CDragDropDlg::OnOLEStartDragSftTree1(LPDISPATCH FAR* Data, long FAR* AllowedEffects)
{
IVDMDataObjectPtr pDataObject = *Data;
ASSERT(pDataObject != NULL);
long curr = m_vTree->Items->Current;
// cell text
pDataObject->SetData(_variant_t(m_vTree->Cell[curr][0]->Text), _variant_t((short)sftCFText));
// item picture
if (m_vTree->Item[curr]->Image->Type == sftTypeIDispatch) {
pDataObject->SetData(_variant_t(m_vTree->Item[curr]->Image->GetPicture(), _variant_t((short)sftCFDIB)));
} else {
if (m_vTree->Item[curr]->Expanded != VARIANT_FALSE)
pDataObject->SetData(_variant_t(m_vTree->Items->ItemImageExpanded->GetPicture(), _variant_t((short)sftCFDIB)));
else if (m_vTree->Item[curr]->DependentAllCount > 0)
pDataObject->SetData(_variant_t(m_vTree->Items->ItemImageExpandable->GetPicture(), _variant_t((short)sftCFDIB)));
else
pDataObject->SetData(_variant_t(m_vTree->Items->ItemImageLeaf->GetPicture(), _variant_t((short)sftCFDIB)));
}
}
void CDragDropDlg::OnOLEDragDropSftTree(LPDISPATCH FAR* Data, long FAR* Effect, short FAR* Button, short FAR* Shift, float FAR* x, float FAR* y)
{
IVDMDataObjectPtr pDataObject = *Data;
ASSERT(pDataObject != NULL);
// get horizontal extent and width of column 0
long horzExtent = m_vTree->Items->HorizontalExtentPix;
long col0Width = m_vTree->Column[0]->WidthPix;
long insertAt = m_vTree->Items->DropHighlight;
if (insertAt < 0) return;
if (pDataObject->GetFormat(sftCFText) != VARIANT_FALSE) {
int lvl = m_vTree->Item[insertAt]->Level;
_variant_t object = pDataObject->GetData((short)sftCFText);
_bstr_t astring = object;
long newItem = m_vTree->Items->Insert(insertAt + 1, astring);
m_vTree->Item[newItem]->Level = lvl + 1;
} else if (pDataObject->GetFormat(sftCFDIB)) {
_variant_t object = pDataObject->GetData((short)sftCFDIB);
IPictureDispPtr pPicDisp = object;
m_vTree->Cell[insertAt][0]->Image->PutRefPicture(pPicDisp);
m_vTree->Cell[insertAt][0]->ImageHAlign = halignSftTreeRight;
} else if (pDataObject->GetFormat(sftCFFiles)) {
m_vTree->BulkUpdate = VARIANT_TRUE;
int lvl = m_vTree->Item[insertAt]->Level;
long newItem = insertAt + 1;
for (int i = pDataObject->Files->Count ; i >= 1 ; --i) {
newItem = m_vTree->Items->Insert(newItem, pDataObject->Files->GetItem(i));
m_vTree->Item[newItem]->Level = lvl + 1;
}
m_vTree->BulkUpdate = VARIANT_FALSE;
}
// make horizontal extent and width of column 0 wider than previous
// setting, but never smaller
m_vTree->ColumnsObj->MakeOptimal();
m_vTree->Items->RecalcHorizontalExtent();
if (horzExtent > m_vTree->Items->HorizontalExtentPix)
m_vTree->Items->HorizontalExtentPix = horzExtent;
if (col0Width > m_vTree->Column[0]->WidthPix)
m_vTree->Column[0]->WidthPix = col0Width;
}
/* DropTarget - Text Box Implementation */
DROPEFFECT CTextDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
{
return DROPEFFECT_COPY;
}
DROPEFFECT CTextDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
{
if (pDataObject->IsDataAvailable(CF_TEXT))
return DROPEFFECT_COPY;
return DROPEFFECT_NONE;
}
void CTextDropTarget::OnDragLeave( CWnd* pWnd )
{
}
DROPEFFECT CTextDropTarget::OnDropEx( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point )
{
if (!pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
return DROPEFFECT_NONE;
CEdit* pDropTargetControl = (CEdit*) pWnd;
// extract the data that arrived here. This is just a sample
// and is very application specific.
CFile*pFile = pDataObject->GetFileData(CF_TEXT, NULL);
if (pFile) {
// the data is in CF_TEXT format, just add the text as a new item at
// the insertion point
TCHAR szBuffer[256];
pFile->Read(szBuffer, sizeof(szBuffer)/sizeof(TCHAR));
pDropTargetControl->SetWindowText(szBuffer);
delete pFile;
}
return DROPEFFECT_COPY;
}
BEGIN_EVENTSINK_MAP(CDragDropDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CDragDropDlg)
ON_EVENT(CDragDropDlg, IDC_SFTTREE1, 24 /* OLEStartDrag */, OnOLEStartDragSftTree1, VTS_PDISPATCH VTS_PI4)
ON_EVENT(CDragDropDlg, IDC_SFTTREE1, 23 /* OLEDragDrop */, OnOLEDragDropSftTree, VTS_PDISPATCH VTS_PI4 VTS_PI2 VTS_PI2 VTS_PR4 VTS_PR4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()