QQ登录

只需一步,快速开始

280上位机VC MFC使用DAO读取数据库内部位图

[ 复制链接 ]

280上位机VC MFC使用DAO读取数据库内部位图

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;
  1. BOOL CGkbc8Dlg::ReadFromBLOB(CByteArray & DBArray)
  2. {
  3.     CByteArray Array;
  4.     Array.Copy(DBArray);
  5.          
  6.         //获得位图文件头信息长度
  7.         int HeaderLen= 74+sizeof(BITMAPFILEHEADER);
  8.         Array.RemoveAt(0,HeaderLen); // I cut all Headers

  9.         DWORD dwSize = sizeof (BITMAPINFOHEADER);
  10.         //获得位图信息
  11.         BITMAPINFOHEADER &bmiHeader=*(LPBITMAPINFOHEADER)Array.GetData();
  12.         BITMAPINFO &bmInfo=*(LPBITMAPINFO)Array.GetData();

  13.         //获得位图色数
  14.         int nColors=bmiHeader.biClrUsed?
  15.                 bmiHeader.biClrUsed: 1<<bmiHeader.biBitCount;

  16.         //获得位图数据
  17.         LPVOID lpDIBBits;
  18.         if(bmInfo.bmiHeader.biBitCount>8)
  19.                 lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
  20.                 ((bmInfo.bmiHeader.biCompression==BI_BITFIELDS) ? 3:0));
  21.         else
  22.                 lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);

  23.         CClientDC dc(NULL);

  24.         //创建位图
  25.         HBITMAP hBmp=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
  26.         OleBmp.Attach(hBmp);

  27.         //清除临时数组
  28.         Array.RemoveAll();

  29.         return TRUE;
  30. }
复制代码
7.在主对话框OnPaint()函数中显示提取出的位图
  1. else
  2.         {
  3.                 CPaintDC dc(this);
  4.                 if(!(OleBmp.m_hObject==NULL))
  5.                 {
  6.                         CDC dcMem;
  7.                         dcMem.CreateCompatibleDC(&dc);
  8.                         CBitmap* pbmpOld;
  9.                         BITMAP BmpSize;
  10.                         OleBmp.GetBitmap(&BmpSize); //get Image size
  11.                         pbmpOld=dcMem.SelectObject(&OleBmp);
  12.                         dc.StretchBlt(5,5,150,200,&dcMem,0,0,BmpSize.bmWidth,BmpSize.bmHeight,SRCCOPY);
  13.                         dcMem.SelectObject(pbmpOld);
  14.                         OleBmp.Detach();
  15.                 }
  16.                 CDialog::OnPaint();
  17.         }
复制代码
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:280.上位机VC MFC使用DAO读取数据库内部位图.zip 
文件大小:179.36 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索