用VC处理ACCESS中的位图数据

转载 2004年08月30日 20:57:00
用VC处理ACCESS中的位图数据

癫侠于2000-08-17下午05:49:58发表:
----比较复杂的数据库中一般会有位图数据(比如相片)。虽然这类“OLE对象”的插入、删除以及替换操作在ACCESS里容易实现,在VC中却显得复杂而且颇费周折。以下把作者用VC处理ACCESS数据库中的位图数据的体会简单叙述一下,以请教于大家。
----在CdaoRecordset派生类的对象中,VC自动为ACCESS的“OLE对象”域生成一个CLongBinary对象。该类虽然较简单,在程序里却需要使用全局函数GlobalAlloc()和GlobalFree()处理与它的内存句柄m_hData有关操作,访问数据前后要调用GlobalLock()和GlobalUnlock(),而且还要给它的m_dwDataLength赋值,使用起来相对复杂,所以一般推荐使用CByteArray类。这只需要在CdaoRecordset派生类对象的数据说明里修改一下,并把DoFieldExchange()里的DFX_LongBinary()改成DFX_Binary()即可。
----作者定义了一个以CObject为基类的CDib类(CDaoRecordView的派生类里定义了CDib对象成员m_DIB),其中包括一下成员和方法:
CByteArray m_bufDIB;
BOOL Create(CByteArray& ba);
BOOL Create(CFile& bmpFile);
BOOL Paint(HDC hDC);
----m_bufDIB是存储位图数据的缓冲区。为简便起见,它不包含包装信息和BITMAPFILEHEADER结构。这样对数据库更新后,原有的“OLE对象”类型将变成“长二进制数据”,不能在ACCESS里查看了。
----第一个Create()重载方法的参数ba是记录集的位图数据(比如m_image),使用CByteArray::Copy()把数据复制给m_bufDIB;第二个Create()方法的参数bmpFile是已打开的位图文件,使用CFile::ReadHuge()把文件里的数据读入m_bufDIB(放弃前面的BITMAPFILEHEADER结构):
DWORDdwBufSize;
dwBufSize=bmpFile.GetLength();//获得文件长度
bmpFile.Seek((long)sizeof(BITMAPFILEHEADER),
CFile::begin);//放弃文件头
dwBufSize-=sizeof(BITMAPFILEHEADER);
m_bufDIB.SetSize(dwBufSize);//设置缓冲区大小
file.ReadHuge((LPSTR)(m_bufDIB.GetData()),dwBufSize);
……
----Paint()方法调用了SetDIBitsToDevice()函数(根据情况也可以使用StretchDIBits()),参数hDC是CDaoRecordview的资源中的一个静态控制的设备句柄,作为SetDIBitsToDevice()的第一个参数。如果不是16或24位的位图,还需要建立和设置调色板。Paint()方法除了在CDaoRecordView派生类的OnMove()里调用外,也被OnPaint()调用(最好不在OnDraw()里调用):
void CDerivedView::OnPaint()
{
CPaintDC dc(this);
CClientDC dc1(&m_ctlImage);
if(m_DIB.Create(m_pSet->m_image))
m_DIB.Paint(dc1.m_hDC);
}
----作者首先采用的方法是,每当打开一个位图文件,调用m_DIB.Create()和m_DIB.Paint(),然后复制给m_pSet->m_image,再设置“脏”标识:
if(m_DIB.Create(bmpFile))
{
CClientDC dc(&m_ctlImage);
m_DIB.Paint(dc.m_hDC);
(m_pSet->m_image).Copy(m_DIB.m_bufDIB);
SetFieldDirty(&(m_pSet->m_image));
}
----记录滚动时,OnMove()调用Update()对数据进行更新。
----但是这样做的结果是,只有在域的内容不为空(NULL)的时候才能更新数据。也就是说,添加“长二进制数据”不能实现。
----最后发现使用SeieldValue()可以实现添加和替换。但由于作者未知的原因,还需要把另外某个域设置为“脏”才行:
if(m_DIB.Create(bmpFile))
{
CClientDC dc(&m_ctlImage);
m_DIB.Paint(dc.m_hDC);
(m_pSet->m_image).Copy(m_DIB.m_bufDIB);
// 只 为OnPaint() 调 用 时 使 用
m_pSet->SetFieldValue(_T("[image]"),
COleVariant(m_DIB.m_bufDIB));
m_pSet->SetFieldDirty(&(m_pSet->m_name));
// 任 意 另 外 一 个 域
}
----如果打算删除数据库里的位图数据,可以把一个“空”的CByteArray对象替换原来的就行了。
北京联大应用文理学院
苏鸿瑞
*****

VC 对Access数据库读写操作实例

直接利用DAO来创建、读写Access文件。在下面的示例中,我们将用到两种方法:SQL和DAO类函数来混合实现它们,这样做的目地,我想可以使大家更加方便灵活的运用它们来完成你想要做的东西。在示例程序中...
  • chen1083376511
  • chen1083376511
  • 2017年01月21日 18:49
  • 3210

Excel+Access做数据分析和报表分析

目录前言 设计思路 一切从简单开始 深入解剖 三分之Excel引用外部数据源 使用外部数据创建透视表透视图 使用外部数据创建图 深入解剖 三分之Access基本操作 Access操作之创建数据库 操作...
  • tuchangsheng801004
  • tuchangsheng801004
  • 2015年07月15日 17:33
  • 6666

VC++对Access数据库的操作(查询、插入、更新、删除等)

Microsoft Office Access是由微软发布的关系数据库管理系统。Access数据库常应用于小型软件系统中,比如:生产管理、销售管理、库存管理等各类企业管理软件,其最大的优点是:简单易学...
  • margin1988
  • margin1988
  • 2015年01月23日 15:16
  • 5585

根据位图数据直接绘图

在处理网格应用传输图像时,接收方收到的将是数据流,如何能够将图像数据显示在窗口中呢?Windows系统提供了StretchDIBits函数,通过它能够根据位图的数据流将图像显示在窗口中。 函数原型:...
  • shufac
  • shufac
  • 2014年04月03日 23:25
  • 925

dx做的求位图数据的HSI值

  • 2008年08月28日 16:13
  • 190KB
  • 下载

BMP位图数据结构 介绍c编程中bmp格式图片的相关信息

  • 2010年09月21日 11:15
  • 107KB
  • 下载

将位图数据读入离屏表面.(初学者借鉴)

以下是个人见解,有错误请正。多谢新浪网的朋友们的帮助。 下面是我刚学会的. 在网上看到了许多的关于装位图装载到离屏表面的文章,但是都是使用了WIN32函数,虽然有效,但不是很通用。如果我们要装载其它...
  • embededvc
  • embededvc
  • 2011年09月01日 00:57
  • 1446

《编程珠玑》学习笔记——第一章 位图数据结构

一、题目: 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n = 10^7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。 输出:按升序排列的输入整数的列表。 ...
  • chensilly8888
  • chensilly8888
  • 2014年12月29日 20:21
  • 499

位图数据结构

位图数据结构,就是用一块内存区域的每个比特表示一个对象的数据结构。 叫做 bitmap 或者 bitplane。 优点是速度快,内存空间占用小,能表示大范围的数据。 《Programming P...
  • smfwuxiao
  • smfwuxiao
  • 2011年12月29日 13:45
  • 6563

[转]位图数据内存优化

最近协助同事对Flash相册项目做了程序优化,觉得每个优化步骤的试验结果都挺有价值,所以在这里做一个记录分享。 项目现状 Flash相册程序,在播放60张图片后(60是相册图片数量上限),内存...
  • merryken
  • merryken
  • 2012年05月10日 17:57
  • 809
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用VC处理ACCESS中的位图数据
举报原因:
原因补充:

(最多只允许输入30个字)