treectrlusedlg.cpp

来自「evc开发的ppc环境下的动态树控件的生成与检索」· C++ 代码 · 共 335 行

CPP
335
字号
// TreeCtrlUseDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TreeCtrlUse.h"
#include "TreeCtrlUseDlg.h"
#include "TreeAttrDlg.h"
#include "PDABase.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/*

void  __stdcall _com_issue_error(HRESULT m_hr)
{
	TCHAR pcszError[1024];
	
	_stprintf(pcszError, TEXT("_com_issue_error(%ld)\n"), m_hr);
	//OutputDebugString(pcszError);
}


int TreeSumRecordCount(CVOConnection * m_Conn,CString TableName,CString strFieldValue)
{
	CString cdbName,strSQL;
	CString strprefix[]={"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
	
	CVORecordset *m_Set;		
	m_Set=new CVORecordset(*m_Conn);
	m_Set->Initialize();
	
	for(int i=0;i<35;i++)
	   {
		strSQL="select * from " + TableName + " where Layercode='" + strFieldValue + strprefix[i]+ "'";
		BOOL bRet = m_Set->Open(strSQL,adOpenForwardOnly,adLockPessimistic);
		
		if(bRet)
		{
			m_Set->Close();
			//delete m_Conn;
			delete m_Set;
			return 1; 
		}
		//	else
		//		continue;
	}
	   m_Set->Close();
	   //delete m_Conn;
	   delete m_Set;
	   return 0;
	   
}

void TreeAddSubTree(CTreeCtrl& ctrlTree,CVOConnection * m_Conn,CString TableName,int FieldCode,int FieldValue,CString ParTree, CString strChildTree, HTREEITEM hPartItem)
{
	if (strChildTree!="0")
	{
		HTREEITEM hCurrent;//当前节点句柄		
    		
		CString cdbName,strSQL;		
		CVORecordset *m_Set;		
		
		m_Set=new CVORecordset(*m_Conn);
		m_Set->Initialize();

		CString strprefix[]={"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
        
       for(int i=0;i<35;i++)
	   {
		   strSQL="select * from " + TableName + " where Layercode='" + ParTree + strprefix[i]+ "'";
		   BOOL bRet = m_Set->Open(strSQL,adOpenForwardOnly,adLockPessimistic);
			
		   if(!bRet)
		   {
				AfxMessageBox(_T("查询出错!"));
			   m_Set->Close();
			   delete m_Set;
			   //delete m_Conn;
			   return;
		   }

		   if(m_Set->IsBOF()||m_Set->IsEOF())
		   {
			   //AfxMessageBox(_T("数据库中没有相关记录!"));
			   m_Set->Close();
			   delete m_Set;
			   //delete m_Conn;
			   return;
		   }
		   	   
		   m_Set->MoveFirst();
		   while(!m_Set->IsEOF())
		   {
			   
			   CString strID=m_Set->GetFieldValueString(FieldCode);
			   CString string=m_Set->GetFieldValueString(FieldValue);
			   
			   hCurrent=ctrlTree.InsertItem(TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT,
				   string, 0, 1, 0, 0, 0, hPartItem, NULL);				   
			   
			   char ch[20];
			   int m;
			   for(m=0;m<strID.GetLength();m++)
			   {
				   ch[m]=strID.GetAt(m);
			   }
			   ch[m]='\0';
			   //strcpy(ch,(char*)strID.GetBuffer(20));
			   int id=atoi(ch);
			   ctrlTree.SetItemData(hCurrent,(DWORD)id);
			   
			   if (TreeSumRecordCount(m_Conn,TableName,m_Set->GetFieldValueString(FieldCode))>0) //判断子节点
			   {	
				   TreeAddSubTree(ctrlTree,m_Conn,TableName,FieldCode,FieldValue,m_Set->GetFieldValueString(FieldCode),m_Set->GetFieldValueString(FieldValue),hCurrent);
			   }
			   
			   m_Set->MoveNext();
		   }
	   }
	   
	   m_Set->Close();	   
	   //delete m_Conn;
	   delete m_Set;
	}
}



BOOL MakeTreefromDB(CString title,CTreeCtrl& ctrlTree,CString DBName,CString TableName,int FieldCode,int FieldValue)
{
	CVOConnection * pConn;	
	pConn=new CVOConnection(DBName);

	//先添加树的根节点
	TVINSERTSTRUCT tvInsert;//在树目录中添加新的项
	tvInsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
	tvInsert.item.iImage = 0;
	tvInsert.item.iSelectedImage = 1;//当对象被选中时,显示图标索引	
	tvInsert.hParent = NULL;// If this member is the TVI_ROOT value or NULL 
	tvInsert.hInsertAfter = NULL;//Handle to the item after which the new item is to be inserted, or one of the following values. 
	
	tvInsert.item.pszText = (unsigned short *)title.GetBuffer(100);
	
	HTREEITEM hParent = ctrlTree.InsertItem(&tvInsert);//--根节点;
	
	//添加子节点	
	TreeAddSubTree(ctrlTree,pConn,TableName,FieldCode,FieldValue,"1","1",hParent);//layercode节点代号
	
	delete pConn;
	return TRUE;
}

  */
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlUseDlg dialog

CTreeCtrlUseDlg::CTreeCtrlUseDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTreeCtrlUseDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTreeCtrlUseDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


}

void CTreeCtrlUseDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTreeCtrlUseDlg)
	DDX_Control(pDX, IDC_TREE, m_ctrlTree);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTreeCtrlUseDlg, CDialog)
	//{{AFX_MSG_MAP(CTreeCtrlUseDlg)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlUseDlg message handlers

BOOL CTreeCtrlUseDlg::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
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here

	
	//创建图片列表对象
	m_pImgList = new CImageList();
	m_pImgList->Create(24,16,TRUE,12,4);
    //将预先定义好的两幅位图加载到图片列表中
	CBitmap bmp;
    bmp.LoadBitmap(IDB_BMPTREE);
	m_pImgList->Add(&bmp, (COLORREF)0xFFFFFF);
	bmp.DeleteObject();
	
    bmp.LoadBitmap(IDB_BMPTREESELECTED);
	m_pImgList->Add(&bmp, (COLORREF)0xFFFFFF);
	bmp.DeleteObject();

    //初始化树
    InitTree();	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTreeCtrlUseDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	//释放创建的图片列表视图
	delete m_pImgList;
	
}

//初始化树,用来加载树
void CTreeCtrlUseDlg::InitTree()
{
	CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_TREE);	
	ASSERT(pCtrl != NULL);

	pCtrl->SetImageList(m_pImgList,TVSIL_NORMAL);

	CString cdbName;
	cdbName=_T("testdata2.cdb");
	//MakeTreefromDB2(*pCtrl,cdbName,_T("testtable"),1,2);
	MakeTreefromDB2(*pCtrl,cdbName,_T("CLINICAL"),0,2);
}



void CTreeCtrlUseDlg::OpenHtml(CString Layercode)
{
/*	
    CString s_Sql;
	s_Sql = "SELECT content FROM testtable WHERE Layercode ='" + Layercode + "'";
	
	//CVOConnection *m_Conn;
	CVORecordset *m_Set;
	

	
	//m_Conn=new CVOConnection(cdbName);
	
	m_Set=new CVORecordset(*m_Conn);
	m_Set->Initialize();
	m_Set->Open(s_Sql,adOpenForwardOnly,adLockPessimistic);	
	
    CString html = m_Set->GetFieldValueString(0);	

	CFile myFile;
	myFile.Open(L"\\show.HTML", CFile::modeWrite|CFile::modeCreate); //|CFile::modeNoTruncate);
	CArchive ar(&myFile, CArchive::store);
	ar<<html;
	ar.Close();
	myFile.Close();

	
	SHELLEXECUTEINFO ShExecInfo = {0};
	ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
	ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
	ShExecInfo.hwnd = NULL; 
	ShExecInfo.lpVerb = NULL; 
	ShExecInfo.lpFile = TEXT("\\show.HTML"); 
	ShExecInfo.lpParameters = NULL; 
	ShExecInfo.lpDirectory = NULL; 
	ShExecInfo.nShow = SW_SHOW; 
	ShExecInfo.hInstApp = NULL; 
	ShellExecuteEx(&ShExecInfo); 

	m_Set->Close();
	delete m_Set;
*/
}



void CTreeCtrlUseDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	
	CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_TREE);
	ASSERT(pCtrl != NULL);

	hTreeCurrent=m_ctrlTree.GetSelectedItem ();
	hTreeParent=m_ctrlTree.GetParentItem(m_ctrlTree.GetSelectedItem ());	
	

	CString Layercode;

	//判断是否是叶节点
	if (m_ctrlTree.GetChildItem(hTreeCurrent)==NULL)
	{//如果有子项则进行递归操作
		DWORD id=pCtrl->GetItemData(pCtrl->GetSelectedItem());
		Layercode.Format(_T("%d"),(int)id);
		OpenHtml(Layercode);//打开html网页
		//在状态栏上显示所选中树叶的标题
	CStatic *pLblStatus = (CStatic*)GetDlgItem(IDC_STATUS);
   	pLblStatus->SetWindowText(pCtrl->GetItemText(pCtrl->GetSelectedItem()));
	}

	CStatic *pLblStatus = (CStatic*)GetDlgItem(IDC_STATUS);
	pLblStatus->SetWindowText(pCtrl->GetItemText(pCtrl->GetSelectedItem()));
	
	*pResult = 0;
}



void CTreeCtrlUseDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CStringArray ColName, ColDetail;
	ColName.Add(_T("姓名"));
	ColName.Add(_T("性别"));
	ColDetail.Add(_T("王八"));
	ColDetail.Add(_T("蛋"));
	ShowHTML(ColName,ColDetail);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?