?? dbtreeview.cpp.txt
字號:
#ifdef _DEBUG
void CDbTreeView::AssertValid() const
{
CView::AssertValid();
}
void CDbTreeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDbTreeView message handlers
void CDbTreeView::OnUpdateIndicatorCRLF(CCmdUI* pCmdUI)
{
pCmdUI->SetText(NULL);
pCmdUI->Enable(FALSE);
}
void CDbTreeView::OnUpdateIndicatorOvr(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}
int CDbTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CRect rcClient;
GetClientRect(&rcClient);
// 創建樹形控件
DWORD dwStyles = WS_VISIBLE | WS_CHILD
| TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT
| TVS_SHOWSELALWAYS | TVS_INFOTIP | TVS_DISABLEDRAGDROP;
rcClient.left += 5;
rcClient.top += 5;
m_treeCtrl.Create(dwStyles, rcClient, this, IDC_TREE_CTRL);
m_imageList.Create(IDB_TREE_ICON, 16, 1, RGB(255, 255, 255));
m_treeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL);
return 0;
}
void CDbTreeView::OnDestroy()
{
ClearTree();
CView::OnDestroy();
}
void CDbTreeView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rcClient;
GetClientRect(&rcClient);
// Tree control
rcClient.left += 5;
rcClient.top += 5;
m_treeCtrl.MoveWindow(rcClient, TRUE);
}
// 樹事件處理
void CDbTreeView::OnSelchangedTreeCtrl(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW *)pNMHDR;
// TODO: Add your control notification handler code here
if (pNMTreeView->itemNew.hItem)
{
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(pNMTreeView->itemNew.hItem);
if (nd)
{
if (nd->type != DATA_TYPE_TABLE)
{
HTREEITEM hItem = m_treeCtrl.GetParentItem(pNMTreeView->itemNew.hItem);
if (hItem)
nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
}
if (nd->type == DATA_TYPE_TABLE)
{
CMainFrame *mf = (CMainFrame *)GetParentFrame();
mf->m_pEditDbView[1]->PostMessage(WM_SET_DATA, (WPARAM)nd->data, 0);
}
}
}
*pResult = 0;
}
void CDbTreeView::OnDblclkTreeCtrl(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem)
{
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd)
{
switch (nd->type)
{
case DATA_TYPE_TABLE:
PostMessage(WM_COMMAND, ID_EDIT_TABLE, 0);
break;
case DATA_TYPE_FIELD:
PostMessage(WM_COMMAND, ID_EDIT_FIELD, 0);
break;
case DATA_TYPE_KEY:
PostMessage(WM_COMMAND, ID_EDIT_KEY, 0);
break;
}
}
}
*pResult = 0;
}
void CDbTreeView::OnRclickTreeCtrl(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
POINT ptCursor;
::GetCursorPos(&ptCursor);
// 獲取當前鼠標指定的項目
{
CPoint ptWnd(ptCursor);
::MapWindowPoints(NULL, m_treeCtrl.GetSafeHwnd(), &ptWnd, 1);
UINT flags;
HTREEITEM hItem = m_treeCtrl.HitTest(ptWnd, &flags);
if (hItem)
m_treeCtrl.SelectItem(hItem);
}
// 彈出菜單
CMenu menu, *pSubMenu;
int nMenuHeight = GetSystemMetrics(SM_CYMENUSIZE) * 4, cy = GetSystemMetrics(SM_CYSCREEN);
// Clicking with right button brings up a context menu
if (!menu.LoadMenu(IDR_POPUP_FORM)) return;
if (!(pSubMenu = menu.GetSubMenu(0))) return;
// 可以進行的功能
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
NODE_DATA *nd = NULL;
if (hItem)
nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
{
pSubMenu->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(2, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(4, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(5, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(6, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(8, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(9, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(10, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(12, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(13, MF_BYPOSITION | MF_GRAYED);
}
else
{
HTREEITEM hNext;
switch (nd->type)
{
case DATA_TYPE_TABLE:
pSubMenu->EnableMenuItem(4, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(6, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(8, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(10, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(12, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(13, MF_BYPOSITION | MF_GRAYED);
break;
case DATA_TYPE_FIELD:
pSubMenu->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(2, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(8, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(10, MF_BYPOSITION | MF_GRAYED);
if (m_treeCtrl.GetPrevSiblingItem(hItem) == NULL)
pSubMenu->EnableMenuItem(12, MF_BYPOSITION | MF_GRAYED);
if ((hNext = m_treeCtrl.GetNextSiblingItem(hItem)) == NULL)
pSubMenu->EnableMenuItem(13, MF_BYPOSITION | MF_GRAYED);
else
{
NODE_DATA *tmp = (NODE_DATA *)m_treeCtrl.GetItemData(hNext);
if (tmp == NULL || tmp->type != DATA_TYPE_FIELD)
pSubMenu->EnableMenuItem(13, MF_BYPOSITION | MF_GRAYED);
}
break;
case DATA_TYPE_KEY:
pSubMenu->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(2, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(4, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(6, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(12, MF_BYPOSITION | MF_GRAYED);
pSubMenu->EnableMenuItem(13, MF_BYPOSITION | MF_GRAYED);
break;
}
}
if ((ptCursor.y + nMenuHeight) > cy)
ptCursor.y = cy - nMenuHeight - 5;
// Display and track the popup menu
::TrackPopupMenu(pSubMenu->m_hMenu, 0, ptCursor.x, ptCursor.y, 0,
GetSafeHwnd(), NULL);
// BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"
PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
*pResult = 0;
}
void CDbTreeView::OnGetInfoTipTreeCtrl(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTVGETINFOTIP *tip = (NMTVGETINFOTIP *)pNMHDR;
if (tip->hItem)
{
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(tip->hItem);
if (nd)
{
m_strTip.Empty();
switch (nd->type)
{
case DATA_TYPE_TABLE:
{
TABLE *table = (TABLE *)nd->data;
m_strTip.Format(_T("表%s\n最大容量\t= %u條\n已使用\t\t= %u條\n記錄長度\t= %u字節\n字段個數\t= %u個\n索引個數\t= %u個"),
table->name, table->max_rows, table->used_rows, table->record_size,
table->field_count, table->key_count);
}
break;
case DATA_TYPE_FIELD:
{
FIELD *f = (FIELD *)nd->data;
m_strTip.Format(_T("類型:%s"), GetFieldType(f));
}
break;
case DATA_TYPE_KEY:
{
KEY *k = (KEY *)nd->data;
m_strTip.Format(_T("%s索引"), (k->flags & KF_NO_SAME) ? _T("唯一") : _T("普通"));
}
break;
}
tip->pszText = (LPTSTR)(LPCTSTR)m_strTip;
tip->cchTextMax = m_strTip.GetLength();
}
}
*pResult = 0;
}
void CDbTreeView::OnFileNew(WPARAM wParam, LPARAM lParam)
{
// 清除原來的數據庫
ClearTree();
// 設置當前使用的內存
if (m_pEditMemory == NULL)
{
MessageBox(_T("內存分配失?。?quot;), _T("提示信息"), MB_ICONSTOP | MB_OK);
return;
}
RestartMemory();
// 初始化一個表
init_my_db(&m_hashEditDb, NULL);
}
void CDbTreeView::OnFileOpen(WPARAM wParam, LPARAM lParam)
{
// 設置當前使用的內存
if (m_pEditMemory == NULL)
{
MessageBox(_T("內存分配失??!"), _T("提示信息"), MB_ICONSTOP | MB_OK);
return;
}
RestartMemory();
UINT r = init_my_db(&m_hashEditDb, (char *)(LPCTSTR)m_strDbFile);
if (r > 0) // 錯誤
{
CString str;
str.Format(_T("數據庫錯誤:\n%s"), my_get_last_error());
MessageBox(str, _T("提示信息"), MB_ICONSTOP | MB_OK);
}
else
LoadDb();
}
void CDbTreeView::OnEditTable()
{
// TODO: Add your command handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem == NULL)
return;
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
return;
TABLE *table = (TABLE *)nd->data;
CTableDlg dlg(this, table);
if (dlg.DoModal() == IDOK)
{
if (stricmp(table->name, dlg.m_strTableName) != 0)
{
if (_PM(table->name))
delete table->name;
table->name = new char[dlg.m_strTableName.GetLength() + 1];
strcpy(table->name, dlg.m_strTableName);
table->name_length = dlg.m_strTableName.GetLength();
m_treeCtrl.SetItemText(hItem, dlg.m_strTableName);
}
table->max_rows = dlg.m_nMaxRows;
table->flags &= ~TF_TABLE_LOCK;
table->flags |= dlg.m_bIsLockTable ? TF_TABLE_LOCK : 0;
}
}
void CDbTreeView::OnCreateTable()
{
// TODO: Add your command handler code here
CTableDlg dlg(this, NULL);
if (dlg.DoModal() == IDOK)
{
TABLE *table = new TABLE;
if (table == NullS)
return;
memset(table, 0, sizeof(TABLE));
table->name = new char[dlg.m_strTableName.GetLength() + 1];
table->name_length = (ushort)dlg.m_strTableName.GetLength();
strcpy(table->name, dlg.m_strTableName);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -