用VC处理ACCESS中的位图数据
添加时间: 2006-2-11 1:24:39 作者: VC教程 阅读次数:137 来源: http://www.d9soft.com
作 者 定 义 了 一 个 以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() 里 调 用 外, 也 被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 对 象 替 换 原 来 的 就 行 了。
上下文章:
上一篇文章: Visual C++中的ODBC编程实例 下一篇文章: 在 Visual C++ 中使用内联汇编
相关文章:

