📄 cdlgoracleimagerwdlg.cpp
字号:
//从文件数据中读入一块缓冲块大小的内存
fs.read(buffer, bufsize);
//计算读入的数据字节数
amtread = fs.gcount();
//一次写一块缓冲块大小的数据到OBLOB对象中
oblob.Write(buffer, amtread, piecetype);
//计算总共书写的数据字节数
totalwritten = totalwritten + amtread;
//从文件数据中读入一块缓冲块大小的内存
if ((filesize - totalwritten)<=bufsize)
piecetype = OLOB_LAST_PIECE;
else
piecetype = OLOB_NEXT_PIECE;
}
//结束流数据的输入
oblob.DisableStreaming();
//更新记录集
ores = odyn.Update();
//关闭流文件
fs.close();
}
//异常处理
catch(OException E)
{
CString err;
CString err1;
err.Format("%s", (char*)(E.GetFailedMethodName()) );
err1.Format("%s", (char*)(E.GetErrorText()) );
AfxMessageBox(err1);
}
//消除buffer指针
if (buffer)
free(buffer);
}
void CCDlgOracleImageRWDlg::DestroyPhoto()
{
//图像句柄是否为空
if(m_hPhotoBitmap)
{
//如果非空删除
DeleteObject(m_hPhotoBitmap);
//图像句柄置空
m_hPhotoBitmap = NULL;
}
//指向图像内存指针是否为空
if(m_pBMPBuffer)
{
//如果非空,删除
delete m_pBMPBuffer;
//指向图像内存指针置空
m_pBMPBuffer = NULL;
}
}
void CCDlgOracleImageRWDlg::OnAddPhoto()
{
// TODO: Add your control notification handler code here
//装载选择图像
LoadBMP();
}
void CCDlgOracleImageRWDlg::OnDeletePhoto()
{
// TODO: Add your control notification handler code here
UpdateData(false);
//关闭打开的记录集
odyn.Close();
//准备SQL语句
CString strQuery;
strQuery.Format("Select * From IMAGE Where ID = \'%s\'", m_ID);
//打开满足条件的记录集
odyn.Open(odb, strQuery,ODYNASET_DEFAULT);
//删除满足条件的记录
odyn.DeleteRecord();
//关闭打开的记录集
odyn.Close();
//重新打开记录集
odyn.Open(odb, "SELECT * FROM IMAGE ");
}
void CCDlgOracleImageRWDlg::OnSelectphoto()
{
// TODO: Add your control notification handler code here
//装载选择图像
LoadBMP();
}
BOOL CCDlgOracleImageRWDlg::LoadBMPFile(const char* pBMPPathname)
{
CFile file;
//打开系统文件上的图像
if( !file.Open( pBMPPathname, CFile::modeRead) )
return FALSE;
//取得文件长度
m_nFileLen = file.GetLength();
//开辟图像文件系统缓冲内存
m_pBMPBuffer = new char[m_nFileLen + 1];
if(!m_pBMPBuffer)
return FALSE;
//读图像文件
if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)
return FALSE;
return TRUE;
}
HBITMAP CCDlgOracleImageRWDlg::BufferToHBITMAP()
{
//BITMAP图像相关定义
HBITMAP hBmp;
LPSTR hDIB,lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;
//BITMAP图像文件头长度
bmfHeaderLen = sizeof(bmfHeader);
//把内存中数据拷贝到图像数据所指的记录象素数据的指针
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
//判断是否是一幅BMP图像
if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;
hDIB = lpBuffer + bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
//指针移位至图像数据所指的记录象素数据的位置
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
//从头文件中获取信息
width= bmInfo.bmiHeader.biWidth;
height =bmInfo.bmiHeader.biHeight;
//获取当前客户区指针
CClientDC dc(this);
//生成BITMAP文件
hBmp = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
return hBmp;
}
void CCDlgOracleImageRWDlg::DrawUserPhoto(int x, int y, CDC *pDC)
{
if(!m_hPhotoBitmap) return;
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(m_hPhotoBitmap);
//获得ID号为IDC_DRAWBOX的控件的CWnd指针
//并使用它获得相应的设备环境
CWnd *pWnd = GetDlgItem(IDC_Picture);
CDC *pDC1 = pWnd->GetDC();
CRect conRect;
//获得该控件的矩形区域
::GetClientRect(pWnd->m_hWnd, conRect);
//将索引值为NULL_BRUSH库存对象选进设备环境
pDC1->SelectStockObject(NULL_BRUSH);
//设置视口原点
pDC1->SetViewportOrg(conRect.left, conRect.top);
// CBitmap *pbitmap=new CBitmap;///////////// no use
// BITMAP *m_bitmap=new BITMAP;/////////// no use
// pbitmap->FromHandle(OldBitmap)->GetBitmap(m_bitmap);/////// no use
int conW=conRect.right-conRect.left;
int conH=conRect.bottom-conRect.top;
// int w=m_bitmap->bmWidth;
// int h=m_bitmap->bmHeight;
pDC1->StretchBlt(0,0,conW,conH,&MemDC,0,0,width,height,SRCCOPY);
MemDC.SelectObject(OldBitmap);
pWnd->ReleaseDC(pDC1);
// delete m_bitmap;///////////// no use
// delete pbitmap;///////////// no use
/////////////////////////////////////////////////////////////////////////////////
}
void CCDlgOracleImageRWDlg::ResetControls()
{
//是否是记录集的第一个记录
BOOL IsFirstRecord =odyn.IsFirst();
//是否是记录集的第二个记录
BOOL IsLastRecord = odyn.IsLast();
}
void CCDlgOracleImageRWDlg::ReadData()
{
//消除图像指针,确保缓存为空
DestroyPhoto();
if (!odyn.IsOpen())
{
CString err;
CString err1;
err.Format("%s", (char*)(odb.GetErrorText()) );
err1.Format("%s", (char*)(odb.GetErrorText()) );
AfxMessageBox(err);
AfxMessageBox(err1);
}
////定义两个变量,保存从Oracle数据库中读出的和两个表字段(ID和NAME)相匹配的字段数据
char cval1[30];
char cval2[30];
//定义一个OBlob 对象
OBlob oblob;
//得到ID字段值
odyn.GetFieldValue("ID", cval1,30);
//得到NAME字段值
odyn.GetFieldValue("NAME", cval2,30);
//把字段值赋给对话框中相应变量
m_ID=cval1;m_Name=cval2;
//取得DATA字段定位指针
odyn.GetFieldValue("DATA", &oblob);
//定义缓冲区指针
unsigned char *buffer = 0;
try
{
//定义数据流对象
fstream fs;
//在文件系统上设定一个文件
fs.open("D:\\imageou.bmp", ios::out);
//设置模式
fs.setmode(filebuf::binary);
//取得数据流对象数据合适缓冲值大小
unsigned long size = oblob.GetSize();
// 计算合适的缓冲值大小
unsigned long optchunk = oblob.GetOptimumChunkSize();
unsigned int bufsize = ((int)(32768/optchunk)) *optchunk;
//比较两个缓冲值,取较小的一个
if (bufsize > size)
bufsize = size;
//开辟缓冲区;用分块循环的方法可以减小开辟大块内存
buffer = (unsigned char *)malloc(bufsize);
//设置文件数据流读入方式
oblob.EnableStreaming(size);
//设置文件数据流读入状态
short status= OLOB_NEED_DATA;
//定义一个变量,计算每次读的字节数
unsigned long amtread=0;
while(status == OLOB_NEED_DATA)
{
//从Oracle数据库中读入一块缓冲块大小的数据
amtread = oblob.Read(&status, buffer, bufsize);
//向文件系统写入一块缓冲块大小的数据
fs.write(buffer, amtread);
}
//结束流数据的输入
oblob.DisableStreaming();
//关闭流文件
fs.close();
CString pathname1 ="D:\\imageou.bmp";
//消除图像指针,确保缓存为空
DestroyPhoto();
//读入数据
LoadBMPFile(pathname1);
//生成BMP图像
m_hPhotoBitmap = BufferToHBITMAP();
Invalidate();
}
//异常处理
catch(OException E)
{
CString err;
CString err1;
err.Format("%s", (char*)(E.GetFailedMethodName()) );
err1.Format("%s", (char*)(E.GetErrorText()) );
AfxMessageBox(err);
AfxMessageBox(err1);
}
//消除buffer指针
if (buffer)
free(buffer);
//更新控件变量的值
UpdateData(false);
}
void CCDlgOracleImageRWDlg::OnDestroy()
{
//关闭数据库
odb.Close();
//关闭连接
OShutdown();
CDialog::OnDestroy();
}
void CCDlgOracleImageRWDlg::LoadBMP()
{
static char BASED_CODE szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
CFileDialog dlg(TRUE,"BMP",NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal() == IDOK)
{
//取得系统图像文件路径名
pathname = dlg.GetPathName();
DestroyPhoto();
//读入图像
LoadBMPFile(pathname);
//生成BMP格式的图像
m_hPhotoBitmap = BufferToHBITMAP();
m_bModify = TRUE;
Invalidate();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -