设为首页 加入收藏

TOP

VC 处 理 ACCESS 中 的 位 图 数 据
2014-11-23 20:10:49 】 浏览:9910
Tags: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中如何等比例缩放图像 下一篇如何用VC抓取屏幕图象并压缩?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目