⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twainhelper.cpp

📁 twain事例 本人精心收藏 相信对大家有帮助
💻 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 + -