📄 nodetreeview.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 + -