工控编程吧
标题:
280上位机VC MFC使用DAO读取数据库内部位图
[打印本页]
作者:
qq263946146
时间:
2016-5-7 23:19
标题:
280上位机VC MFC使用DAO读取数据库内部位图
(, 下载次数: 2)
上传
点击文件名下载附件
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();
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/abea70bae860462ee655c1167fc7cff2/0/0/w_19rsttmuap.swf-albumId=6397293709-tvId=6397293709-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4