280上位机VC MFC使用DAO读取数据库内部位图
280上位机VC MFC使用DAO读取数据库内部位图
功能展示
数据库文件有时会包含有位图信息,我们当前例程演示如何从数据文件中读取位图,并显示在程序界面上,效果如图,点击<从数据库读取位图>程序会从例程根目录的数据库文件读取出位图并显示出来; 要点提示 图象数据域与文件不同,它是作为OLE字段在数据库中存储,通过数据集对象的成员变量,自动交换得到的图像数据,得到的数据不能直接显示,我们当前例程是通过CByteArray保存图象字段,先从二进制数组中分别提取BITMAPINFOHEADER,BITMAPINFO等位图信息,然后调用CreateDIBitmap函数创建一位图文件,并在例程的OnPaint()函数中显示出来; 实现过程 1.新建基于对话框的应用程序 2.利用例程根目录的数据库文件创建一新的基于CDaoRecordset类,类名为CImageSet; 3.修改新建类CImageSet 成员变量CLongBinary m_Images;类型为CByteArray m_Images;修改对应DoFieldExchange()函数内的代码DFX_LongBinary(pFX, _T(“[Images]”), m_Images);为DFX_Binary(pFX, _T("[Images]"), m_Images); 4.修改类GetDefaultSQL的返回数据库路径为相对路径,并在stdafx.h头文件中添加#include <afxdao.h> //MFC DAO SUPPORT 5.在主对话框中添加按钮控件<从数据库读取位图>关联函数 void CGkbc8Dlg::OnRead() { CImageSet db; db.Open();//打开数据库 ReadFromBLOB(db.m_Images);//显示位图 Invalidate(); db.Close(); //关闭数据库 } 6.在主对话框中添加自定义函数及变量public: BOOLReadFromBLOB(CByteArray & DBArray);
CBitmap OleBmp; - BOOL CGkbc8Dlg::ReadFromBLOB(CByteArray & DBArray)
- {
- CByteArray Array;
- Array.Copy(DBArray);
-
- //获得位图文件头信息长度
- int HeaderLen= 74+sizeof(BITMAPFILEHEADER);
- Array.RemoveAt(0,HeaderLen); // I cut all Headers
- DWORD dwSize = sizeof (BITMAPINFOHEADER);
- //获得位图信息
- BITMAPINFOHEADER &bmiHeader=*(LPBITMAPINFOHEADER)Array.GetData();
- BITMAPINFO &bmInfo=*(LPBITMAPINFO)Array.GetData();
- //获得位图色数
- int nColors=bmiHeader.biClrUsed?
- bmiHeader.biClrUsed: 1<<bmiHeader.biBitCount;
- //获得位图数据
- LPVOID lpDIBBits;
- if(bmInfo.bmiHeader.biBitCount>8)
- lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
- ((bmInfo.bmiHeader.biCompression==BI_BITFIELDS) ? 3:0));
- else
- lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);
- CClientDC dc(NULL);
- //创建位图
- HBITMAP hBmp=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
- OleBmp.Attach(hBmp);
- //清除临时数组
- Array.RemoveAll();
- return TRUE;
- }
复制代码7.在主对话框OnPaint()函数中显示提取出的位图 - else
- {
- CPaintDC dc(this);
- if(!(OleBmp.m_hObject==NULL))
- {
- CDC dcMem;
- dcMem.CreateCompatibleDC(&dc);
- CBitmap* pbmpOld;
- BITMAP BmpSize;
- OleBmp.GetBitmap(&BmpSize); //get Image size
- pbmpOld=dcMem.SelectObject(&OleBmp);
- dc.StretchBlt(5,5,150,200,&dcMem,0,0,BmpSize.bmWidth,BmpSize.bmHeight,SRCCOPY);
- dcMem.SelectObject(pbmpOld);
- OleBmp.Detach();
- }
- CDialog::OnPaint();
- }
复制代码我们来演示下功能实现的整个过程
|