gusucode.com > ADO智能开发包C++源码程序 > ADO智能开发包/sfxdb_src_1.0.510.1/sfx/Source/db/src/DBNavigator.cpp
// DBRecordBar.cpp : implementation file // #include "stdafx.h" #include <shlwapi.h> #include "DBNavigator.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDBNavigator CDBNavigator::CDBNavigator() { m_pWnd = this; m_bCheck = false; } CDBNavigator::~CDBNavigator() { } BEGIN_MESSAGE_MAP(CDBNavigator, CToolBar) //{{AFX_MSG_MAP(CDBNavigator) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //工具条按钮:第一条,上一条,下一条,最后一条,添加,删除,修改。 BOOL CDBNavigator::InitButtons() { // ID_DB_FIRST = 1001, // ID_DB_PRIOR = 1002, // ID_DB_NEXT = 1003, // ID_DB_LAST = 1004, // ID_DB_INSERT = 1005, // ID_DB_DELETE = 1006, // ID_DB_REFRESH = 1007, // ID_DB_GOTO = 1008, #pragma warning(disable:4309) #pragma warning(disable:4305) TBBUTTON _Button[] = { {0, ID_DB_FIRST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_FIRST, 0}, {1, ID_DB_PRIOR, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_PRIOR, 0}, {2, ID_DB_NEXT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_NEXT, 0}, {3, ID_DB_LAST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_LAST, 0}, {-1, -1, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0}, {4, ID_DB_INSERT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_INSERT, 0}, {5, ID_DB_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_DELETE, 0}, {6, ID_DB_EDIT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_EDIT, 0}, {7, ID_DB_POST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_POST, 0}, }; #pragma warning(default:4309) #pragma warning(default:4305) int _Count = sizeof(_Button)/sizeof(TBBUTTON); GetToolBarCtrl().AddButtons(_Count, (LPTBBUTTON)_Button); SetCmdWnd(m_hWnd); TRACE(_T("------Buttons Count: %d"), GetToolBarCtrl().GetButtonCount()); //if (NULL != m_pRecordSet) //{ // EnableWindow(TRUE); //}else //{ // EnableWindow(FALSE); //} return TRUE; } void CDBNavigator::ShowText(bool bShow) { if (bShow) { SetButtonText(0, _T("第一条")); SetButtonText(1, _T("上一条")); SetButtonText(2, _T("下一条")); SetButtonText(3, _T("最后一条")); SetButtonText(5, _T("添加")); SetButtonText(6, _T("删除")); SetButtonText(7, _T("修改")); SetButtonText(8, _T("写入")); }else { SetButtonText(0, _T("")); SetButtonText(1, _T("")); SetButtonText(2, _T("")); SetButtonText(3, _T("")); SetButtonText(4, _T("")); SetButtonText(5, _T("")); SetButtonText(6, _T("")); SetButtonText(7, _T("")); } } void CDBNavigator::SetPos(int x, int y) { RECT Rect; RECT ToolBarRect={x,y,x,0}; int Count = GetToolBarCtrl().GetButtonCount(); if (Count>0) { GetItemRect(Count-1, &Rect); Rect.left = x; Rect.top = y; Rect.right += x; Rect.bottom += y; MoveWindow(&Rect); } } BOOL CDBNavigator::CreateCombo() { //CRect rect; //int _nIndex = 5; //CommandToIndex(ID_DB_GOTO); //HWND _hWndEdit = NULL; //SetButtonInfo(_nIndex, ID_DB_GOTO, TBBS_SEPARATOR, 120); //GetToolBarCtrl().GetItemRect(_nIndex, &rect); //rect.bottom -=1; //rect.top = 1; //rect.bottom = rect.top + 250; //if(!m_ComboBox.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN| // WS_VSCROLL|WS_TABSTOP|CBS_HASSTRINGS, rect, this, ID_DB_COMBOBOX)) //{ // TRACE(_T("-------建立CDBNavigator工具条失败。")); // return FALSE; //} //POINT pt={1, 1}; //_hWndEdit = ::ChildWindowFromPoint(m_ComboBox.m_hWnd, pt); //ASSERT(_hWndEdit); //VERIFY(SetEditType(_hWndEdit, EDIT_NUM)); return TRUE; } VOID CDBNavigator::UpdateUI() { CToolBarCtrl *_BarCtrl = &GetToolBarCtrl(); //if (adEditNone == m_pRecordSet->GetEditMode()) //{ //LONG _Pos = m_pRecordSet->GetAbsolutePosition(); //if (_Pos<=1) //指向了第一条记录。 //{ // _BarCtrl->EnableButton(ID_DB_FIRST, FALSE); // _BarCtrl->EnableButton(ID_DB_PRIOR, FALSE); //}else //{ // _BarCtrl->EnableButton(ID_DB_FIRST, TRUE); // _BarCtrl->EnableButton(ID_DB_PRIOR, TRUE); //} //if (_Pos>=m_pRecordSet->GetRecordCount()) //{ // _BarCtrl->EnableButton(ID_DB_NEXT, FALSE); // _BarCtrl->EnableButton(ID_DB_LAST, FALSE); //}else //{ // _BarCtrl->EnableButton(ID_DB_NEXT, TRUE); // _BarCtrl->EnableButton(ID_DB_LAST, TRUE); //} if (0>=m_pRecordSet->GetRecordCount()) { _BarCtrl->EnableButton(ID_DB_FIRST, FALSE); _BarCtrl->EnableButton(ID_DB_PRIOR, FALSE); _BarCtrl->EnableButton(ID_DB_NEXT, FALSE); _BarCtrl->EnableButton(ID_DB_LAST, FALSE); } if (m_pRecordSet->IsBof()) //指向了第一条记录。 { _BarCtrl->EnableButton(ID_DB_FIRST, FALSE); _BarCtrl->EnableButton(ID_DB_PRIOR, FALSE); }else { _BarCtrl->EnableButton(ID_DB_FIRST, TRUE); _BarCtrl->EnableButton(ID_DB_PRIOR, TRUE); } if (m_pRecordSet->IsEof()) { _BarCtrl->EnableButton(ID_DB_NEXT, FALSE); _BarCtrl->EnableButton(ID_DB_LAST, FALSE); }else { _BarCtrl->EnableButton(ID_DB_NEXT, TRUE); _BarCtrl->EnableButton(ID_DB_LAST, TRUE); } if (m_pRecordSet->GetEditChange()) { _BarCtrl->EnableButton(ID_DB_POST, TRUE); }else { _BarCtrl->EnableButton(ID_DB_POST, FALSE); } //} //把只读状态改为修改状态 INT nIndex = _BarCtrl->CommandToIndex(ID_DB_READ); if (-1 == nIndex) { nIndex = _BarCtrl->CommandToIndex(ID_DB_EDIT); _BarCtrl->EnableButton(ID_DB_EDIT, TRUE); }else { _BarCtrl->EnableButton(ID_DB_READ, TRUE); } if (m_pRecordSet->GetReadOnly()) { _BarCtrl->SetCmdID(nIndex, ID_DB_EDIT); SetButtonText(nIndex, _T("修改")); _BarCtrl->EnableButton(ID_DB_INSERT, FALSE); _BarCtrl->EnableButton(ID_DB_DELETE, FALSE); _BarCtrl->EnableButton(ID_DB_POST, FALSE); }else { _BarCtrl->SetCmdID(nIndex, ID_DB_READ); SetButtonText(nIndex, _T("只读")); _BarCtrl->EnableButton(ID_DB_INSERT, TRUE); _BarCtrl->EnableButton(ID_DB_DELETE, TRUE); } } // BOOL ListBox_FindStringAdd(HWND hWndCtrl, LPCWSTR lpszString) { return TRUE; } //HRESULT CDBNavigator::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam) //{ // //if (nMsg==WM_LS_DATA) // //{ // // OnLsData(wParam, lParam); // //} // return CTrueColorToolBar::WindowProc(nMsg, wParam, lParam); //} BOOL CDBNavigator::OnCommand(WPARAM wParam, LPARAM lParam) { TRACE(_T("---------RecordBar ID:%d\n"), LOWORD(wParam)); m_bCheck = true; try { switch(LOWORD(wParam)) { case ID_DB_FIRST: //第一个。 { m_pRecordSet->MoveFirst(); TRACE(_T("-------记录指针指向第一个.\n")); }break; case ID_DB_PRIOR: //上一个。 { m_pRecordSet->MovePrevious(); TRACE(_T("-------记录指针向上移动一个。\n")); }break; case ID_DB_NEXT: //下一个 { TRACE(_T("-------记录指针向下移动一个。\n")); m_pRecordSet->MoveNext(); }break; case ID_DB_LAST: //最后一个。 { m_pRecordSet->MoveLast(); TRACE(_T("-------记录指针指向最后一条。\n")); }break; case ID_DB_DELETE: { m_bCheck = false; ASSERT(NULL != m_pWnd); if (DeleteRecordHint(m_pWnd->m_hWnd, m_pRecordSet->GetAbsolutePosition())) { if (m_pRecordSet->Delete()) m_bCheck = true; } }break; case ID_DB_INSERT: { VERIFY(m_pRecordSet->AddNew()); }break; case ID_DB_EDIT: { if (m_pRecordSet->GetReadOnly()) { //把只读状态改为修改状态 m_pRecordSet->SetReadOnly(false); } }break; case ID_DB_READ: { if (!m_pRecordSet->GetReadOnly()) { //把修改状态改为只读状态 m_pRecordSet->SetReadOnly(true); } }break; case ID_DB_POST: { ASSERT(NULL != m_pRecordSet); m_pRecordSet->Update(); }break; default: { m_bCheck = false; return CToolBar::OnCommand(wParam, lParam); } } if (m_bCheck) { UpdateUI(); } }catch (_com_error &e) { m_bCheck = false; adoShowComError(m_hWnd, e); } m_bCheck = false; return FALSE; } void CDBNavigator::EnableButtons(BOOL bEnable) { CToolBarCtrl *_BarCtrl = &GetToolBarCtrl(); int iIndex = 0; TBBUTTON tb; if ((NULL != _BarCtrl) && (NULL != _BarCtrl->m_hWnd)) { for (; iIndex<_BarCtrl->GetButtonCount(); iIndex++) { _BarCtrl->GetButton(iIndex, &tb); _BarCtrl->EnableButton(tb.idCommand, bEnable); } } } void CDBNavigator::_OnElseCMDEvents(BASE_CMD nCMD, LPARAM lParam) { ASSERT(NULL != m_pWnd); switch(nCMD) { case BC_CLEAR: return; case BC_READONLY: { if (m_pRecordSet->IsOpen()) { UpdateUI(); }else { EnableButtons(FALSE); } }return; case BC_EDITCHANGE: { if ((BOOL)lParam) { GetToolBarCtrl().EnableButton(ID_DB_POST, FALSE); }else { GetToolBarCtrl().EnableButton(ID_DB_POST, TRUE); } }break; } CDBBaseControl::_OnElseCMDEvents(nCMD, lParam); } BOOL CDBNavigator::SetAdoRecordset(CAdoRecordset *pRecordset) { if (CDBBaseControl::SetAdoRecordset(pRecordset)) { EnableButtons(TRUE); return TRUE; } EnableButtons(FALSE); return FALSE; } void CDBNavigator::virDataChange() //数据改变了 { if (!m_bCheck) { UpdateUI(); } } void CDBNavigator::virDataWrite() { UpdateUI(); } void CDBNavigator::UpdateField() { UpdateUI(); }