📄 twainhelper.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "TwainHelper.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CTwainHelper 类静态变量
HWND CTwainHelper::m_hParent = NULL;
HMODULE CTwainHelper::m_hTwain = NULL;
DSMENTRYPROC CTwainHelper::m_dpDsmEntry = NULL;
TW_IDENTITY CTwainHelper::m_twidOrigin = {0};
TW_IDENTITY CTwainHelper::m_twidSource = {0};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 初始化 TWAIN 库
BOOL CTwainHelper::Initialize(HWND hParent)
{
BOOL bResult;
TW_UINT16 twuResult;
// 初始化变量
bResult = FALSE;
// 初始化 m_twidOrigin 结构
m_twidOrigin.Id = 0;
m_twidOrigin.Version.MajorNum = 1;
m_twidOrigin.Version.MinorNum = 0;
m_twidOrigin.Version.Language = TWLG_CHINESE_PRC;
m_twidOrigin.Version.Country = TWCY_CHINA;
m_twidOrigin.ProtocolMajor = TWON_PROTOCOLMAJOR;
m_twidOrigin.ProtocolMinor = TWON_PROTOCOLMINOR;
m_twidOrigin.SupportedGroups = DG_IMAGE | DG_CONTROL;
lstrcpyA(m_twidOrigin.ProductName, "TwainHelper");
lstrcpyA(m_twidOrigin.ProductFamily, "TwainHelper");
lstrcpyA(m_twidOrigin.Manufacturer, "Yonsm.NET");
lstrcpyA(m_twidOrigin.Version.Info, "1.0.0.0");
// 检查参数
if (hParent)
{
// 设置父窗口
m_hParent = hParent;
// 载入 TWAIN 库
m_hTwain = LoadLibrary(TEXT("TWAIN_32"));
if (m_hTwain)
{
// 获取数据源管理器入口函数地址
m_dpDsmEntry = (DSMENTRYPROC) GetProcAddress(m_hTwain, "DSM_Entry");
if (m_dpDsmEntry)
{
// 打开数据源管理器
twuResult = DsmEntry(NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &m_hParent);
if (twuResult == TWRC_SUCCESS)
{
// 选择默认数据源
twuResult = DsmEntry(NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &m_twidSource);
if (twuResult == TWRC_SUCCESS)
{
bResult = TRUE;
}
// 关闭数据源管理器
DsmEntry(NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM,&m_hParent);
}
m_dpDsmEntry = NULL;
}
// 释放 TWAIN 库
FreeLibrary(m_hTwain);
m_hTwain = NULL;
}
}
return bResult;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 从 TWAIN 设备中获取图像,并以消息回调的形式通知父窗口
BOOL CTwainHelper::GetImage(UINT uCount)
{
TW_UINT16 twuResult;
// 如果已经在执行获取图像会话过程
if (m_dpDsmEntry)
{
return TRUE;
}
// 初始化变量
twuResult = TWRC_FAILURE;
// 载入 TWAIN 库
m_hTwain = LoadLibrary(TEXT("TWAIN_32"));
if (m_hTwain)
{
// 获取数据源管理器入口函数地址
m_dpDsmEntry = (DSMENTRYPROC) GetProcAddress(m_hTwain, "DSM_Entry");
if (m_dpDsmEntry)
{
// 打开数据源管理器
twuResult = DsmEntry(NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &m_hParent);
if (twuResult == TWRC_SUCCESS)
{
// 选择数据源
twuResult = DsmEntry(NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &m_twidSource);
if (twuResult == TWRC_SUCCESS)
{
// 打开数据源
twuResult = DsmEntry(NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_twidSource);
if (twuResult == TWRC_SUCCESS)
{
// 设置获取方式
SetOneValueCap(ICAP_XFERMECH, TWSX_FILE);
if (uCount)
{
// 设置要获取的图像的数量
SetOneValueCap(CAP_XFERCOUNT, uCount);
}
// 显示获取图像对话框
twuResult = ShowUI();
}
}
}
}
if (twuResult != TWRC_SUCCESS)
{
Close();
}
}
return ((twuResult == TWRC_SUCCESS) || (twuResult == TWRC_CANCEL));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 处理 TWAIN 消息
BOOL CTwainHelper::ProcessMessage(const PMSG pmsgMsg)
{
BOOL bCancel;
TW_EVENT tweEvent;
TW_UINT16 twuResult;
TW_PENDINGXFERS twpPending;
// 检查数据源管理器入口函数地址
if (m_dpDsmEntry == NULL)
{
return FALSE;
}
// 处理消息
tweEvent.TWMessage = 0;
tweEvent.pEvent = pmsgMsg;
twuResult = DsmEntry(&m_twidSource, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, &tweEvent);
if (twuResult != TWRC_DSEVENT)
{
return FALSE;
}
switch (tweEvent.TWMessage)
{
case MSG_XFERREADY:
// 数据已准备好
twpPending.Count = 0;
twpPending.Reserved = 0;
do
{
// 通知父窗口准备传送文件
bCancel = (SendMessage(m_hParent, WM_COMMAND, MAKELONG(IDC_TwainHelper, twpPending.Count), 0) == S_FALSE);
// 完成当前获取图像
twuResult = DsmEntry(&m_twidSource, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, &twpPending);
}
while ((twpPending.Count != 0) && (twuResult != TWRC_FAILURE) && (bCancel == FALSE));
break;
case MSG_CLOSEDSREQ:
case MSG_CLOSEDSOK:
// 关闭获取图像对话框
Close();
break;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 传送图像到文件中
BOOL CTwainHelper::TransferImage(PCTSTR ptzFileName)
{
TW_UINT16 twuResult;
TW_SETUPFILEXFER twsfFile;
// 检查参数
if (ptzFileName)
{
// 设置获取图像参数
twsfFile.VRefNum = 0;
twsfFile.Format = TWFF_BMP;
#ifdef UNICODE
WideCharToMultiByte(CP_ACP, 0, ptzFileName, -1, twsfFile.FileName, 255, NULL, NULL);
#else // UNICODE
lstrcpy(twsfFile.FileName, ptzFileName);
#endif // UNICODE
twuResult = DsmEntry(&m_twidSource, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &twsfFile);
if (twuResult == TWRC_SUCCESS)
{
// 获取图像
twuResult = DsmEntry(&m_twidSource, DG_IMAGE, DAT_IMAGEFILEXFER, MSG_GET, NULL);
if ((twuResult != TWRC_CANCEL) && (twuResult != TWRC_FAILURE))
{
return TRUE;
}
}
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关闭 TWAIN 对话框
VOID CTwainHelper::Close()
{
if (m_dpDsmEntry)
{
// 隐藏获取图像对话框
HideUI();
// 关闭数据源
DsmEntry(NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &m_twidSource);
// 关闭数据源管理器
DsmEntry(NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM,&m_hParent);
m_dpDsmEntry = NULL;
}
// 释放 TWAIN 库
if (m_hTwain)
{
FreeLibrary(m_hTwain);
m_hTwain = NULL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -