📄 12imagetestview.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 + -