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

📄 cdlgoracleimagerwdlg.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			//从文件数据中读入一块缓冲块大小的内存
			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 + -