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

📄 dbtreeview.cpp.txt

📁 minidatabase一个小型的数据库管理系统。有创建数据库
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#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("内存分配失败!"), _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 + -