多媒体数据库应用程序图像的操作资料.docx
《多媒体数据库应用程序图像的操作资料.docx》由会员分享,可在线阅读,更多相关《多媒体数据库应用程序图像的操作资料.docx(13页珍藏版)》请在冰豆网上搜索。
![多媒体数据库应用程序图像的操作资料.docx](https://file1.bdocx.com/fileroot1/2023-1/22/af3dd03c-bc13-4fff-8108-cb551c45c55f/af3dd03c-bc13-4fff-8108-cb551c45c55f1.gif)
多媒体数据库应用程序图像的操作资料
《多媒体开发与编程》
课程设计报告
题目:
多媒体数据库应用程序
专业:
软件工程
学号:
1315925186
姓名:
张聪聪
指导教师:
李蕊
2016年 5月 27 日
一、课程设计目的
理解ODBC的基本原理,并且掌握基于Access2003设计简单多媒体数据库应用程序,并根据对应的数据显示相应的要求。
二、课程设计内容
多媒体数据库应用程序——图像的操作
三、实验要求
设计要求当运行该程序时,首先显示数据库的信息(已经添加的或者即时添加的)会显示基本信息,性别,年龄,学号,姓名等基本信息以及信息人的头像。
然后可以在该信息基础上修改信息,修改信息删除等各项功能的操作。
数据的存放利用结构体数组来实现,完成设计任务并书写课程设计报告
四、设计思路
基本数据库信息管理系统是一个管理数据的服务平台,它包括添加信息,修改信息,删除信息等功能。
分析任务书中的要求,根据各项要求给出相应的代码完善。
主要根据数据库设计的,所以,基本信息都应该在数据库中找到,图片的显示是重点,由于数据库识别的是BMP格式,以大二进制保存在数据库中,所以显示的时候应该先将图片的格式转换成BMP格式,不能直接修改图片的后缀名而进行。
五、程序源代码
1,为不同的成员函数之间传递数据,为CMyDB2View声明数据成员代码如下
classCMyDB2View:
publicCRecordView
{
public:
CMyDB2Doc*GetDocument();
HBITMAPm_hPhotoBmp;
DWORDm_nFileLength;
BOOLm_RecordAddNew;
BOOLm_RecordModify;
char*m_pBmpBuffer;
}
2,初始化m_pSet对象代码如下:
classCMyDB2View:
:
CMyDB2View():
CRecordView(CMyDB2View:
:
IDD)
{
m_pSet=NULL;
}
3,在视图的OnInitialUpdate()函数中初始化部分成员变量代码如下:
voidCMyDB2View:
:
OnInitialUpdate()
{
m_pSet=&GetDocument()->m_myDB2Set;
CRecordView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CStringstrFileName="yyy.bmp";
chartmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
strFileName.Insert(0,tmpPath);
CFileoutFile(strFileName,CFile:
:
modeCreate|CFile:
:
modeWrite);
LPSTRbuffer=(LPSTR)GlobalLock(m_pSet->m_column5.m_hData);
outFile.WriteHuge(buffer,m_pSet->m_column5.m_dwDataLength);
GlobalUnlock(m_pSet->m_column5.m_hData);
outFile.Close();
LoadBmpFile(strFileName);
m_hPhotoBmp=TransToBmp();
m_Butt_Add.EnableWindow(TRUE);
m_Butt_Edit.EnableWindow(TRUE);
m_Butt_Del.EnableWindow(TRUE);
m_Butt_QR.EnableWindow(FALSE);
m_Butt_Pic.EnableWindow(FALSE);
m_Butt_CX.EnableWindow(FALSE);
m_RecordAddNew=FALSE;
m_RecordModify=FALSE;
}
4,加载指定图像文件代码如下:
BOOLCMyDB2View:
:
LoadBmpFile(constchar*pBmpPathname)
{
CFilefile;
if(!
file.Open(pBmpPathname,CFile:
:
modeRead))
returnFALSE;
m_nFileLength=file.GetLength();
m_pBmpBuffer=newchar[m_nFileLength+1];
if(!
m_pBmpBuffer)
returnFALSE;
if(file.ReadHuge(m_pBmpBuffer,m_nFileLength)!
=m_nFileLength)
returnFALSE;
returnTRUE;
}
5,函数TransToBmp()生成位图对象代码如下:
HBITMAPCMyDB2View:
:
TransToBmp()
{
HBITMAPhBmp;
LPSTRhDIB,lpBuffer=m_pBmpBuffer;
LPVOIDlpDIBBits;
BITMAPFILEHEADERbmfHeader;
DWORDbmfHeaderLen;
//获得位图的头信息
bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
//根据获得的信息头判断是否是位图
if(bmfHeader.bfType!
=(*(WORD*)"BM"))returnNULL;
//获取位图数据
hDIB=lpBuffer+bmfHeaderLen;
BITMAPINFOHEADER&bmiHeader=*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO&bmInfo=*(LPBITMAPINFO)hDIB;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER*)lpBuffer)->bfOffBits;
//创建位图
CClientDCdc(this);
hBmp=CreateDIBitmap(dc.m_hDC,&bmiHeader,
CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
returnhBmp;
}
6,“添加”事件的代码如下:
voidCMyDB2View:
:
OnAdd()
{
EnableEditCom(true);
IniData();
m_Butt_Add.EnableWindow(FALSE);
m_Butt_Edit.EnableWindow(FALSE);
m_Butt_Del.EnableWindow(FALSE);
m_Butt_QR.EnableWindow(FALSE);
m_Butt_CX.EnableWindow(TRUE);
m_Butt_Pic.EnableWindow(TRUE);
m_pSet->CanAppend();
m_pSet->AddNew();
//m_pSet->GetDefaultSQL();
//m_pSet->DoFieldExchange(FALSE);
UpdateData(FALSE);
m_RecordAddNew=TRUE;
}
7,编辑框控件代码如下:
voidCMyDB2View:
:
EnableEditCom(boolFlag)
{
m_XH.EnableWindow(Flag);
m_XM.EnableWindow(Flag);
m_NL.EnableWindow(Flag);
m_XB.EnableWindow(Flag);
}
8,InitData()用于初始化空间数据代码如下:
voidCMyDB2View:
:
IniData()
{
m_XH.SetWindowText("");
m_XM.SetWindowText("");
m_NL.SetWindowText("");
m_XB.SetCurSel(-1);
ClearPhoto();
}
9,ClearPhoto()函数代码如下:
voidCMyDB2View:
:
ClearPhoto()
{
if(m_hPhotoBmp)
{
DeleteObject(m_hPhotoBmp);
m_hPhotoBmp=NULL;
Invalidate();
}
if(m_pBmpBuffer)
{
deletem_pBmpBuffer;
m_pBmpBuffer=NULL;
}
}
10,几个按钮的OnChange()事件的相应代码:
voidCMyDB2View:
:
OnChangeEditXh()
{
m_Butt_QR.EnableWindow(TRUE);
}
voidCMyDB2View:
:
OnChangeEditXm()
{
m_Butt_QR.EnableWindow(TRUE);
}
voidCMyDB2View:
:
OnChangeEditNl()
{
m_Butt_QR.EnableWindow(TRUE);
}
voidCMyDB2View:
:
OnSelchangeComboXb()
{
m_Butt_QR.EnableWindow(TRUE);
}
11,浏览照片的响应函数代码如下:
voidCMyDB2View:
:
OnBUTTONPic()
{
staticcharBASED_CODEszFilter[]="BMPFiles(*.bmp)|*.bmp||";
CFileDialogdlg(TRUE,"BMP",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
{
CStringpathname=dlg.GetPathName();
ClearPhoto();
LoadBmpFile(pathname);
m_hPhotoBmp=TransToBmp();
m_Butt_QR.EnableWindow(TRUE);
Invalidate();
}
}
视图的OnPaint()函数代码如下:
voidCMyDB2View:
:
OnPaint()
{
CPaintDCdc(this);
if(!
m_hPhotoBmp)
return;
CWnd*hwnd=GetDlgItem(IDC_Picture);
RECTrect;
hwnd->GetClientRect(&rect);
HBITMAPOldBitmap;
CDCMemDC;
MemDC.CreateCompatibleDC(hwnd->GetDC());
OldBitmap=(HBITMAP)MemDC.SelectObject(m_hPhotoBmp);
BITMAPbm;
GetObject(m_hPhotoBmp,sizeof(BITMAP),&bm);
hwnd->GetDC()->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
MemDC.SelectObject(OldBitmap);
}
12,修改事件函数的响应代码如下:
voidCMyDB2View:
:
OnEdit()
{
EnableEditCom(true);
m_Butt_Add.EnableWindow(FALSE);
m_Butt_Edit.EnableWindow(FALSE);
m_Butt_Del.EnableWindow(FALSE);
m_Butt_QR.EnableWindow(FALSE);
m_Butt_Pic.EnableWindow(TRUE);
m_Butt_CX.EnableWindow(TRUE);
m_RecordModify=TRUE;
}
13,确认事件响应代码如下:
voidCMyDB2View:
:
OnButtonQr()
{
UpdateData(TRUE);
m_pSet->m_column5.m_dwDataLength=m_nFileLength;
m_pSet->m_column5.m_hData=m_pBmpBuffer;
m_pSet->SetFieldDirty(&m_pSet->m_column5);
m_pSet->SetFieldNull(&m_pSet->m_column5,FALSE);
if(m_RecordAddNew)
{
m_pSet->Update();
}
elseif(m_RecordModify)
{
m_pSet->Edit();
m_pSet->Update();
}
m_Butt_QR.EnableWindow(FALSE);
m_Butt_Add.EnableWindow(TRUE);
m_Butt_Edit.EnableWindow(TRUE);
m_Butt_Del.EnableWindow(TRUE);
}
撤销事件代码如下:
voidCMyDB2View:
:
OnButtonCx()
{
UpdateData(FALSE);
m_pSet->CancelUpdate();
EnableEditCom(FALSE);
m_Butt_Add.EnableWindow(TRUE);
m_Butt_Edit.EnableWindow(TRUE);
m_Butt_Del.EnableWindow(TRUE);
m_Butt_Pic.EnableWindow(FALSE);
m_Butt_QR.EnableWindow(FALSE);
m_Butt_CX.EnableWindow(FALSE);
}
14,删除按钮的响应函数代码:
voidCMyDB2View:
:
OnDelete()
{
if(MessageBox("确实要删除吗?
","删除",MB_YESNO|MB_ICONQUESTION)==IDYES)
{
m_pSet->Delete();
UpdateData(FALSE);
}
}
15,导航按钮响应函数代码如下:
BOOLCMyDB2View:
:
OnMove(UINTnIDMoveCommand)
{
CRecordView:
:
OnMove(nIDMoveCommand);
CStringstrFileName="yyy.bmp";
chartmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
strFileName.Insert(0,tmpPath);
CFileoutFile(strFileName,CFile:
:
modeCreate|CFile:
:
modeWrite);
LPSTRbuffer=(LPSTR)GlobalLock(m_pSet->m_column5.m_hData);
outFile.WriteHuge(buffer,m_pSet->m_column5.m_dwDataLength);
GlobalUnlock(m_pSet->m_column5.m_hData);
outFile.Close();
LoadBmpFile(strFileName);
m_hPhotoBmp=TransToBmp();
Invalidate();
returnTRUE;
returnCRecordView:
:
OnMove(nIDMoveCommand);
}
六、程序运行结果及分析
基本记录显示及信息
删除操作
修改及确认
七、课程设计总结心得:
两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,和同学们相互探讨,相互学习,相互监督。
学到了很多,加深了对access数据库的理解。
回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到老师给我们的题目,然后老师简单的阐述我们该做些什么,该完成些什么的时候,我就觉得这个课程设计是很有挑战的,因为我知道平时自己学的知识不是很牢固,这些做起来肯定很棘手。
事实验证了我的想法。
在整整两星期的日子里,可以说得是苦多于甜,由于对相关知识所学甚少,可以说做起设计来是一片茫然。
在设计的过程中遇到问题,可以说得是困难重重,遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
看着那些陌生的代码和程序,真的不知道该怎么办。
但是得到了同学的热心帮助,在他们的讲解下试着去看懂代码,在这期间我也弄懂了不少问题和知识。
由于自己并没多少知识,别人可以说是通过此次课程设计巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,而我呢,只能说是从这次课程设计中重新审视了自己,终于发现自己对所学知识的严重不足,这也给我提了个醒,没知识终究将是一事无成。