⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodetreeview.cpp

📁 实现规则推理 模糊识别 神经网络的专家系统
💻 CPP
字号:
// NodeTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "AcquireKlg.h"
//#include "NodeTreeView.h"
//#include "ado.h"
#include "AcquireKlgDoc.h"
#include "MainFrm.h"
//四个视图类头文件
#include "RuleDefineView.h"
#include "NodeTreeView.h"
#include "RuleWizardView.h"
#include "TipView.h"

#include "Global.h"

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

extern CADODatabase GlDataBase;
extern int nCurStyle ;

/////////////////////////////////////////////////////////////////////////////
// CNodeTreeView

IMPLEMENT_DYNCREATE(CNodeTreeView, CFormView)

CNodeTreeView::CNodeTreeView()
	: CFormView(CNodeTreeView::IDD),m_NodeTreeViewCreated(false)
{

	//{{AFX_DATA_INIT(CNodeTreeView)
	//}}AFX_DATA_INIT
}

CNodeTreeView::~CNodeTreeView()
{
}

void CNodeTreeView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNodeTreeView)
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNodeTreeView, CFormView)
	//{{AFX_MSG_MAP(CNodeTreeView)
	ON_WM_SIZE()
	ON_NOTIFY(TVN_SELCHANGED, IDC_NODETREE, OnSelchangedNodeTree)
	ON_WM_LBUTTONDOWN()
	ON_NOTIFY(NM_RCLICK, IDC_NODETREE, OnRclickNodetree)
	ON_WM_CREATE()
	ON_WM_SHOWWINDOW()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNodeTreeView diagnostics

#ifdef _DEBUG
void CNodeTreeView::AssertValid() const
{
	CFormView::AssertValid();
}

void CNodeTreeView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CNodeTreeView message handlers



void CNodeTreeView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	//使树型控件足够大,不使其子项大小超出控件范围而出现树的滚动条
	CRect rect(0,0,1024,1600);
	//GetClientRect(rect);
	m_cNodeTree.Create(TVS_HASLINES|WS_VISIBLE,rect,this,IDC_NODETREE);

	m_cNodeTree.SetBkColor(RGB(236,233,216));

	HICON hIcon[8];
	int n;
	m_imageList.Create(16, 16, 0, 8, 8); // 32, 32 for large icons
	hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE);
	hIcon[1] = AfxGetApp()->LoadIcon(IDI_BLACK);
	hIcon[2] = AfxGetApp()->LoadIcon(IDI_RED);
	hIcon[3] = AfxGetApp()->LoadIcon(IDI_BLUE);
	hIcon[4] = AfxGetApp()->LoadIcon(IDI_YELLOW);
	hIcon[5] = AfxGetApp()->LoadIcon(IDI_CYAN);
	hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE);
	hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN);
	for (n = 0; n < 8; n++) {
		m_imageList.Add(hIcon[n]);
	}

	m_cNodeTree.SetImageList(&m_imageList, TVSIL_NORMAL);
	CreateTreeFromDb();
	m_NodeTreeViewCreated = true;


	m_pRwView = (CRuleWizardView*)GetView(RUNTIME_CLASS(CRuleWizardView)); 
	m_pRdView = (CRuleDefineView*)GetView(RUNTIME_CLASS(CRuleDefineView)); 
	//m_pNtView = (CNodeTreeView*)GetView(RUNTIME_CLASS(CNodeTreeView));
	m_pTipView = (CTipView*)GetView(RUNTIME_CLASS(CTipView));
	
	m_pMainWnd = (CMainFrame*)AfxGetMainWnd();
	
}


void CNodeTreeView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);

	//if(m_NodeTreeViewCreated == true)
	//m_cNodeTree.SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER);
	

	
}




void CNodeTreeView::OnDraw(CDC* pDC) 
{
	//设置树型控件的背景色
	//m_cNodeTree.SetBkColor(RGB(236,233,216));
	
	
}


void CNodeTreeView::CreateTreeFromDb(){

	
/*	m_DataBase.SetConnectionString("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=规则库;Data Source=HBY");
	if(m_DataBase.Open()!=TRUE){
		AfxMessageBox("连接数据库失败!");
		return;
	}
	
*/
//  m_DataBase = m_pMainWnd->m_DataBase;
    
	//CAcquireKlgDoc* pDoc = (CAcquireKlgDoc*)GetDocument();
	CADORecordset recordset(&GlDataBase);
	int i,j=4;
	CString str;
	//str.Format("select MAX(层号) from 结点表 where 结点号=%d",j );
	recordset.SetQuery("select * from 结点表");
	recordset.Open();
	
	
	
	recordset.GetFieldValue(1,i);
	TV_INSERTSTRUCT tvinsert;
	tvinsert.hParent = NULL;
	tvinsert.hInsertAfter = TVI_LAST;
	tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE |
						 TVIF_TEXT;
	tvinsert.item.hItem = NULL; 
	tvinsert.item.state = 0;
	tvinsert.item.stateMask = 0;
	tvinsert.item.cchTextMax = 30;
	tvinsert.item.iSelectedImage = 1;
	tvinsert.item.cChildren = 0;
	tvinsert.item.lParam = 0;

	//CString strnodename=recordset.GetFieldValue("结点名称");

	RecurCreateTree(tvinsert,recordset);

}


//递归函数,用来产生接点树

void CNodeTreeView::RecurCreateTree(TV_INSERTSTRUCT tvinsert,CADORecordset& recordset){
	//static int level = 1;
	//当前结点的父结点号,结点号 ,层号
	int fathernodenum,curnodenum,level;
	//结点名称
	CString strnodename("");

	//char * szNodeName = strnodename.GetBuffer(0);

	
	recordset.MoveFirst();//每次递归调用须遍历整个记录
	while(recordset.IsEOF()!=TRUE){
		recordset.GetFieldValue(_T("父结点号"),fathernodenum);
		if(fathernodenum == tvinsert.item.state){
			recordset.GetFieldValue("结点名称",strnodename,"");//问题在这一行
			strnodename.TrimRight();
			recordset.GetFieldValue("结点号",curnodenum);
			recordset.GetFieldValue("层号",level);
            
			//同一循环中,找到的结点是同一层的,在递归前须保存以下信息
			int savefathernodenum = tvinsert.item.state;
        	HTREEITEM  savefathernode  = tvinsert.hParent;
			
			//设置当前结点各项并生成新结点

			tvinsert.item.state = curnodenum;//state 用来存储当前结点号
			tvinsert.item.pszText = strnodename.GetBuffer(0);
			tvinsert.item.iImage = level+1;
			HTREEITEM curnode = m_cNodeTree.InsertItem(&tvinsert);
            m_cNodeTree.SetItemData(curnode,curnodenum);//用来存储当前结点号

			//以此结点为父结点进行递归
			tvinsert.hParent = curnode;	
			
			
			//递归到下一层回来后,应在原来记录处继续,所以要保存当前记录位置
		    long savepos =  recordset.GetAbsolutePosition();

/////////////////////////////////////////////////////////////////
			RecurCreateTree(tvinsert,recordset);
//////////////////////////////////////////////////////////////////


			//恢复保存的信息
			recordset.SetAbsolutePosition(savepos);
			tvinsert.item.state = savefathernodenum;
			tvinsert.hParent = savefathernode;	
		

			
		}
 		recordset.MoveNext();
		
	}
	

}



//////////////////自定义函数////////////////////////////////////////////////
//获得指定的视图类指针
CView* CNodeTreeView::GetView(CRuntimeClass* pClass) 
{ 
	CAcquireKlgDoc* pDoc=(CAcquireKlgDoc*)GetDocument();
	ASSERT(pDoc);
	CView* pView = NULL; 
	POSITION pos=pDoc->GetFirstViewPosition(); 
	while(pos!=NULL){ 
		pView=pDoc->GetNextView(pos); 
		if(pView->IsKindOf(pClass)) 
			break;
	} 
	if(!pView->IsKindOf(pClass)){ 
		AfxMessageBox("Can't Locate the View."); 
		return NULL;
	} 
	return pView;
} 

int CNodeTreeView::GetNodeID(){
	HTREEITEM hCurItem;
	if(hCurItem = m_cNodeTree.GetSelectedItem()){
		return  m_cNodeTree.GetItemData(hCurItem);
		   
	}
	else{
		AfxMessageBox("请选择结点!");
		return ERR_NOSELETED;
	}
}

////////////////////////////////////////////////////////////////////////////////
void CNodeTreeView::OnSelchangedNodeTree(NMHDR* pNMHDR, LRESULT* pResult){

	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	//CRuleDefineView *pRdView = (CRuleDefineView*)GetView(RUNTIME_CLASS(CRuleDefineView)); 
	//CNodeTreeView *pNtView = (CNodeTreeView*)GetView(RUNTIME_CLASS(CNodeTreeView)); 
	
	CADORecordset recordset(&GlDataBase);
	int i,j=4;
	CString str;
	//str.Format("select MAX(层号) from 结点表 where 结点号=%d",j );
	
	
   
    HTREEITEM hSelected = pNMTreeView->itemNew.hItem;

    if (hSelected != NULL) {
        char text[31];
        TV_ITEM item;
        item.mask = TVIF_HANDLE | TVIF_TEXT;
        item.hItem = hSelected;
        item.pszText = text;
        item.cchTextMax = 30;
   	//	AfxMessageBox(item.pszText);
	    //m_pNtView->GetItemInfo(item);

		//显示当前结点的基本信息
		m_cNodeTree.GetItem(&item);
		int nodenum = m_cNodeTree.GetItemData(m_cNodeTree.GetSelectedItem());
		str.Format("select * from 结点表 where 结点号=%d",nodenum);
		recordset.SetQuery(str);
	    recordset.Open();
		CString strObjname,strNodename;
		int levelnum,nodeorder;
		recordset.GetFieldValue("对象名称",strObjname);
		recordset.GetFieldValue("结点名称",strNodename);
		recordset.GetFieldValue("层号",levelnum);
		recordset.GetFieldValue("层中序号",nodeorder);
		
	    m_pRdView->SetBasicInfo(strObjname,strNodename,levelnum,nodeorder);


	/*	//求出推荐的规则序号
		str.Format("select max(规则序号) 最大序号 from 规则数据表 where 结点号=%d",nodenum);
		recordset.SetQuery(str);
	    recordset.Open();
		int nMaxOrder = 0;

		if(!recordset.IsEOF()) {  
			recordset.GetFieldValue("最大序号",nMaxOrder);
			nMaxOrder++;
		}

		m_pRdView->SetRegDefaultOrder(nMaxOrder);
	*/	

	/*	str.Format("select * from 规则数据表 where 结点号=%d",nodenum);
		recordset.SetQuery(str);
	    recordset.Open();
		m_pRdView->ShowRegRules(recordset);
*/
		if(nCurStyle == 1){
			m_pRdView->setoutnode();
			m_pRdView->GetRegRules();
			m_pRdView->ShowRegRules();
		}
		
		else if(nCurStyle == 2){
			m_pRdView->GetBlurFun();
			m_pRdView->ShowBlurFun();
			m_pRdView->setnodesn();
			m_pRdView->GetBlurRules();
			m_pRdView->ShowBlurRules();
			
		}

		else if (nCurStyle == 3)
		{
			m_pRdView->GetFuseRules();
			m_pRdView->ShowFuseRules();
		}

		else if (nCurStyle == 4)
		{
			;
		}
		//	CString str;
		//str.Format("%d",nodenum);
		//str = str+item.pszText;
		//AfxMessageBox(str);
		//	m_pRdView->ChangeNodeInfo(0,text);
       // SetDlgItemText(IDC_STATIC_TREEVIEW1, text);
    }
	
	*pResult = 0;
}

void CNodeTreeView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	
	CFormView::OnLButtonDown(nFlags, point);
	
}

void CNodeTreeView::OnRclickNodetree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	m_cNodeTree.SelectItem(NULL);
	
	*pResult = 0;
}


⌨️ 快捷键说明

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