www.pudn.com > goodTree.rar > TreeDataDlg.cpp


// TreeDataDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "TreeData.h" 
#include "TreeDataDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTreeDataDlg dialog 
 
CTreeDataDlg::CTreeDataDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CTreeDataDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CTreeDataDlg) 
	m_strEdit = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CTreeDataDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CTreeDataDlg) 
	DDX_Control(pDX, IDC_COMBO1, m_ctrlComboCity); 
	DDX_Control(pDX, IDC_TREE1, m_ctrlTree); 
	DDX_Text(pDX, IDC_EDIT1, m_strEdit); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CTreeDataDlg, CDialog) 
	//{{AFX_MSG_MAP(CTreeDataDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1) 
	ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTree1) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTreeDataDlg message handlers 
 
BOOL CTreeDataDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 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 
	 
	// TODO: Add extra initialization here 
//------------------------------------------------ 
		TreeAddTree(); 
//------------------------------------------------ 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CTreeDataDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// 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 CTreeDataDlg::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 CTreeDataDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
//----------------Tree控件的原始创建------------------- 
void CTreeDataDlg::TreeAddTree() 
{ 
//--------------Tree控件操作变量------------------------ 
	TVINSERTSTRUCT tvInsert; 
	HTREEITEM hParent; 
//------------------------------------------------ 
	tvInsert.hParent = NULL; 
	tvInsert.hInsertAfter = NULL; 
	tvInsert.item.mask = TVIF_TEXT; 
//-----------------创建图象标签---------------------------- 
	m_TreeBootImage.Create ( IDB_TreeBootImage,20,1,ILC_COLOR8); 
	m_ctrlTree.SetImageList ( &m_TreeBootImage,TVSIL_NORMAL ); 
	m_ctrlTree.SetTextColor (RGB(7,145,13)); 
//--------添加根目录---------------------------------------- 
	tvInsert.item.pszText = _T("中国"); 
	hParent = m_ctrlTree.InsertItem(&tvInsert); 
//---------------添加子目录------------------------------- 
	TreeAddSubTree("中国","1",hParent); 
//---------------------展开Tree目录------------------ 
	m_ctrlTree.Expand(hParent,TVE_EXPAND); 
 
} 
 
void CTreeDataDlg::TreeAddSubTree(CString ParTree, CString strChildTree, HTREEITEM hPartItem) 
{ 
if (strChildTree!="0") 
	{ 
		//----------------使用到的变量进行定义---------- 
			_RecordsetPtr m_pTreeRecordset;    //用于创建一个查询记录集 
			_variant_t vChild; 
		//--------------Tree控件操作变量------------------------ 
			HTREEITEM hCurrent; 
		//---------------------------------------------- 
			CString strSQL,strCurItem; 
		//----------------------------------------------- 
		strSQL="SELECT * FROM TreeItem where ParentItem like '%" ; 
		strSQL=strSQL+ParTree+"%'"; 
		try 
		{ 
			HRESULT hTRes; 
		    hTRes = m_pTreeRecordset.CreateInstance(_T("ADODB.Recordset")); 
			if (SUCCEEDED(hTRes)) 
			{ 
	            //---------------------------------------------------- 
		        hTRes = m_pTreeRecordset->Open((LPTSTR)strSQL.GetBuffer(130), 
			        _variant_t((IDispatch *)(((CTreeDataApp*)AfxGetApp())->m_pTreeConn),true), 
				    adOpenDynamic,adLockPessimistic,adCmdText); 
	            if(SUCCEEDED(hTRes)) 
		        { 
					TRACE(_T("连接成功!\n")); 
					//------------------------------------------ 
					m_pTreeRecordset->MoveFirst(); 
					if (!(m_pTreeRecordset->adoEOF)) 
					{ 
						 
						while(!m_pTreeRecordset->adoEOF) 
						{ 
							hCurrent = m_ctrlTree.InsertItem((LPCTSTR)(_bstr_t)\ 
								(m_pTreeRecordset->GetCollect("Name")), hPartItem, NULL); 
	//---------------将内容添加到City的Combo控件中------------------ 
m_ctrlComboCity.AddString(VariantToCString(m_pTreeRecordset->GetCollect("Name"))); 
							if (TreeSumRecordCount(VariantToCString\ 
								(m_pTreeRecordset->GetCollect("Name")))>0) 
							{ 
								TreeAddSubTree(VariantToCString(m_pTreeRecordset->GetCollect("Name")), 
										(VariantToCString(m_pTreeRecordset->GetCollect("Name"))), 
										hCurrent); 
							} 
						 
							if (!(m_pTreeRecordset->adoEOF)) 
							{ 
								m_pTreeRecordset->MoveNext(); 
							} 
						}		 
					} 
				//--------------------------------------- 
				} 
			} 
		} 
		catch(_com_error e)///捕捉异常 
		{ 
			 CString errormessage; 
			 MessageBox("创建City记录集失败!",ParTree+strChildTree); 
		} 
	} 
} 
//-----------------实现了VARIANT类型的值转换成CString类型-------------- 
CString CTreeDataDlg::VariantToCString(VARIANT var) 
{ 
	CString strValue; 
	_variant_t var_t; 
	_bstr_t bst_t; 
	time_t cur_time; 
	CTime time_value; 
	COleCurrency var_currency; 
	switch(var.vt) 
	{ 
	case VT_EMPTY:strValue=_T("");break; 
	case VT_UI1:strValue.Format ("%d",var.bVal);break; 
	case VT_I2:strValue.Format ("%d",var.iVal );break; 
	case VT_I4:strValue.Format ("%d",var.lVal);break; 
	case VT_R4:strValue.Format ("%f",var.fltVal);break; 
	case VT_R8:strValue.Format ("%f",var.dblVal);break; 
	case VT_CY: 
		var_currency=var; 
		strValue=var_currency.Format(0); 
		break; 
	case VT_BSTR: 
		var_t=var; 
		bst_t=var_t; 
		strValue.Format ("%s",(const char*)bst_t); 
		break; 
	case VT_NULL:strValue=_T("");break; 
	case VT_DATE: 
		cur_time=var.date; 
		time_value=cur_time; 
		strValue=time_value.Format("%A,%B%d,%Y"); 
		break; 
	case VT_BOOL:strValue.Format ("%d",var.boolVal );break; 
	default:strValue=_T("");break; 
	} 
	return strValue; 
} 
 
//-----------返回符合条件的记录总数---------------------------- 
int CTreeDataDlg::TreeSumRecordCount(CString strFieldValue) 
{ 
	int Sum=0; 
	//----------------使用到的变量进行定义---------- 
			_RecordsetPtr m_pRecordset;    //用于创建一个查询记录集 
			_variant_t vChild; 
		//---------------------------------------------- 
		CString strSQL,strCurItem; 
		//----------------------------------------------- 
		strSQL="SELECT * FROM TreeItem where ParentItem like '%" ; 
		strSQL=strSQL+strFieldValue+"%'"; 
		try 
		{ 
			HRESULT hTRes; 
		    hTRes = m_pRecordset.CreateInstance(_T("ADODB.Recordset")); 
			if (SUCCEEDED(hTRes)) 
			{ 
	            //---------------------------------------------------- 
		        hTRes = m_pRecordset->Open((LPTSTR)strSQL.GetBuffer(130), 
			        _variant_t((IDispatch *)(((CTreeDataApp*)AfxGetApp())->m_pTreeConn),true), 
				    adOpenDynamic,adLockPessimistic,adCmdText); 
	            if(SUCCEEDED(hTRes)) 
		        { 
					TRACE(_T("连接成功!\n")); 
					//------------------------------------------ 
					if(!m_pRecordset->BOF ) 
					{ 
						m_pRecordset->MoveFirst (); 
						while(!m_pRecordset->adoEOF) 
						{ 
							Sum+=1; 
							m_pRecordset->MoveNext (); 
						} 
					} 
					//--------------------------------------- 
				} 
			} 
		} 
		catch(_com_error e)///捕捉异常 
		{ 
			 CString errormessage; 
			 MessageBox("求符合条件的记录总数出错!",strFieldValue); 
		} 
	return Sum; 
} 
 
void CTreeDataDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
//-------------------------------------------------------- 
	hTreeCurrent=m_ctrlTree.GetSelectedItem (); 
	hTreeParent=m_ctrlTree.GetParentItem(m_ctrlTree.GetSelectedItem ()); 
//-------------------树型控件的图标更改--------- 
	m_ctrlTree.SetItemImage(hTreeCurrent,1,true ); 
//----------------------------------------------	 
	TreeParent=m_ctrlTree.GetItemText (hTreeParent); 
	hTreeCurrent=m_ctrlTree.GetSelectedItem (); 
//---------------------处理ListTree中的相应显示内容-------------- 
	//-----------------获取当前的Item和子Items----------------------- 
	if (m_ctrlTree.GetChildItem(hTreeCurrent)!=NULL) 
	{//-------------如果,有子项则进行递归操作,返回自己和子项的值--------- 
		m_strEdit=ReturnTreeChilds(hTreeCurrent);	 
	} 
	else 
	{ 
		m_strEdit=m_ctrlTree.GetItemText(hTreeCurrent); 
	} 
	UpdateData(false);//子项内容显示到Edit控件中	 
//--------------------------------------------------- 
	*pResult = 0; 
} 
//----------------提取当前所选择项的子项文本所组成的字符串------------------------ 
CString CTreeDataDlg::ReturnTreeChilds(HTREEITEM hP) 
{ 
	CString text=""; 
	//取出当前的Item值 
	text=m_ctrlTree.GetItemText(hP); 
	//取子项的Item值 
	HTREEITEM hC; 
	hC=m_ctrlTree.GetChildItem(hP); 
 
	while(true) 
	{ 
		//-----------判断是否有子项,如果有,则递归调用----------- 
		if (m_ctrlTree.GetChildItem(hC)!=NULL) 
		{ text+=(","+ReturnTreeChilds(hC));} 
		else 
		{text+=(","+m_ctrlTree.GetItemText(hC));} 
		//----------------判断是否有兄弟项,如果有,则将它的内容添加进去--- 
		if (m_ctrlTree.GetNextSiblingItem(hC)==NULL) 
			break; 
		HTREEITEM hBC; 
		hBC=m_ctrlTree.GetNextSiblingItem(hC); 
		hC=hBC; 
	} 
	return text; 
} 
 
void CTreeDataDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
//-------------------树型控件的图标还原--------- 
	m_ctrlTree.SetItemImage(hTreeCurrent,0,true ); 
//---------------------------------------------- 
	*pResult = 0; 
}