使用 TWAIN 的复制实用程序






4.54/5 (8投票s)
2004 年 7 月 15 日
2分钟阅读

103994

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。