?? 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 + -