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

📄 12imagetestview.cpp

📁 SQL Server 数据库图片保存
💻 CPP
字号:
// 12ImageTestView.cpp : implementation of the CMy12ImageTestView class
//

#include "stdafx.h"
#include "12ImageTest.h"

#include "12ImageTestDoc.h"
#include "12ImageTestView.h"
#include "ADOConn.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMy12ImageTestView

IMPLEMENT_DYNCREATE(CMy12ImageTestView, CFormView)

BEGIN_MESSAGE_MAP(CMy12ImageTestView, CFormView)
	ON_NOTIFY( GVN_SELCHANGING, IDC_CUSTOM1, OnGridSelChange )
	ON_BN_CLICKED(IDC_SAVE, &CMy12ImageTestView::OnBnClickedSave)
	ON_BN_CLICKED(IDC_ADD, &CMy12ImageTestView::OnBnClickedAdd)
	ON_BN_CLICKED(IDC_DELETE, &CMy12ImageTestView::OnBnClickedDelete)
	ON_BN_CLICKED(IDC_CANCEL, &CMy12ImageTestView::OnBnClickedCancel)
	ON_BN_CLICKED(IDC_INSERT, &CMy12ImageTestView::OnBnClickedInsert)
END_MESSAGE_MAP()

// CMy12ImageTestView construction/destruction

CMy12ImageTestView::CMy12ImageTestView()
: CFormView(CMy12ImageTestView::IDD)
{
	pBuffer = NULL;
	index = 1;
}

CMy12ImageTestView::~CMy12ImageTestView()
{
	delete pBuffer;
}

void CMy12ImageTestView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CUSTOM1, m_GridCtrl);
}

BOOL CMy12ImageTestView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CMy12ImageTestView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	m_GridCtrl.SetDefCellHeight(25);
	m_GridCtrl.SetDefCellWidth(100);
	m_GridCtrl.SetColumnCount(7);
	m_GridCtrl.SetFixedRowCount(1);

	m_GridCtrl.SetItemText(0, 0, _T("图片编号"));
	m_GridCtrl.SetItemText(0, 1, _T("桥梁编号"));
	m_GridCtrl.SetItemText(0, 2, _T("图片数据"));
	m_GridCtrl.SetItemText(0, 3, _T("图片类别名称"));
	m_GridCtrl.SetItemText(0, 4, _T("图片后缀"));
	m_GridCtrl.SetItemText(0, 5, _T("拍摄日期"));
	m_GridCtrl.SetItemText(0, 6, _T("图片描述"));

	CString strSQL;
	CADOConn m_CAdoConn;
	_RecordsetPtr  pRecordset;
	strSQL=_T("select * from 基本信息图片");
	pRecordset=m_CAdoConn.GetRecordset((_bstr_t)strSQL,(_bstr_t)("bm"));
	int m_ncount ;
	m_ncount=pRecordset->GetRecordCount();
	m_GridCtrl.SetRowCount(m_ncount+1);
	//设置图片数据栏灰色,不可以更改
	while (m_ncount > 0)
	{
		m_GridCtrl.SetItemBkColour(m_ncount,2,RGB(236,233,216));
		m_GridCtrl.SetItemEditable(m_ncount,2,FALSE);
		m_GridCtrl.SetItemText(m_ncount,2,_T(""));
		m_ncount--;
	}
	
	BOOL bAllowEmpty=FALSE;
	int row  = 1;
	while (!pRecordset->adoEOF)
	{
		FieldsPtr pFields = pRecordset->Fields;

		FieldPtr  pField = pFields->GetItem(0L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 0L, (CString) pField->Value,bAllowEmpty);

		pField = pFields->GetItem(1L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 1L, (CString) pField->Value,bAllowEmpty);

		pField = pFields->GetItem(2L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 3L, (CString) pField->Value,bAllowEmpty);

		pField = pFields->GetItem(3L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 4L, (CString) pField->Value,bAllowEmpty);

		pField = pFields->GetItem(5L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 5L, (CString) pField->Value,bAllowEmpty);

		pField = pFields->GetItem(6L);
		if (pField->Value.vt != VT_NULL)
			m_GridCtrl.SetItemValue(row, 6L, (CString) pField->Value,bAllowEmpty);
		
		//读取图片数据
		nSize = pRecordset->GetFields()->GetItem("图片数据")->ActualSize;
		if (nSize <= 0)
		{
			m_GridCtrl.SetItemText(row,2L,_T(""));
		}
		if(nSize > 0)
		{
			_variant_t	varBLOB;
			varBLOB = pRecordset->GetFields()->GetItem("图片数据")->GetChunk(nSize);
			if(varBLOB.vt == (VT_ARRAY | VT_UI1))
			{
				if(pBuffer = new BYTE [nSize+1])		///重新申请必要的存储空间
				{	
					char *pBuf = NULL;
					SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
					memcpy(pBuffer,pBuf,nSize);				///复制数据到缓冲区m_pBMPBuffer
				}
			}
			//获得主程序的路径
			CString sPath; 
			GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH); 
			sPath.ReleaseBuffer (); 
			int nPos; 
			nPos=sPath.ReverseFind ('\\'); 
			sPath=sPath.Left (nPos); 
			CString strCrePath; //在程序路径下创建一个文件夹
			strCrePath.Format("%s%s",sPath,_T("\\临时图片\\"));
			CreateDirectory(strCrePath,NULL);
			CString strExt;
			strExt.Format("%s%s",_T("."),m_GridCtrl.GetItemText(row,4));
			CString str;
			str.Format("%s%d%s",strCrePath,index,strExt); //文件名和后缀名
			CFile outFile(str,CFile::modeCreate|CFile::modeWrite);
		    outFile.Write(pBuffer,nSize);  
			m_GridCtrl.SetItemValue(row,2,index);
			index++;	
		}
		row++;
		pRecordset->MoveNext();
	}
	m_CAdoConn.ExitConnect();
}
#ifdef _DEBUG
void CMy12ImageTestView::AssertValid() const
{
	CFormView::AssertValid();
}

void CMy12ImageTestView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CMy12ImageTestDoc* CMy12ImageTestView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy12ImageTestDoc)));
	return (CMy12ImageTestDoc*)m_pDocument;
}
#endif //_DEBUG


// 点击网格的消息响应
void CMy12ImageTestView::OnGridSelChange(  NMHDR * pNotifyStruct, LRESULT * result  )
{
	NM_GRIDVIEW* pNmgv = (NM_GRIDVIEW*)pNotifyStruct;
	*result = 0;
	//获得第3列,某行(首行除外)
	if ((pNmgv->iColumn == 2)&&(pNmgv->iRow != 0))
	{
		dlgData.m_nrow = pNmgv->iRow-1;
		dlgData.m_sname = m_GridCtrl.GetItemText(pNmgv->iRow,2);//获得索引名
		dlgData.m_OutFileName = m_GridCtrl.GetItemText(pNmgv->iRow,3); //获得文件名
		dlgData.m_sEXt = m_GridCtrl.GetItemText(pNmgv->iRow,4); //获得扩展名
		if (dlgData.m_sname == "") //如果选中的行没有图片编号
		{
			m_GridCtrl.SetItemValue(dlgData.m_nrow+1,2,index);
			CString strIndex;
			strIndex.Format("%d",index);
			dlgData.m_sname = strIndex;
			index++;
		}
		if (dlgData.DoModal()==IDOK)
		{
			//如果浏览文件,获得文件名及扩展名
			if (dlgData.FileTitle!=""||dlgData.FileEXt!="")
			{
				m_GridCtrl.SetItemText(dlgData.m_nrow+1,3,dlgData.FileTitle);
				m_GridCtrl.SetItemText(dlgData.m_nrow+1,4,dlgData.FileEXt);
				dlgData.FileTitle = "";
				dlgData.FileEXt = "";
			}
		}
	}
}
//保存到数据库
void CMy12ImageTestView::OnBnClickedSave()
{

	CString strSQL;
	CADOConn m_CAdoConn;
	_RecordsetPtr  pRecordset;
	//先删除
	strSQL=_T("delete 基本信息图片");
	pRecordset=m_CAdoConn.GetRecordset((_bstr_t)strSQL,(_bstr_t)("bm"));
	//后添加
	strSQL=_T("select * from 基本信息图片");
	pRecordset=m_CAdoConn.GetRecordset((_bstr_t)strSQL,(_bstr_t)("bm"));
	int m_Rcount = 1;
	while (m_Rcount < m_GridCtrl.GetRowCount())
	{
		pRecordset->AddNew(); 
		if(m_GridCtrl.GetItemText(m_Rcount,0)!="")
			pRecordset->Fields->GetItem(_variant_t("图片编号"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,0));
		if(m_GridCtrl.GetItemText(m_Rcount,1)!="")
			pRecordset->Fields->GetItem(_variant_t("桥梁编号"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,1));
		if(m_GridCtrl.GetItemText(m_Rcount,3)!="")
			pRecordset->Fields->GetItem(_variant_t("图片类别名称"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,3));
		if(m_GridCtrl.GetItemText(m_Rcount,4)!="")
			pRecordset->Fields->GetItem(_variant_t("图片后缀"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,4));

		//获得文件名
		CString m_sname;
		m_sname.Format("%s",m_GridCtrl.GetItemText(m_Rcount,2));
		//获取扩展名
		CString m_sExt;
		m_sExt.Format("%s%s",_T("."),m_GridCtrl.GetItemText(m_Rcount,4));
		//获得主程序的路径
		CString sPath; 
		GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH); 
		sPath.ReleaseBuffer (); 
		int nPos; 
		nPos=sPath.ReverseFind ('\\'); 
		sPath=sPath.Left (nPos); 
		//获取图片数据
		CFile f;
		CString  FilePathName;
		FilePathName.Format("%s%s%s%s",sPath,_T("\\临时图片\\"),m_sname,m_sExt); //文件名和后缀名
		CFileException e;
		if(f.Open(FilePathName, CFile::modeRead | CFile::typeBinary, &e)) //打开了一个jpg文件
		{	

			int nSize = f.GetLength();          //先得到文件长度
			BYTE * pBuffer = new BYTE [nSize];  //按文件的大小在堆上申请一块内存

			if (f.Read(pBuffer, nSize) > 0 )    //把文件读到pBuffer(堆上申请一块内存)
			{   // +----------------------------------------------
				BYTE *pBuf = pBuffer;     ///下面这一大段是把pBuffer里的数据放到库中
				VARIANT			varBLOB;
				SAFEARRAY		*psa;
				SAFEARRAYBOUND	rgsabound[1];	
				if(pBuf)
				{    
					rgsabound[0].lLbound = 0;
					rgsabound[0].cElements = nSize;
					psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
					for (long i = 0; i < (long)nSize; i++)
						SafeArrayPutElement (psa, &i, pBuf++);
					varBLOB.vt = VT_ARRAY | VT_UI1;
					varBLOB.parray = psa;
					pRecordset->GetFields()->GetItem("图片数据")->AppendChunk(varBLOB);
				}
				delete [] pBuffer;     //删掉堆上申请的那一块内存
				pBuf=0;                //以防二次乱用
				f.Close();		
			}
		}
		if(m_GridCtrl.GetItemText(m_Rcount,5)!="")
			pRecordset->Fields->GetItem(_variant_t("拍摄日期"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,5));
		if(m_GridCtrl.GetItemText(m_Rcount,6)!="")
			pRecordset->Fields->GetItem(_variant_t("图片描述"))->Value=_bstr_t(m_GridCtrl.GetItemText(m_Rcount,6));
		m_Rcount++;
		pRecordset->Update();
	}
	m_CAdoConn.ExitConnect();
}

//添加一条记录
void CMy12ImageTestView::OnBnClickedAdd()
{
	//添加一行
	int rowcount = m_GridCtrl.GetRowCount();
	m_GridCtrl.SetRowCount(rowcount+1);
	//设置该行属性,颜色,不可以修改,字段
	m_GridCtrl.SetItemBkColour(rowcount,2,RGB(236,233,216));
	m_GridCtrl.SetItemEditable(rowcount,2,FALSE);
	
	m_GridCtrl.SetItemValue(rowcount,2,index);
	index++;
	//设置光标,自动滚动到最后一行
	m_GridCtrl.SetItemFocus(m_GridCtrl.GetRowCount()-1,0);
	//添加日期数据
	CTime nTime  = CTime::GetCurrentTime();
	CString str;	
	str.Format("%d-%d-%d",nTime.GetYear(),nTime.GetMonth(),nTime.GetDay());
	m_GridCtrl.SetItemValue(rowcount, 5, str);
}

//删除一行
void CMy12ImageTestView::OnBnClickedDelete()
{
	 
	if(m_GridCtrl.GetFocusCell().row == -1)
	{
		MessageBox(_T("请选择要删除的行"));
		return;
	}
	//dlgData.m_pBuffer.RemoveAt(m_GridCtrl.GetFocusCell().row-1);
	//dlgData.m_nSize.RemoveAt(m_GridCtrl.GetFocusCell().row-1);
	m_GridCtrl.DeleteRow(m_GridCtrl.GetFocusCell().row);
}

//关闭窗口
void CMy12ImageTestView::OnBnClickedCancel()
{
	GetParent()->DestroyWindow();
}

void CMy12ImageTestView::OnBnClickedInsert()
{
	if (m_GridCtrl.GetFocusCell().row==-1)
	{
		MessageBox(_T("请选择插入位置"));
		return;
	}
	m_GridCtrl.InsertRow("",m_GridCtrl.GetFocusCell().row);

	//添加一行
	int rowcount = m_GridCtrl.GetFocusCell().row;
	//设置该行属性,颜色,不可以修改,字段
	m_GridCtrl.SetItemBkColour(rowcount,2,RGB(236,233,216));
	m_GridCtrl.SetItemEditable(rowcount,2,FALSE);
	m_GridCtrl.SetItemValue(rowcount,2,index);
	index++;
	//添加日期数据
	CTime nTime  = CTime::GetCurrentTime();
	CString str;	
	str.Format("%d-%d-%d",nTime.GetYear(),nTime.GetMonth(),nTime.GetDay());
	m_GridCtrl.SetItemValue(rowcount, 5, str);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -