📄 childfrm.cpp
字号:
UNUSED_ALWAYS(lParam);
CMSFlexGrid* pGridCtrl = NULL;
try
{
pGridCtrl = new CMSFlexGrid();
ASSERT(pGridCtrl != NULL);
m_ThreadParam.m_pGridCtrl = NULL;
m_ThreadParam.m_ptrGridCtrl = NULL;
CRect rect(0, 0, 0, 0);
m_pResultView->GetWindowRect(&rect);
if(!pGridCtrl->Create(g_lpszProgID, WS_CHILD | WS_VISIBLE | WS_HSCROLL |
WS_VSCROLL, rect, m_pResultView, m_nID++, NULL, FALSE,
L"72E67120-5959-11cf-91F6-C2863C385E30"))
{
TRACE(_T("Failed to create GridCtrl.\n"));
lResult = -1L;
}
else
{
pGridCtrl->ShowWindow(SW_HIDE);
m_GridList.AddTail(pGridCtrl);
m_nGridCount = m_GridList.GetCount();
if(m_nGridCount == 1)
if(GetFocus() == m_pResultView)
m_pQryView->SetFocus();
m_ThreadParam.m_pGridCtrl = pGridCtrl;
m_ThreadParam.m_ptrGridCtrl = pGridCtrl->GetControlUnknown();
if(m_nIndex == 0)
m_pResultView->m_pGridCtrl = pGridCtrl;
m_ThreadParam.m_ptrGridCtrl->put_BackColorBkg(
(unsigned long)RGB(255, 255, 255)
);
m_ThreadParam.m_ptrGridCtrl->put_BorderStyle(
MSFlexGridLib::flexBorderNone
);
m_ThreadParam.m_ptrGridCtrl->put_AllowUserResizing(
MSFlexGridLib::flexResizeColumns
);
m_ThreadParam.m_ptrGridCtrl->put_FocusRect(
MSFlexGridLib::flexFocusNone
);
m_ThreadParam.m_ptrGridCtrl->put_HighLight(
MSFlexGridLib::flexHighlightAlways
);
m_ThreadParam.m_ptrGridCtrl->put_ScrollBars(
MSFlexGridLib::flexScrollBarBoth
);
if(m_GridFont.m_lf.lfHeight != 0)
{
COleFont font(pGridCtrl->GetFont());
font.SetBold(m_GridFont.m_bIsBold);
font.SetCharset(m_GridFont.m_lf.lfCharSet);
font.SetItalic(m_GridFont.m_lf.lfItalic);
font.SetName(m_GridFont.m_strFaceName);
CY cy;
cy.Lo = m_GridFont.m_nSize;
cy.Hi = 0;
cy.int64 = cy.Lo;
font.SetSize(cy);
font.SetUnderline(m_GridFont.m_lf.lfUnderline);
font.SetWeight(m_GridFont.m_lf.lfWeight);
}
m_ThreadParam.m_ptrGridCtrl->put_Cols(0);
m_ThreadParam.m_ptrGridCtrl->put_Rows(1);
m_ThreadParam.m_ptrGridCtrl->put_Cols(wParam);
if(m_nGridCount == 2)
{
POSITION pos = m_GridList.FindIndex(m_nIndex);
if(pos != NULL)
{
++m_nIndex;
if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), m_nIndex);
bool bOkUI = true;
if(m_bCloseMainFrameAfterCancel)
bOkUI = false;
if(m_bDisconnectAllAfterCancel)
bOkUI = false;
if(m_bCloseAfterCancel)
bOkUI = false;
if(bOkUI)
{
LONG lIdle = 0;
while(AfxGetApp()->OnIdle(lIdle++));
}
}
}
pGridCtrl->MoveWindow(0, 0, rect.Width(), rect.Height());
}
}
catch(COleDispatchException* e)
{
lResult = -1L;
if(e)
e->Delete();
}
catch(const _com_error& e)
{
lResult = -1L;
TRACE(_T("%s\n"), (LPCTSTR)GetComError(e));
}
catch(...)
{
lResult = -1L;
}
if(lResult == -1L)
{
if(pGridCtrl != NULL)
{
pGridCtrl->DestroyWindow();
delete pGridCtrl;
pGridCtrl = NULL;
}
}
}
return lResult;
}
LONG CChildFrame::OnSetGridRows(UINT wParam, LONG lParam)
{
LRESULT lResult = 0L;
if(::IsWindow(m_hWnd))
{
UNUSED_ALWAYS(lParam);
try
{
if(m_ThreadParam.m_ptrGridCtrl != NULL)
{
m_pResultView->SetRedraw(FALSE);
HRESULT hr = m_ThreadParam.m_ptrGridCtrl->put_Redraw(FALSE);
if(FAILED(hr))
_com_issue_error(hr);
hr = m_ThreadParam.m_ptrGridCtrl->put_Rows(wParam);
if(FAILED(hr))
_com_issue_error(hr);
hr = m_ThreadParam.m_ptrGridCtrl->put_Redraw(TRUE);
if(FAILED(hr))
_com_issue_error(hr);
m_pResultView->SetRedraw(TRUE);
if(m_nGridCount == 1)
if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
m_ThreadParam.m_pGridCtrl->ShowWindow(SW_SHOW);
}
}
catch(const _com_error& e)
{
lResult = -1L;
TRACE(_T("%s\n"), (LPCTSTR)GetComError(e));
}
catch(...)
{
lResult = -1L;
}
}
return lResult;
}
void CChildFrame::OnViewMessages()
{
if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
{
HideResultSets();
m_pResultView->GetRichEditCtrl().SetWindowText(m_strMessages.c_str());
m_strStatusText = g_szMessages;
}
else
{
if(m_strProcText.length())
{
m_pResultView->SetWrapNone();
m_pResultView->GetRichEditCtrl().SetWindowText(m_strProcText.c_str());
m_pResultView->GetRichEditCtrl().SetSel(0, 0); // Scroll up!
m_strStatusText.Format(
_T("# of lines of text: %d"),
m_pResultView->GetRichEditCtrl().GetLineCount()
);
}
else
{
int nCurrentSet = 1;
if(m_nIndex != 0)
nCurrentSet = m_nIndex;
POSITION pos = m_GridList.FindIndex(nCurrentSet-1);
if(pos == NULL)
{
m_pResultView->GetRichEditCtrl().SetWindowText(NULL);
m_strStatusText = "Results grid #0 of 0; 0 row(s); 0 col(s)";
}
else
{
CMSFlexGrid* pGrid = (CMSFlexGrid*)m_GridList.GetAt(pos);
if(pGrid != NULL)
DisplayResults(pGrid, nCurrentSet);
}
}
}
m_pResultView->Invalidate();
m_pResultView->UpdateWindow();
}
void CChildFrame::OnUpdateViewMessages(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_lConnectionState == ADODB::adStateOpen && m_strMessages.length());
pCmdUI->SetCheck(!m_strStatusText.CompareNoCase(g_szMessages) &&
m_lConnectionState == ADODB::adStateOpen && m_strMessages.length());
}
bool CChildFrame::SelectDataBaseEx()
{
bool bRet = true;
CloseRecordset();
try
{
long lOption = ADODB::adCmdText;
_bstr_t bstr = L"select db_name()";
HRESULT hr = m_ptrRecordset->Open(
bstr,
m_ptrConnection.GetInterfacePtr(),
ADODB::adOpenForwardOnly,
ADODB::adLockReadOnly,
lOption
);
if(FAILED(hr))
_com_issue_error(hr);
if(m_ptrRecordset->State != ADODB::adStateClosed)
{
if(!m_ptrRecordset->adoBOF)
{
_bstr_t bstrDBName = (_bstr_t)m_ptrRecordset->
Fields->GetItem((long)0)->Value;
ADODB::PropertiesPtr ptrProperties = m_ptrConnection->GetProperties();
HRESULT hr = ptrProperties->Refresh();
if(FAILED(hr))
_com_issue_error(hr);
ADODB::PropertyPtr ptrProperty = ptrProperties->GetItem("Current Catalog");
hr = ptrProperty->put_Value(_variant_t((LPCTSTR)bstrDBName));
if(FAILED(hr))
_com_issue_error(hr);
m_comboBox.SelectString(-1, (m_strDBName = (LPCTSTR)bstrDBName));
}
}
}
catch(const _com_error& e)
{
CString sMsg = GetProviderError();
if(!sMsg.IsEmpty())
TRACE(_T("%s\n"), (LPCTSTR)sMsg);
else
{
sMsg = GetComError(e);
TRACE(_T("%s\n"), (LPCTSTR)sMsg);
}
bRet = false;
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
CloseRecordset();
return bRet;
}
void CChildFrame::OnTimer(UINT nIDEvent)
{
if(m_nTimerID != nIDEvent)
CMDIChildWnd::OnTimer(nIDEvent);
else
{
if(m_bExecuting)
{
SetExecutionTime();
if(!m_bProcText)
SetResultSetInfo();
}
}
}
void CChildFrame::SetResultSetInfo()
{
if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
{
int nCurrentSet = 1;
if(m_nIndex != 0)
nCurrentSet = m_nIndex;
POSITION pos = m_GridList.FindIndex(nCurrentSet-1);
if(pos != NULL)
{
CMSFlexGrid* pGrid = (CMSFlexGrid*)m_GridList.GetAt(pos);
if(pGrid != NULL)
{
m_strStatusText.Format(_T("Results grid #%d of %d; %d row(s); %d col(s)"),
nCurrentSet, m_nGridCount, pGrid->GetRows()-1, pGrid->GetCols());
m_wndStatusBar.SetPaneText(m_nResultSetPaneNo, m_strStatusText);
}
}
}
}
void CChildFrame::CloseRecordset()
{
try
{
if(m_ptrRecordset->State != ADODB::adStateClosed)
{
HRESULT hr = m_ptrRecordset->Close();
if(FAILED(hr))
_com_issue_error(hr);
}
}
catch(const _com_error& e)
{
CString sMsg = GetProviderError();
if(sMsg.IsEmpty())
sMsg = GetComError(e);
TRACE(_T("%s\n"), (LPCTSTR)sMsg);
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
}
void CChildFrame::OnSetDbcomboFocus()
{
m_comboBox.SetFocus();
}
void CChildFrame::PostNcDestroy()
{
CWaitCursor wait;
ClearGridList();
if(m_font.m_hObject != NULL)
{
m_font.Detach();
m_font.m_hObject = NULL;
}
try
{
HRESULT hr = S_OK;
if(m_ptrConnection != NULL)
{
hr = m_ptrConnection->Close();
if(FAILED(hr))
_com_issue_error(hr);
}
if(m_ptrCommand != NULL)
{
m_ptrCommand.Release();
m_ptrCommand = NULL;
}
if(m_ptrRecordset != NULL)
{
m_ptrRecordset.Release();
m_ptrRecordset = NULL;
}
if(m_ptrConnection != NULL)
{
try
{
hr = ClearConnectionEvents();
if(FAILED(hr))
_com_issue_error(hr);
}
catch(const _com_error& e)
{
CString sMsg = GetProviderError();
if(sMsg.IsEmpty())
sMsg = GetComError(e);
TRACE(_T("ClearConnectionEvents: %s\n"), (LPCTSTR)sMsg);
try
{
if(m_pCE != NULL)
{
delete m_pCE;
m_pCE = NULL;
}
}
catch(...)
{
}
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
try
{
if(m_pCE != NULL)
{
delete m_pCE;
m_pCE = NULL;
}
}
catch(...)
{
}
}
m_ptrConnection.Release();
m_ptrConnection = NULL;
}
}
catch(const _com_error& e)
{
CString sMsg = GetProviderError();
if(sMsg.IsEmpty())
sMsg = GetComError(e);
TRACE(_T("%s\n"), (LPCTSTR)sMsg);
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
if(m_nTimerID != 0)
{
if(::IsWindow(this->m_hWnd))
KillTimer(m_nTimerID);
m_nTimerID = 0;
}
if(m_pThreadCancelSQL != NULL &&
AfxIsValidAddress(m_pThreadCancelSQL, sizeof(m_pThreadCancelSQL)) &&
m_pThreadCancelSQL->m_hThread != NULL)
{
m_pThreadCancelSQL->PostThreadMessage(WM_QUIT, 0L, 0L);
::WaitForSingleObject(m_pThreadCancelSQL->m_hThread, 30000);
}
if(m_pThreadExecuteSQL != NULL &&
AfxIsValidAddress(m_pThreadExecuteSQL, sizeof(m_pThreadExecuteSQL)) &&
m_pThreadExecuteSQL->m_hThread != NULL)
{
m_pThreadExecuteSQL->PostThreadMessage(WM_QUIT, 0L, 0L);
::WaitForSingleObject(m_pThreadExecuteSQL->m_hThread, 30000);
}
CMDIChildWnd::PostNcDestroy();
}
void CChildFrame::OnClose()
{
bool bOKToClose = true;
if(m_bCanceling)
m_bCloseAfterCancel = TRUE;
else
{
if(IsIconic())
ShowWindow(SW_SHOWNORMAL);
if(!m_strSQL.IsEmpty() || m_bExecuting)
{
CString sMsg = "A query execution is in progress. Are you sure you wish to cancel this query?";
if(AfxMessageBox(sMsg, MB_YESNO | MB_ICONQUESTION) == IDNO)
bOKToClose = false;
else
{
if(!m_bCanceling)
{
m_bCloseAfterCancel = TRUE;
CancelQuery();
bOKToClose = false;
}
}
}
}
if(m_bCanceling)
if(!m_bCanceled)
bOKToClose = false;
if(bOKToClose)
CMDIChildWnd::OnClose();
}
/////////////////////////////////////////////////////////////////////////////
// ADO Events
HRESULT CChildFrame::SetConnectionEvents()
{
IConnectionPointContainer* pCPC = NULL;
HRESULT hr = m_ptrConnection->QueryInterface(
IID_IConnectionPointContainer, (LPVOID*)&pCPC
);
if(FAILED(hr))
return hr;
IConnectionPoint* pCP = NULL;
hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
pCPC->Release();
if(FAILED(hr))
return hr;
m_pCE = new CQryToolConnectionEvents(this);
hr = pCP->Advise(m_pCE, &m_dwCnEvents);
pCP->Release();
return hr;
}
HRESULT CChildFrame::ClearConnectionEvents()
{
IConnectionPointContainer* pCPC = NULL;
HRESULT hr = m_ptrConnection->QueryInterface(
IID_IConnectionPointContainer, (LPVOID *) &pCPC
);
if(FAILED(hr))
return hr;
IConnectionPoint* pCP = NULL;
hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
pCPC->Release();
if(FAILED(hr))
return hr;
hr = pCP->Unadvise(m_dwCnEvents);
pCP->Release();
return hr;
}
/////////////////////////////////////////////////////////////////////////////
// Helpers for saving/restoring font state
void CChildFrame::GetProfileFont(LPCTSTR szSec, LOGFONT* plf, const bool& bGrid,
BOOL* pIsBold, int* pSize)
{
CWinApp* pApp = AfxGetApp();
plf->lfHeight = pApp->GetProfileInt(szSec, g_szHeight, 0);
if(plf->lfHeight != 0)
{
plf->lfWeight = pApp->GetProfileInt(szSec, g_szWeight, 0);
plf->lfItalic = (BYTE)pApp->GetProfileInt(szSec, g_szItalic, 0);
plf->lfUnderline = (BYTE)pApp->GetProfileInt(szSec, g_szUnderline, 0);
plf->lfPitchAndFamily = (BYTE)pApp->GetProfileInt(szSec, g_szPitchAndFamily, 0);
plf->lfCharSet = (BYTE)pApp->GetProfileInt(szSec, g_szCharSet, DEFAULT_CHARSET);
CString strFont = pApp->GetProfileString(szSec, g_szFaceName, g_szSystem);
lstrcpyn((TCHAR*)plf->lfFaceName, strFont, sizeof(plf->lfFaceName));
plf->lfFaceName[sizeof(plf->lfFaceName)-1] = 0;
if(bGrid)
{
*pIsBold = pApp->GetProfileInt(szSec, g_szBold, 0);
*pSize = pApp->GetProfileInt(szSec, g_szSize, 0);
}
}
}
void CChildFrame::WriteProfileFont(LPCTSTR szSec, const LOGFONT* plf,
const bool& bGrid, BOOL* pIsBold, int* pSize)
{
if(plf->lfHeight != 0)
{
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileInt(szSec, g_szHeight, plf->lfHeight);
pApp->WriteProfileInt(szSec, g_szWeight, plf->lfWeight);
pApp->WriteProfileInt(szSec, g_szItalic, plf->lfItalic);
pApp->WriteProfileInt(szSec, g_szUnderline, plf->lfUnderline);
pApp->WriteProfileInt(szSec, g_szPitchAndFamily, plf->lfPitchAndFamily);
pApp->WriteProfileInt(szSec, g_szCharSet, plf->lfCharSet);
pApp->WriteProfileString(szSec, g_szFaceName, (LPCTSTR)plf->lfFaceName);
if(bGrid)
{
pApp->WriteProfileInt(szSec, g_szBold, *pIsBold);
pApp->WriteProfileInt(szSec, g_szSize, *pSize);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -