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 + -
显示快捷键?