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