aliasview.cpp

来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· C++ 代码 · 共 407 行

CPP
407
字号
// AliasView.cpp : implementation of the CAliasView class
//

#include "stdafx.h"
#include "DBExp.h"

#include "mainfrm.h"
#include "VicDoc.h"
#include "AliasView.h"
#include "CDBExpAliasManager.h"
#include "CDBExpAlias.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAliasView

IMPLEMENT_DYNCREATE(CAliasView, CTreeView)

BEGIN_MESSAGE_MAP(CAliasView, CTreeView)
	//{{AFX_MSG_MAP(CAliasView)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_WM_CONTEXTMENU()
	//}}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_MESSAGE(WM_DELETE_HITEM, OnDeleteHItem)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAliasView construction/destruction

//##ModelId=3C37414001C9
CAliasView::CAliasView()
{
	// TODO: add construction code here
	InitImageList();
}

//##ModelId=3C374140029C
CAliasView::~CAliasView()
{
}

//##ModelId=3C37414001E9
BOOL CAliasView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CAliasView drawing

//##ModelId=3C37414001DD
void CAliasView::OnDraw(CDC* pDC)
{
	CVicDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}


/////////////////////////////////////////////////////////////////////////////
// CAliasView printing

//##ModelId=3C3741400205
BOOL CAliasView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

//##ModelId=3C3741400237
void CAliasView::OnBeginPrinting(CDC *pDC /*pDC*/, CPrintInfo *pInfo /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

//##ModelId=3C3741400274
void CAliasView::OnEndPrinting(CDC *pDC /*pDC*/, CPrintInfo *pInfo /*pInfo*/)
{
	// TODO: add cleanup after printing
}

//##ModelId=3C3741400289
void CAliasView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();

	//修改TreeView中的树的风格。
	InitTreeCtrl();

	//设置TreeView中的TreeCtrl相关连的ImageList
	this->GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);

	BuildTreeRoot();

	const CTypedPtrList<CObList, CDBExpAlias*> *pList = &get_AliasManager().get_AliasList();

	POSITION pos = pList->GetHeadPosition();
	while(NULL != pos)
	{
		pList->GetAt(pos)->BuildTVITEM(this->GetTreeCtrl().GetRootItem());			

		HTREEITEM  hItem = this->GetTreeCtrl().InsertItem(&pList->GetAt(pos)->m_tvInsertStruct);
		ASSERT(NULL != hItem);

		pList->GetAt(pos)->Set_hItem(hItem);
		pList->GetNext(pos);
	}

	//打开第一层
	GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
	// TODO: You may populate your TreeView with items by directly accessing
	//  its tree control through a call to GetTreeCtrl().
}

/////////////////////////////////////////////////////////////////////////////
// CAliasView diagnostics

#ifdef _DEBUG
//##ModelId=3C37414002B0
void CAliasView::AssertValid() const
{
	CTreeView::AssertValid();
}

//##ModelId=3C37414002BB
void CAliasView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

//##ModelId=3C37414001D3
CVicDoc* CAliasView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVicDoc)));
	return (CVicDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CAliasView message handlers


//##ModelId=3C3969F002EE
CDBExpAliasManager& CAliasView::get_AliasManager()
{
	// TODO: Add your specialized code here.
	// NOTE: Requires a correct return value to compile.
	return GetDocument()->get_AliasManager();
}


//##ModelId=3C41296602DB
void CAliasView::BuildTreeRoot()
{
	CTreeCtrl &Ctrl = this->GetTreeCtrl();

	TVINSERTSTRUCT tvInsert;
	tvInsert.hParent		= NULL;
	tvInsert.hInsertAfter	= NULL;
	tvInsert.item.mask		= TVIF_TEXT | TVIF_IMAGE;
	tvInsert.item.pszText	= _T("DBExplorer V1.0");
	tvInsert.item.iImage	= 
		tvInsert.item.iSelectedImage = 0;
	
	HTREEITEM hRoot = Ctrl.InsertItem(&tvInsert);
}

//##ModelId=3C41296601D7
void CAliasView::InitImageList()
{
	//请在下面的这个数组中加入新的图标的ID
	static ImageIDBuf[] = {
		IDI_DBEXP_EX,
		IDI_DBEXP_DATABASE,

		IDI_DBEXP_PACKAGE,
		IDI_DBEXP_OPEN_PACKAGE,


		IDI_DBEXP_TABLE,
		IDI_DBEXP_VIEW,
		IDI_DBEXP_SP
	};

	const int BITMAP_WIDTH = 16;
	const int BITMAP_HEIGHT = BITMAP_WIDTH;

	m_ImageList.Create(BITMAP_WIDTH,
      BITMAP_HEIGHT,
      TRUE,   // list does not include masks
      _count_of(ImageIDBuf),
      0 );   // list will not grow


	HICON hIcon;

	for(int i = 0; i < _count_of(ImageIDBuf); i++)
	{
		hIcon = ::LoadIcon (AfxGetResourceHandle(), 
                   MAKEINTRESOURCE(ImageIDBuf[i]));
		ASSERT(NULL != hIcon);

		VERIFY( -1 != m_ImageList.Add(hIcon));
		::DeleteObject(hIcon);

	}
}

//##ModelId=3C412967005C


//##ModelId=3C41D26D01A5
void CAliasView::InitTreeCtrl()
{
	CTreeCtrl &Ctrl = this->GetTreeCtrl();
	//修改Tree Control 的风格
	Ctrl.ModifyStyle(0, TVS_HASBUTTONS | TVS_LINESATROOT
		| TVS_HASLINES | TVS_DISABLEDRAGDROP
		| TVS_SHOWSELALWAYS);
	
}

//##ModelId=3C41D26D01EB
void CAliasView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	CTreeCtrl *pTreeCtrl = &GetTreeCtrl();
	CDBTreeNode *pTreeNode = (CDBTreeNode *)pNMTreeView->itemNew.lParam;


	//if TreeNode is root then................
	if(pTreeCtrl->GetRootItem() == pNMTreeView->itemNew.hItem)
	{
		*pResult = 0;
		return;
	}
		
	ASSERT(pTreeNode);
	
	CDBTreeNode::m_pTreeCtrl = &this->GetTreeCtrl();
	pTreeNode->ExpandItem(pNMTreeView->itemNew.hItem, TVE_EXPAND);
	*pResult = 0;
}

//##ModelId=3C41D26D024F
void CAliasView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CTreeCtrl *pTree = (CTreeCtrl *)CTreeCtrl::FromHandle(pNMHDR->hwndFrom);

	ASSERT(pTree);
	pTree->AssertValid();

 	//在选择的那个Item上弹出菜单

	//get current cursor's screen pos
	CPoint point;
	::GetCursorPos(&point);
	//convert the screen pos to tree control relative pos
	pTree->ScreenToClient(&point);

 	UINT uFlags;
	//get item over which the cursor stop...
 	HTREEITEM hItem = pTree->HitTest(point, &uFlags);
 
 
 	DWORD dwData = 0;
 	if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
 	{
 		dwData = pTree->GetItemData(hItem);		
 	}
 	if(0 == dwData)
 		return;
 
	/*************************/
	//call popup menu...........
	/**************************/

 	CDBTreeNode *pDBTreeNode = NULL;
 	pDBTreeNode = (CDBTreeNode *)dwData;
 
 	ASSERT(pDBTreeNode);
 	pDBTreeNode->AssertValid();
 	
 	DBTREE_NODE_CONTEXT context;
 	//DBTREE_NODE_CONTEXT中要放入的有
 	//m_pos //当前的位置
 	//m_NodeType//当前的数据结点的类型。
 	//m_pParentWnd//当前的父窗口
 	
 	GetCursorPos(&context.m_pos);
 	context.m_pParentWnd = this;
 
 	pDBTreeNode->PopupContextMenu(context);	
	*pResult = 0;
}

//##ModelId=3C5B9BA00190

//##ModelId=3C5B9BA0019B
int CAliasView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	CDBTreeNode::m_pTreeCtrl = &this->GetTreeCtrl();
	ASSERT(CDBTreeNode::m_pTreeCtrl);
	return 0;
}


//##ModelId=3C5CC9C7031C
void CAliasView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnItemexpanding(pNMHDR, pResult);

	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	CTreeCtrl *pTreeCtrl = (CTreeCtrl *) CTreeCtrl::FromHandle(pNMTreeView->hdr.hwndFrom);
	CDBTreeNode *pTreeNode = (CDBTreeNode *)pNMTreeView->itemNew.lParam;


	//if TreeNode is root then................
	if(pTreeCtrl->GetRootItem() == pNMTreeView->itemNew.hItem)
	{
		*pResult = 0;
		return;
	}
		
	ASSERT(pTreeNode);
	pTreeNode->OpenRelatedView(0);
}

//##ModelId=3CA0A1F50128
LRESULT CAliasView::OnDeleteHItem(WPARAM wp, LPARAM lp)
{
	CTreeCtrl *pTreeCtrl = &this->GetTreeCtrl();

	pTreeCtrl->DeleteItem((HTREEITEM)wp);
	return 0;
}

void CAliasView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	CTreeCtrl *pTree = &this->GetTreeCtrl();

	ASSERT(pTree);
	pTree->AssertValid();

 	//在选择的那个Item上弹出菜单

	
//	//get the selected item...
 	HTREEITEM hItem = pTree->GetSelectedItem();
	if(0 == hItem)
		return;
 
 	DWORD dwData = 0;
	dwData = pTree->GetItemData(hItem);		

 	if(0 == dwData)
 		return;
 
	/*************************/
	//call popup menu...........
	/**************************/

 	CDBTreeNode *pDBTreeNode = NULL;
 	pDBTreeNode = (CDBTreeNode *)dwData;
 
 	ASSERT(pDBTreeNode);
 	pDBTreeNode->AssertValid();
 	
 	DBTREE_NODE_CONTEXT context;
 	//DBTREE_NODE_CONTEXT中要放入的有
 	//m_pos //当前的位置
 	//m_NodeType//当前的数据结点的类型。
 	//m_pParentWnd//当前的父窗口
	CRect rect(0, 0, 0, 0);
 	pTree->GetItemRect(hItem, rect, TRUE);
	point = rect.CenterPoint();
 	pTree->ClientToScreen(&point);

	context.m_pos.x = point.x;
	context.m_pos.y = point.y;
	
 	context.m_pParentWnd = this;
 
 	pDBTreeNode->PopupContextMenu(context);	
}

⌨️ 快捷键说明

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