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

📄 demo_usertreeview.cpp

📁 使用yacc的一个例子
💻 CPP
字号:
// Demo_UserTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "SdbmsDemo.h"
#include "Demo_UserTreeView.h"
#include "Demo_WorkspaceBar.h"
#include "MainFrm.h"
#include "Sdbms.h"

extern CSdbms g_sdbms;

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

/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView

IMPLEMENT_DYNCREATE(CDemo_UserTreeView, CTreeView)

CDemo_UserTreeView::CDemo_UserTreeView()
{
	m_ImageList.Create(IDB_USER_TREEVIEW, 19, 1, RGB(255,255,255));
}

CDemo_UserTreeView::~CDemo_UserTreeView()
{
}


BEGIN_MESSAGE_MAP(CDemo_UserTreeView, CTreeView)
	//{{AFX_MSG_MAP(CDemo_UserTreeView)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteitem)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView drawing

void CDemo_UserTreeView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView message handlers

void CDemo_UserTreeView::OnInitialUpdate() 
{
	CTreeView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
}

BOOL CDemo_UserTreeView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	cs.style |= (TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_TRACKSELECT);
	return CTreeView::PreCreateWindow(cs);
}

void CDemo_UserTreeView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CTreeCtrl& ctrl = GetTreeCtrl();
	CMainFrame *pMainWnd = (CMainFrame*)AfxGetMainWnd();

	HTREEITEM hItem = ctrl.GetSelectedItem();
	TREE_ITEM_DATA *pItemData = (TREE_ITEM_DATA*)ctrl.GetItemData(hItem);
	if	(pItemData)
	{
		switch(pItemData->m_nType)
		{
		case	IT_USER:
			pMainWnd->m_wndOutputBar.OutputUserInformation(pItemData->m_pUser);
			break;
		case	IT_ROLE:
			pMainWnd->m_wndOutputBar.OutputRoleInformation(pItemData->m_pRole, pItemData->m_pDatabase);
			break;
		case	IT_TABLE:
			pMainWnd->m_wndOutputBar.OutputRoleInformation(pItemData->m_pTable, pItemData->m_pDatabase);
			break;
		default:
			ASSERT(FALSE);
		}
	}

	*pResult = 0;
}

void CDemo_UserTreeView::UpdateView()
{
	CTreeCtrl& ctrl = GetTreeCtrl();
	TREE_ITEM_DATA *pItemData = NULL;
	HTREEITEM hUserItem, hRoleItem;

	//删除以前的所有项
	ctrl.DeleteAllItems();

	//添加所有的用户
	POSITION pos = g_sdbms.m_UserList.GetHeadPosition();
	while (pos)	//遍历用户列表
	{
		CSdbms_User *pUser = g_sdbms.m_UserList.GetNext(pos);

		pItemData = new TREE_ITEM_DATA(pUser);
		hUserItem = ctrl.InsertItem(pUser->m_strUserName, 0, 0);
		ctrl.SetItemData(hUserItem, (DWORD)pItemData);

		//添加用户所属的所有角色
		POSITION pos2 = g_sdbms.m_RoleUserList.GetHeadPosition();
		while (pos2)	//遍历系统预定义角色
		{
			CSdbms_RoleUser *pRoleUser = g_sdbms.m_RoleUserList.GetNext(pos2);
			if	(pRoleUser->m_pUser == pUser)
			{
				pItemData = new TREE_ITEM_DATA(pRoleUser->m_pRole);
				hRoleItem = ctrl.InsertItem(pRoleUser->m_pRole->m_strRoleName, 1, 1, hUserItem);
				ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
			}
		}

		pos2 = g_sdbms.m_DBList.GetHeadPosition();
		while (pos2)	//遍历数据库列表,添加数据库内的自定义角色
		{
			CSdbms_Database *pDB = g_sdbms.m_DBList.GetNext(pos2);
			if	(!pDB->m_bInit)
				pDB->Init();

			if	(pDB->IsDBCreator(pUser->m_nUserID))	//数据库OWNER角色
			{
				pItemData = new TREE_ITEM_DATA((CSdbms_Role*)NULL, pDB);//m_pRole=NULL, m_pDatabase=pDB
				hRoleItem = ctrl.InsertItem(pDB->m_strDBName + ".OWNER", 1, 1, hUserItem);
				ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
			}

			for	(int i=0; i<pDB->m_TableArray.GetSize(); i++)	//遍历数据库中的表
			{
				CSdbms_Table *pTable = pDB->m_TableArray[i];
				if	(pTable->IsTableCreator(pUser->m_nUserID))	//表OWNER角色
				{
					pItemData = new TREE_ITEM_DATA(pTable, pDB);//m_pTable=pTable, m_pDatabase=pDB
					hRoleItem = ctrl.InsertItem(pDB->m_strDBName + "." + pTable->m_strTableName + ".OWNER", 1, 1, hUserItem);
					ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
				}
			}

			POSITION pos3 = pDB->m_UserRoleList.GetHeadPosition();
			while (pos3)	//遍历数据库中的自定义角色
			{
				CSdbms_RoleUser *pUserRole = pDB->m_UserRoleList.GetNext(pos3);
				if	((pUserRole->m_pUser == pUser) &&
					 (pUserRole->m_pRole->m_strRoleName.CompareNoCase(SYSTEM_ROLE_OWNER) != 0))//不是系统角色
				{
					pItemData = new TREE_ITEM_DATA(pUserRole->m_pRole, pDB);//
					hRoleItem = ctrl.InsertItem(pDB->m_strDBName + "." + pUserRole->m_pRole->m_strRoleName, 1, 1, hUserItem);
					ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
				}
			}
		}
	}
}

void CDemo_UserTreeView::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	CTreeCtrl& ctrl = GetTreeCtrl();
	HTREEITEM hItem = pNMTreeView->itemOld.hItem;
	TREE_ITEM_DATA *pItemData = (TREE_ITEM_DATA*)ctrl.GetItemData(hItem);
	if	(pItemData)
		delete pItemData;
	
	*pResult = 0;
}

⌨️ 快捷键说明

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