国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

VC編程中如何操作數(shù)據(jù)庫中的圖像字段

2019-11-17 05:07:29
字體:
供稿:網(wǎng)友
在VC進(jìn)行數(shù)據(jù)庫編程中對(duì)圖像的處理一直是個(gè)難點(diǎn),經(jīng)常有朋友為如何向數(shù)據(jù)庫中添加圖像或從數(shù)據(jù)庫中讀取圖像數(shù)據(jù)并顯示處理等問題所困擾,目前關(guān)于VC數(shù)據(jù)庫編程的圖書不少,但很少有涉及圖象問題的,本文針對(duì)這一現(xiàn)狀,介紹了如何解決上述的問題,希望可以對(duì)朋友們有所幫助。

  本文以ACESS97為例,采用ODBC方式打開數(shù)據(jù)庫Photo,數(shù)據(jù)庫Photo的images表中含有一個(gè)image的圖像字段,在剛打開時(shí)顯示第一條記錄。存取操作時(shí)要害是確定數(shù)據(jù)的長(zhǎng)度,讀數(shù)據(jù)操作時(shí)圖像數(shù)據(jù)可以從記錄集的圖像字段對(duì)應(yīng)的長(zhǎng)二進(jìn)制成員變量m_Image的成員m_hData得到,這個(gè)句柄變量存放分配給圖像字段的數(shù)據(jù),該對(duì)象的另一個(gè)成員變量m_dwDataLength為該字段的實(shí)際長(zhǎng)度,在某些情況下,m_dwDataLength的值有可能小于m_hData中的數(shù)據(jù)長(zhǎng)度值。具體內(nèi)容可以參考MSND。以下實(shí)現(xiàn)的部分要害代碼。首先請(qǐng)看 CdbImages記錄集的定義:

CdbImages::CdbImages(CDatabase* pdb)
: CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CdbImages)
m_nFields = 2;//數(shù)據(jù)庫中有兩個(gè)字段
//}}AFX_FIELD_INIT
m_nDefaultType = snapshot;//數(shù)據(jù)庫以快照形式打開
}
CString CdbImages::GetDefaultConnect()
{
return _T("ODBC;DSN=MS access Database");//以O(shè)DBC操作數(shù)據(jù)庫
}
CString CdbImages::GetDefaultSQL()
{
return _T("[Images]");//默認(rèn)的操作是連接到數(shù)據(jù)庫中的Images表
}
void CdbImages::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CdbImages)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_LongBinary(pFX, _T("[Image]"), m_Image);//記錄集中的成員對(duì)象和表中的OLE字段采用長(zhǎng)二進(jìn)制交換。
//}}AFX_FIELD_MAP
}
///////////////////////////////////////////////////////////
//從數(shù)據(jù)庫中顯示圖像數(shù)據(jù)
CDatabase m_DB;//定義的數(shù)據(jù)庫全局變量
CBitmap Bitmap;//定義的圖像類全局變量,用以存儲(chǔ)圖像數(shù)據(jù)
void CImageView::OnOpenDateBase()
{
m_DB.Open(NULL, //以O(shè)DBC形式打開數(shù)據(jù)庫
FALSE,
FALSE,
"ODBC;DRIVER={
Microsof Access Driver (*.mdb)};DBQ=Photo.mdb");
CdbImages dbImages(m_DB);
CString strFileName ;// 用來存放臨時(shí)文件名,以該臨時(shí)文件存放讀取的數(shù)據(jù)庫的圖像數(shù)據(jù)。
i=1;//I為臨時(shí)文件號(hào)
StrFileName.Format("%s",i)
dbImages.Open();
if (dbImages.ISEOF())
AfxMessageBox("Unable to get image from db");
else
{
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);//得到臨時(shí)文件的目錄;
strFileName.Insert(0,tmpPath);//生成臨時(shí)文件名
CFile outFile(strFileName,CFile::modeCreateCFile::modeWrite);
//向臨時(shí)文件寫數(shù)據(jù),數(shù)據(jù)庫中數(shù)據(jù)讀操作時(shí)要害是知道數(shù)據(jù)的長(zhǎng)度,這可以從記錄集的圖像字段對(duì)應(yīng)的長(zhǎng)二進(jìn)制成員變量m_Image的成員dwDataLength得到;
LPSTR buffer = (LPSTR)GlobalLock(dbImages.m_Image.m_hData);
outFile.WriteHuge(buffer,dbImages.m_Image.m_dwDataLength);

GlobalUnlock(dbImages.m_Image.m_hData);
outFile.Close();
//定義圖像句柄;
HBITMAP hbm = (HBITMAP)::LoadImage(NULL,
strFileName,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE);

if (Bitmap.Attach(hbm))//將圖像句柄和Cbitmap對(duì)象聯(lián)系起來
{
BITMAP bm;
Bitmap.GetBitmap(&bm);//獲取圖像尺寸
Bitmap.SetBitmapDimension(bm.bmWidth,bm.bmHeight);
return;
}
Invalidate();//重畫屏幕
}
/////////////////////////////////////////////
void CImageView::OnDraw(CDC* pDC)//顯示圖像
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pImage = memDC.SelectObject(Bitmap);
CSize imageSize = Bitmap.GetBitmapDimension();
pDC->BitBlt(0,0,imageSize.cx,imageSize.cy,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pImage);
}
//////////////////////////////////////////////////////
//以下是向數(shù)據(jù)中添加圖像記錄
void CImageView::OnSaveDateBase()
{//打開圖像文件
static char BASED_CODE szFilter[] = "Bitmap Files (*.bmp)*.bmp";
CdbImages dbImages(m_DB);
CFileDialog fd(TRUE,NULL,NULL,0,szFilter,this);
if (IDOK != fd.DoModal())
return;
dbImages.Open();//打開數(shù)據(jù)庫
dbImages.AddNew();//添加新的記錄
CFile fileImage;
CFileStatus fileStatus;
fileImage.Open(fd.GetPathName(), CFile::modeRead);
fileImage.GetStatus(fileStatus);//得到打開的圖像文件的狀態(tài)信息;
dbImages.m_Image.m_dwDataLength = fileStatus.m_size;
HGLOBAL hGlobal= GlobalAlloc(GPTR,fileStatus.m_size);//申請(qǐng)存放圖像數(shù)據(jù)的空間。
dbImages.m_Image.m_hData = GlobalLock(hGlobal);//將該空間付給m_hData成員;
//向緩沖區(qū)讀圖像數(shù)據(jù)
fileImage.ReadHuge(dbImages.m_Image.m_hData,fileStatus.m_size);//向m_Image讀圖像數(shù)據(jù)。
dbImages.SetFieldDirty(&dbImages.m_Image);//標(biāo)志數(shù)據(jù)庫已經(jīng)修改;
dbImages.SetFieldNull(&dbImages.m_Image,FALSE);//設(shè)置記錄為NULL;
dbImages.Update();//刷新數(shù)據(jù)庫的記錄
GlobalUnlock(hGlobal);
dbImages.Close();

}


  上述代碼在VC6.0,windows98下編譯通過,運(yùn)行正常,有愛好的朋友可以稍加修改,將文中所述的功能添加到自己的應(yīng)用程序當(dāng)中去。
更多文章 更多內(nèi)容請(qǐng)看數(shù)據(jù)庫相關(guān)文章專題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 旬邑县| 扶沟县| 新化县| 阜平县| 竹北市| 柳州市| 秦安县| 莲花县| 定远县| 海伦市| 尚义县| 来安县| 太仆寺旗| 湖州市| 河津市| 彩票| 庆城县| 若尔盖县| 金湖县| 台南市| 法库县| 会东县| 城口县| 石景山区| 绥芬河市| 怀柔区| 洛隆县| 海兴县| 昂仁县| 蕲春县| 南昌县| 杭锦后旗| 太保市| 金昌市| 松滋市| 台北县| 广平县| 临江市| 铜梁县| 建始县| 连平县|