当前位置:数据库 > Access >>

VC 处 理 ACCESS 中 的 位 图 数 据

 

 

比 较 复 杂 的 数 据 库 中 一般 会 有 位 图 数 据( 比 如 相 片)。

虽 然 这 类“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 结 构):

 

DWORD dwBufSize;

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()

补充:软件开发 , Vc ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,