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

📄 mytreeview.cpp

📁 Visual C++ 实践与提高--数据库篇的源代码。很好的东西。欢迎下载。
💻 CPP
字号:
// MyTreeView.cpp : implementation of the CMyTreeView class
//

#include "stdafx.h"
#include "OLEViewer.h"

#include "OLEViewerDoc.h"
#include "MyTreeView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView

IMPLEMENT_DYNCREATE(CMyTreeView, CTreeView)

BEGIN_MESSAGE_MAP(CMyTreeView, CTreeView)
	//{{AFX_MSG_MAP(CMyTreeView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnNodeSelect)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
	//这是一个值得玩味的命令映射宏
	ON_COMMAND_RANGE(ID_TABLE_SCHEMA, ID_TABLE_DATA, OnPopupCommand)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView construction/destruction

CMyTreeView::CMyTreeView()
{
	// TODO: add construction code here

}

CMyTreeView::~CMyTreeView()
{
}

BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView drawing

void CMyTreeView::OnDraw(CDC* pDC)
{
	COLEViewerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

void CMyTreeView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();
}

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView printing

BOOL CMyTreeView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyTreeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyTreeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView diagnostics

#ifdef _DEBUG
void CMyTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CMyTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

COLEViewerDoc* CMyTreeView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COLEViewerDoc)));
	return (COLEViewerDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView message handlers

void CMyTreeView::AddItem(WORD nItemType, LPCTSTR lpszName)
{
	//这里只处理三种模式行集对象的类型
	switch (nItemType)
	{
		case IID_TABLE:
		{
			tTable = tTables.AddTail(lpszName, IID_TABLE);
			break;
		}
		case IID_PROCEDURE:
		{
			tProcedures.AddTail(lpszName, IID_PROCEDURE);
			break;
		}
		case IID_VIEW:
		{
			tTable = tView.AddTail(lpszName, IID_VIEW);
			break;
		}
		default:
			break;
	}
}

void CMyTreeView::PopulateTree()
{
	USES_CONVERSION;
	CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
	CTables*      pTableSet = NULL;
	CViews *      pViewSet = NULL;
	CProcedures*  pProcedureSet = NULL;
	
	//删除所有结点,置空树
	ctlTree.DeleteAllItems();
	UpdateWindow();

	//若会话是无效的,则返回
	if (!m_pSession)
		return;

	// 以数据源的名称作为根结点并插入
	tDatabase = ctlTree.GetRootItem().AddTail(GetDocument()->GetDSN(),
							IID_DATABASE);

	//插入Tables、Views和Procedures三个一级结点
	tTables = tDatabase.AddTail(_T("Tables"),IID_TABLES);
	tView = tDatabase.AddTail("Views",IID_VIEWS);
	tProcedures = tDatabase.AddTail(_T("Procedures"),IID_PROCEDURES);

	//从此开始遍历数据源,把其中的所有表插入树
	pTableSet = new CTables;

	//记录欲查对象代号
	char lpszType[128];

	// 表示要检索表
	strcpy(lpszType, "TABLE");
	//打开连接
	if (pTableSet->Open(*m_pSession, NULL, NULL, NULL, lpszType) != S_OK)
		return;
	//遍历
	while(pTableSet->MoveNext() == S_OK)
	{
		if (_tcschr(pTableSet->m_szName, _T(' ')) != NULL)
			continue;
		//插入结点
		AddItem(IID_TABLE, pTableSet->m_szName);
	}

	delete pTableSet;
	pTableSet = NULL;

	//从此开始遍历数据源,把其中的所有视图插入树
	pViewSet = new CViews;

	if (pViewSet->Open(*m_pSession) != S_OK)
		return;

	while(pViewSet->MoveNext() == S_OK)
	{		
		if (_tcschr(pViewSet->m_szTableName, _T(' ')) != NULL)
			continue;

		AddItem(IID_VIEW, pViewSet->m_szTableName);
	}

	delete pViewSet;
	pViewSet = NULL;

	//从此开始遍历数据源,把其中的所有过程插入树
	pProcedureSet = new CProcedures;

	if (pProcedureSet->Open(*m_pSession) != S_OK)
		return;

	while(pProcedureSet->MoveNext() == S_OK)
	{
		if (_tcschr(pProcedureSet->m_szName, _T(' ')) != NULL)
			continue;

		AddItem(IID_PROCEDURE, pProcedureSet->m_szName);
	}

	delete pProcedureSet;
	pProcedureSet = NULL;
	//展开一级结点
	tDatabase.Expand();
	UpdateWindow();
}

int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	//设置风格
	lpCreateStruct->style |= TVS_HASLINES | TVS_HASBUTTONS;
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	//初始化文档对应对象	
	GetDocument()->m_pTreeView = this;

	//装载位图并关联到树控件上
	m_ctlImage.Create(IDB_IMAGELIST, 16, 0, RGB(255,0,255));
	m_ctlImage.SetBkColor(GetSysColor(COLOR_WINDOW));	
	CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
	ctlTree.SetImageList(&m_ctlImage);
	
	return 0;
}


void CMyTreeView::OnNodeSelect(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;

	CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
	//当前结点"句柄"
	m_ItemSel = ctlTree.GetSelectedItem();

	UINT nImageID = m_ItemSel.GetImageID();
	GetDocument()->m_pListView->SetRedraw(FALSE);

	switch (nImageID)
	{
		//当前对象为表
		case IID_TABLES://模式信息
			GetDocument()->m_pListView->ShowTableSchema(NULL);
			break;
		case IID_TABLE://数据信息
			GetDocument()->m_pListView->ShowTableSchema(m_ItemSel.GetText());
			break;
		//当前对象为过程
		case IID_PROCEDURES:
			GetDocument()->m_pListView->ShowProcedures(NULL);
			break;
		case IID_PROCEDURE:
			GetDocument()->m_pListView->ShowProcedures(m_ItemSel.GetText());
			break;
		//当前对象为视
		case IID_VIEWS:
			GetDocument()->m_pListView->ShowTableSchema(NULL);
			break;
		case IID_VIEW:
			GetDocument()->m_pListView->ShowTableSchema(m_ItemSel.GetText());
			break;
		default:
			break;
	}

	GetDocument()->m_pListView->SetRedraw(TRUE);
}
void CMyTreeView::OnPopupCommand(UINT nMenuID)
{	
	GetDocument()->m_pListView->SetRedraw(FALSE);
	switch (nMenuID)
	{
		case ID_TABLE_SCHEMA:
			GetDocument()->m_pListView->ShowTableSchema(m_ItemSel.GetText());
			break;
		case ID_TABLE_DATA:
			GetDocument()->m_pListView->ShowTableData(m_ItemSel.GetText());
			break;
		default:
			break;
	}
	GetDocument()->m_pListView->SetRedraw(TRUE);
}

void CMyTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();

	UINT nFlags;
	CPoint curPoint;
	GetCursorPos(&curPoint);
	ScreenToClient(&curPoint);
	m_ItemSel = ctlTree.HitTest(curPoint, &nFlags);

	UINT nImageID = m_ItemSel.GetImageID();
	switch (nImageID)
	{
		case IID_TABLE:
		case IID_VIEW:
			DoPopupMenu(IDR_POPUP_TABLE);
			break;
		default:
			break;
	}
	*pResult = 0;
}

void CMyTreeView::DoPopupMenu(UINT nMenuID)
{
	CMenu popMenu;
	popMenu.LoadMenu(nMenuID);
	CPoint posMouse;
	GetCursorPos(&posMouse);
	popMenu.GetSubMenu(0)->TrackPopupMenu(0,posMouse.x,posMouse.y,this);
	popMenu.DestroyMenu();
}

⌨️ 快捷键说明

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