www.pudn.com > MyImageDB(imageobject).rar > DataGridView.cpp


// DataGridView.cpp : implementation file 
// 
 
#include "stdafx.h" 
 
#include "MyImageDb.h" 
#include "DataGridView.h" 
#include "myimagedbdoc.h" 
#include "MainFrm.h" 
#include  
 
#include "columns.h" 
#include "column.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDataGridView 
 
IMPLEMENT_DYNCREATE(CDataGridView, CFormView) 
 
CDataGridView::CDataGridView() 
	: CFormView(CDataGridView::IDD), m_bAllowNew(true), m_bAllowEdit(true), m_bAllowDelete(true) 
{ 
	//{{AFX_DATA_INIT(CDataGridView) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	mousePressed = FALSE; 
	seginfoRS = trainPointsRS = m_pRS = NULL; 
} 
 
CDataGridView::~CDataGridView() 
{ 
} 
 
void CDataGridView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CDataGridView) 
	DDX_Control(pDX, IDC_DATAGRID1, m_ctlDataGrid); 
	DDX_Control(pDX, IDC_REGIONCLASSDATAGRID, myRegionclassInfoGrid); 
	DDX_Control(pDX, IDC_POINTSINFOGRID, myPointsInfoGrid); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CDataGridView, CFormView) 
	//{{AFX_MSG_MAP(CDataGridView) 
	ON_WM_SIZE() 
	ON_WM_CREATE() 
	ON_WM_VSCROLL() 
	ON_WM_HSCROLL() 
	ON_WM_KEYDOWN() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDataGridView diagnostics 
 
#ifdef _DEBUG 
void CDataGridView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CDataGridView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDataGridView message handlers 
void CDataGridView::UpdateExistsClassGrid() 
//刷新现有分割类表格; 
{ 
    CMainFrame* pMainFrame = reinterpret_cast(AfxGetMainWnd()); 
 
	if (pMainFrame->isSegInfoDbOK) 
	{ 
		seginfoRS = pMainFrame->seginfoRs->m_pRecordset; 
		myRegionclassInfoGrid.SetAllowDelete(FALSE); 
        myRegionclassInfoGrid.SetCaption("分割类信息"); 
	    myRegionclassInfoGrid.SetRefDataSource(NULL); 
	    myRegionclassInfoGrid.SetRefDataSource( (LPUNKNOWN) seginfoRS ); 
	    myRegionclassInfoGrid.Refresh(); 
	     
	    myRegionclassInfoGrid.UpdateData(FALSE);	 
    } 
} 
 
 
void CDataGridView::UpdateTrainPointsGrid() 
//刷新训练点表格; 
{ 
    CMainFrame* pMainFrame = reinterpret_cast(AfxGetMainWnd()); 
	if (pMainFrame->isTrainPointDbOK) 
	{ 
		trainPointsRS = pMainFrame->trainpointRs->m_pRecordset; 
		myPointsInfoGrid.SetAllowDelete(FALSE); 
        myPointsInfoGrid.SetCaption("训练点信息"); 
	    myPointsInfoGrid.SetRefDataSource(NULL); 
	    myPointsInfoGrid.SetRefDataSource( (LPUNKNOWN) trainPointsRS ); 
	    myPointsInfoGrid.Refresh(); 
	     
	    myRegionclassInfoGrid.UpdateData(FALSE);	 
    } 
} 
void CDataGridView::UpdateGridDetails(const CString& sTableName) 
{ 
    CMainFrame* pMainFrame = reinterpret_cast(AfxGetMainWnd()); 
	if (pMainFrame->isDbOK) 
	{ 
		m_pRS = pMainFrame->myRs->m_pRecordset; 
		m_ctlDataGrid.SetAllowDelete(FALSE); 
        m_ctlDataGrid.SetCaption("图像表"); 
	    m_ctlDataGrid.SetRefDataSource(NULL); 
	    m_ctlDataGrid.SetRefDataSource( (LPUNKNOWN) m_pRS ); 
	    m_ctlDataGrid.Refresh(); 
	     
	    m_ctlDataGrid.UpdateData(FALSE);	 
    } 
 
	if (pMainFrame->isSegInfoDbOK) 
	{ 
		seginfoRS = pMainFrame->seginfoRs->m_pRecordset; 
		myRegionclassInfoGrid.SetAllowDelete(FALSE); 
        myRegionclassInfoGrid.SetCaption("分割类信息"); 
	    myRegionclassInfoGrid.SetRefDataSource(NULL); 
	    myRegionclassInfoGrid.SetRefDataSource( (LPUNKNOWN) seginfoRS ); 
	    myRegionclassInfoGrid.Refresh(); 
	     
	    myRegionclassInfoGrid.UpdateData(FALSE);	 
    } 
 
	if (pMainFrame->isTrainPointDbOK) 
	{ 
		trainPointsRS = pMainFrame->trainpointRs->m_pRecordset; 
		myPointsInfoGrid.SetAllowDelete(FALSE); 
        myPointsInfoGrid.SetCaption("训练点信息"); 
	    myPointsInfoGrid.SetRefDataSource(NULL); 
	    myPointsInfoGrid.SetRefDataSource( (LPUNKNOWN) trainPointsRS ); 
	    myPointsInfoGrid.Refresh(); 
	     
	    myRegionclassInfoGrid.UpdateData(FALSE);	 
    } 
} 
 
void CDataGridView::OnSize(UINT nType, int cx, int cy)  
{ 
	CFormView::OnSize(nType, cx, cy); 
	 
    if (m_ctlDataGrid.m_hWnd != NULL) 
	{ 
		m_ctlDataGrid.MoveWindow(0, 0, cx/2, cy); 
		myRegionclassInfoGrid.MoveWindow(cx/2, 0, cx/2, cy/2); 
		myPointsInfoGrid.MoveWindow(cx/2, cy/2, cx/2, cy/2); 
	}         
} 
 
CString CDataGridView::GetErrorDescription(_com_error& e) 
{ 
    _bstr_t bstrSource(e.Source()); 
    _bstr_t bstrDescription(e.Description()); 
    _TCHAR szTemp[1024]; 
 
    CString strInfo ; 
    wsprintf(szTemp, _T("Message : %s\n"), e.ErrorMessage()); 
    strInfo = szTemp; 
    wsprintf(szTemp, _T("Code : 0x%08lx\n"), e.Error()); 
    strInfo += szTemp; 
    wsprintf(szTemp, _T("Source : %s\n"), bstrSource.length() ? (LPCTSTR)bstrSource : _T("null")); 
    strInfo += szTemp; 
    wsprintf(szTemp, _T("Description : %s\n"), bstrDescription.length() ? (LPCTSTR)bstrDescription : _T("null")); 
    strInfo += szTemp; 
 
    return strInfo; 
} 
 
void CDataGridView::OnInitialUpdate()  
{ 
	CFormView::OnInitialUpdate(); 
	CMainFrame *pFrame; 
	pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;              
	pFrame->pDataGridView = this; 
	if (pFrame->isDbOK) 
	{ 
		m_pRS = pFrame->myRs->m_pRecordset; 
	} 
	 
    m_ctlDataGrid.SetAllowUpdate(m_bAllowEdit); 
    m_ctlDataGrid.SetAllowAddNew(m_bAllowNew);	 
    m_ctlDataGrid.SetAllowDelete(FALSE); 
	m_ctlDataGrid.SetRefDataSource(m_pRS); 
} 
 
 
 
BEGIN_EVENTSINK_MAP(CDataGridView, CFormView) 
    //{{AFX_EVENTSINK_MAP(CDataGridView) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, 221 /* SelChange */, OnSelChangeDatagrid1, VTS_PI2) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, -605 /* MouseDown */, OnMouseDownDatagrid1, VTS_I2 VTS_I2 VTS_I4 VTS_I4) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, -601 /* DblClick */, OnDblClickDatagrid1, VTS_NONE) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, 202 /* AfterDelete */, OnAfterDeleteDatagrid1, VTS_NONE) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, 207 /* BeforeDelete */, OnBeforeDeleteDatagrid1, VTS_PI2) 
	ON_EVENT(CDataGridView, IDC_DATAGRID1, -602 /* KeyDown */, OnKeyDownDatagrid1, VTS_PI2 VTS_I2) 
	ON_EVENT(CDataGridView, IDC_POINTSINFOGRID, -601 /* DblClick */, OnDblClickPointsinfogrid, VTS_NONE) 
	ON_EVENT(CDataGridView, IDC_POINTSINFOGRID, -602 /* KeyDown */, OnKeyDownPointsinfogrid, VTS_PI2 VTS_I2) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
void CDataGridView::OnSelChangeDatagrid1(short FAR* Cancel)  
{ 
	selRow = m_ctlDataGrid.GetRow(); 
	 
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
	pFrame->selRow = selRow; 
} 
 
DROPEFFECT CDataGridView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	return CFormView::OnDragEnter(pDataObject, dwKeyState, point); 
} 
 
void CDataGridView::OnDragLeave()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	CFormView::OnDragLeave(); 
} 
 
DROPEFFECT CDataGridView::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	 
	return CFormView::OnDragOver(pDataObject, dwKeyState, point); 
} 
 
BOOL CDataGridView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)  
{ 
 
	return CFormView::OnDrop(pDataObject, dropEffect, point); 
} 
 
void CDataGridView::OnMouseDownDatagrid1(short Button, short Shift, long X, long Y)  
{ 
/* 
	COleDropSource mydropsource; 
    COleDataSource myoledata; 
	//myoledata.DoDragDrop(DROPEFFECT_MOVE, NULL, NULL); 
	myoledata.DoDragDrop(DROPEFFECT_MOVE, NULL, &mydropsource); 
*/ 
} 
 
int CDataGridView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CFormView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	return 0; 
} 
 
CMyImageDBDoc* CDataGridView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyImageDBDoc))); 
	return (CMyImageDBDoc*)m_pDocument; 
} 
 
void CDataGridView::OnDblClickPointsinfogrid()  
{ 
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
 
	//LONG templ = myPointsInfoGrid.GetRow(); 
	CColumns tempcols = (CColumns) myPointsInfoGrid.GetColumns(); 
	LONG templ = tempcols.GetCount(); 
	CColumn tempcol = tempcols.GetItem(COleVariant((long)2)); 
	CString iname = tempcol.GetText();//所在图像的名字; 
	tempcol = tempcols.GetItem(COleVariant((long)0)); 
	CString ptidstr = tempcol.GetText();//点在表中的ID; 
	LONG ptid = strtol(ptidstr, NULL, 10); 
	tempcol = tempcols.GetItem(COleVariant((long)1)); 
	CString rgclass = tempcol.GetText();//点所属的类; 
	tempcol = tempcols.GetItem(COleVariant((long)3)); 
	CString pxstr = tempcol.GetText();//点在图像中的位置X; 
	INT px = strtol(pxstr, NULL, 10); 
	tempcol = tempcols.GetItem(COleVariant((long)4)); 
	CString pystr = tempcol.GetText();//点在图像中的位置X; 
	INT py = strtol(pystr, NULL, 10); 
 
	//更新mainfrm中的图像名字, 重设当前选择点,并在VIEW中重画图像; 
	pFrame->selName = iname; 
	pFrame->pImageView->SetCurSelTrainPoint(ptid, iname,  
		px, py, rgclass); 
	GetDocument()->RefreshView();//刷新文档类中的图像数据; 
	//重新在图像表中定位到该图像; 
	//重新在现存类表中定位到该类; 
 
} 
 
void CDataGridView::OnDblClickDatagrid1()  
{ 
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
 
	selRow = m_ctlDataGrid.GetRow(); 
	CColumns tempcols = (CColumns) m_ctlDataGrid.GetColumns(); 
	LONG templ = tempcols.GetCount(); 
	CColumn tempcol = tempcols.GetItem(COleVariant((long)0)); 
	CString tempstr = tempcol.GetText(); 
	pFrame->selID = tempstr; 
	tempcol = tempcols.GetItem(COleVariant((long)1)); 
	tempstr = tempcol.GetText(); 
	pFrame->selName = tempstr; 
	pFrame->selRow = selRow; 
 
	//清除当前选择训练点; 
	pFrame->pImageView->ClearCurTrainPt(); 
 
	GetDocument()->RefreshView();//刷新文档类中的图像数据; 
 
	pFrame->pImageView->Invalidate(FALSE);//刷新图像视图; 
} 
 
 
void CDataGridView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
/* 
	CClientDC dc(this); 
	HRGN* curgn = new HRGN; 
	dc.GetWindow()->GetWindowRgn(*curgn); 
	m_ctlDataGrid.SetWindowRgn(*curgn, 1); 
*/ 
	CView::OnVScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CDataGridView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
/* 
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
	UpdateGridDetails( pFrame->tableName ); 
*/ 
	//CFormView::OnHScroll(nSBCode, nPos, pScrollBar); 
	CView::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CDataGridView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CFormView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CDataGridView::OnAfterDeleteDatagrid1()  
{ 
/* 
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
	pFrame->RefreshTableID(deleteID);//重排表内ID,使其唯一; 
*/ 
} 
 
void CDataGridView::OnBeforeDeleteDatagrid1(short FAR* Cancel)  
{ 
} 
 
void CDataGridView::OnKeyDownDatagrid1(short FAR* KeyCode, short Shift)  
{ 
    SHORT  downkey = *KeyCode; 
	if (downkey==46) 
	{ 
		//“DEL”键,删除当前记录; 
		CColumns tempcols = (CColumns) m_ctlDataGrid.GetColumns(); 
		CColumn tempcol = tempcols.GetItem(COleVariant((long)0)); 
		CString tempstr = tempcol.GetText(); 
		deleteID = strtol(tempstr, NULL, 10); 
		CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
		pFrame->RefreshTableID(deleteID); 
	} 
 
} 
 
 
void CDataGridView::OnKeyDownPointsinfogrid(short FAR* KeyCode, short Shift)  
{ 
    SHORT  downkey = *KeyCode; 
	if (downkey==46) 
	{ 
		//“DEL”键,删除当前记录; 
		CColumns tempcols = (CColumns) myPointsInfoGrid.GetColumns(); 
		CColumn tempcol = tempcols.GetItem(COleVariant((long)0)); 
		CString idstr = tempcol.GetText(); 
		deleteID = strtol(idstr, NULL, 10); 
		tempcol = tempcols.GetItem(COleVariant((long)1)); 
		CString regionclass = tempcol.GetText(); 
		CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd(); 
		pFrame->RefreshPtTableID(deleteID, regionclass); 
	}	 
}