65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 TWAIN 的复制实用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (8投票s)

2004 年 7 月 15 日

2分钟阅读

viewsIcon

103994

downloadIcon

6829

TWAIN 接口的简单封装示例。

引言

TWAIN 接口允许访问大多数图像源。它是一种在计算机编程方面相当古老的标准,因此使用 C 接口和 Windows 消息(在 Windows 系统上)进行通信。本示例展示了如何使用 C++ 接口封装 TWAIN 接口。

背景

有关 TWAIN 规范的详细信息,请查看 TWAIN 工作组的主页。我展示的这个示例指的是该文档的版本 1.9。它很容易阅读,但该接口非常广泛,并且主要使用一个接口函数来控制图像源。

// from twain.h:

...
#ifdef  _MSWIN_
TW_UINT16 FAR PASCAL DSM_Entry( pTW_IDENTITY pOrigin,
                                pTW_IDENTITY pDest,
                                TW_UINT32    DG,
                                TW_UINT16    DAT,
                                TW_UINT16    MSG,
                                TW_MEMREF    pData);

typedef TW_UINT16 (FAR PASCAL *DSMENTRYPROC)(pTW_IDENTITY, pTW_IDENTITY,
                                             TW_UINT32,    TW_UINT16,
                                             TW_UINT16,    TW_MEMREF);
#else   /* _MSWIN_ */
...
由于此函数的大量命令和消息作为可能的参数,因此该接口比乍看起来更复杂。完整的接口定义在 twain.h 中。此文件对于编译此示例是必需的,但未包含附加到此文档的源代码中,因为它由 TWAIN 工作组拥有,并且可以轻松地从那里下载。

使用代码

此示例仅使用 TWAIN 命令的一个子集,但很容易扩展它。我用两个不同的扫描仪对其进行了测试,即 Windows 2000 系统上的 Epson Perfection 和 Windows NT 6 系统上的一个相当旧的 HP DeskScan 3c。为了便于调试,程序在运行时会写入一个包含一些跟踪信息的日志文件。它支持两种语言,默认情况下为英语和德语。您可以通过在可执行文件目录中的配置文件 TCopy.ini 中输入
[Deutsch]
value=1
来切换到德语 GUI。它还存储亮度、对比度的预定义值。

此示例中最有趣的类是 CTwainPP,它隐藏了所有 TWAIN 内容。在运行时,它映射 Twain 源管理器 TWAIN_32.DLL 以连接到 TWAIN 系统。它使用一些辅助类。其中之一是 CTwainEventHandler,它接收图像源发送回的所有反馈 Windows 消息,并将其转发到 CTwainPP。为此,此类需要一个宿主窗口,在其内部挂钩自己的消息回调函数。这种技术允许将主对话框窗口回收用于此目的,但很容易用隐藏的附加窗口替换此机制。

除了 TWAIN 接口之外,示例应用程序还使用类 CDIBUse 来处理设备无关位图 (DIB),并使用类 CPrinterAccess 来控制打印机并打印 DIB。类 CShowBitmapCtrl 是一个专门的 CStatic 控件,用于显示 DIB。

© . All rights reserved.