亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? twaincpp.cpp

?? 攝 像 頭 驅 動 程 序
?? CPP
字號:
#include "stdafx.h"
#include "twaincpp.h"

/*
Constructor:
	Parameters : HWND 
				Window to subclass
				 
*/
CTwain::CTwain(HWND hWnd)
{
	m_hTwainDLL = NULL;
	m_pDSMProc = NULL;
	m_bSourceSelected = FALSE;
	m_bDSOpen = m_bDSMOpen = FALSE;
	m_bSourceEnabled = FALSE;
	m_bModalUI = TRUE;
	m_nImageCount = TWCPP_ANYCOUNT;
	if(hWnd)
	{
		InitTwain(hWnd);
	}
}

CTwain::~CTwain()
{
	ReleaseTwain();
}

/*
Initializes TWAIN interface . Is already called from the constructor. 
It should be called again if ReleaseTwain is called.

  hWnd is the window which has to subclassed in order to recieve
  Twain messaged. Normally - this would be your main application window.

*/
BOOL CTwain::InitTwain(HWND hWnd)
{
char libName[512];
	if(IsValidDriver()) 
	{
		return TRUE;
	}
	memset(&m_AppId,0,sizeof(m_AppId));
	if(!IsWindow(hWnd))
	{
		return FALSE;
	}
	m_hMessageWnd = hWnd;
	strcpy(libName,"TWAIN_32.DLL");
	
	m_hTwainDLL  = LoadLibrary(libName);
	if(m_hTwainDLL != NULL)
	{
		if(!(m_pDSMProc = (DSMENTRYPROC)GetProcAddress(m_hTwainDLL,MAKEINTRESOURCE(1))))
		{
			FreeLibrary(m_hTwainDLL);
			m_hTwainDLL = NULL;
		}
	}
	if(IsValidDriver())
	{
		GetIdentity();
		m_bDSMOpen= CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_PARENT,MSG_OPENDSM,(TW_MEMREF)&m_hMessageWnd);
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/*
Releases the twain interface . Need not be called unless you
want to specifically shut it down.
*/
void CTwain::ReleaseTwain()
{
	if(IsValidDriver())
	{
		CloseDSM();
		FreeLibrary(m_hTwainDLL);
		m_hTwainDLL = NULL;
		m_pDSMProc = NULL;
	}
}

/*
Returns true if a valid driver has been loaded
*/
BOOL CTwain::IsValidDriver() const
{
	return (m_hTwainDLL && m_pDSMProc);
}

/*
Entry point into Twain. For a complete description of this
routine  please refer to the Twain specification 1.8
*/
BOOL CTwain::CallTwainProc(pTW_IDENTITY pOrigin,pTW_IDENTITY pDest,
					   TW_UINT32 DG,TW_UINT16 DAT,TW_UINT16 MSG,
					   TW_MEMREF pData)
{
	if(IsValidDriver())
	{
	USHORT ret_val;
		ret_val = (*m_pDSMProc)(pOrigin,pDest,DG,DAT,MSG,pData);
		m_returnCode = ret_val;
		if(ret_val != TWRC_SUCCESS)
		{
			(*m_pDSMProc)(pOrigin,pDest,DG_CONTROL,DAT_STATUS,MSG_GET,&m_Status);
		}
		return (ret_val == TWRC_SUCCESS);
	}
	else
	{
		m_returnCode = TWRC_FAILURE;
		return FALSE;
	}
}

/*
This function should ideally be overridden in the derived class . If only a 
few fields need to be updated , call CTawin::GetIdentity first in your
derived class
*/
void CTwain::GetIdentity()
{
	// Expects all the fields in m_AppId to be set except for the id field.
	m_AppId.Id = 0; // Initialize to 0 (Source Manager
	// will assign real value)
	m_AppId.Version.MajorNum = 3; //Your app's version number
	m_AppId.Version.MinorNum = 5;
	m_AppId.Version.Language = TWLG_USA;
	m_AppId.Version.Country = TWCY_USA;
	strcpy (m_AppId.Version.Info, "3.5");
	m_AppId.ProtocolMajor = TWON_PROTOCOLMAJOR;
	m_AppId.ProtocolMinor = TWON_PROTOCOLMINOR;
	m_AppId.SupportedGroups = DG_IMAGE | DG_CONTROL;
	strcpy (m_AppId.Manufacturer, "MICSS");
	strcpy (m_AppId.ProductFamily, "Generic");
	strcpy (m_AppId.ProductName, "Twain Test");

}


/*
Called to display a dialog box to select the Twain source to use.
This can be overridden if a list of all sources is available
to the application. These sources can be enumerated by Twain.
it is not yet supportted by CTwain.
*/
BOOL CTwain::SelectSource()
{
	memset(&m_Source,0,sizeof(m_Source));
	if(!SourceSelected())
	{
		SelectDefaultSource();
	}
	if(CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_USERSELECT,&m_Source))
	{
		m_bSourceSelected = TRUE;
	}
	return m_bSourceSelected;
}

/*
Called to select the default source
*/
BOOL CTwain::SelectDefaultSource()
{
	m_bSourceSelected = CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_GETDEFAULT,&m_Source);
	return m_bSourceSelected;
}

/*
Closes the Data Source
*/
void CTwain::CloseDS()
{
	if(DSOpen())
	{
		DisableSource();
		CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_CLOSEDS,(TW_MEMREF)&m_Source);
		m_bDSOpen = FALSE;
	}
}

/*
Closes the Data Source Manager
*/
void CTwain::CloseDSM()
{
	if(DSMOpen())
	{
		CloseDS();
		CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_PARENT,MSG_CLOSEDSM,(TW_MEMREF)&m_hMessageWnd);
		m_bDSMOpen = FALSE;
	}
}

/*
Returns true if the Data Source Manager is Open
*/
BOOL CTwain::DSMOpen() const
{
	return IsValidDriver() && m_bDSMOpen;
}

/*
Returns true if the Data Source is Open
*/
BOOL CTwain::DSOpen() const
{
	return IsValidDriver() && DSMOpen() && m_bDSOpen;
}

/*
Opens a Data Source supplied as the input parameter
*/
BOOL CTwain::OpenSource(TW_IDENTITY *pSource)
{
	if(pSource) 
	{
		m_Source = *pSource;
	}
	if(DSMOpen())
	{
		if(!SourceSelected())
		{
			SelectDefaultSource();
		}
		m_bDSOpen = CallTwainProc(&m_AppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_OPENDS,(TW_MEMREF)&m_Source);
	}
	return DSOpen();
}

/*
Should be called from the main message loop of the application. Can always be called,
it will not process the message unless a scan is in progress.
*/
BOOL CTwain::ProcessMessage(MSG msg)
{
	if(SourceEnabled())
	{
	TW_EVENT twEvent;
		twEvent.pEvent = (TW_MEMREF)&msg;
		twEvent.TWMessage = MSG_NULL;
	
		CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_EVENT,MSG_PROCESSEVENT,(TW_MEMREF)&twEvent);
		if(GetRC() != TWRC_NOTDSEVENT)
		{
			TranslateMessage(twEvent);
		}
		return FALSE;

	}
	return FALSE;
}

/*
Queries the capability of the Twain Data Source
*/
BOOL CTwain::GetCapability(TW_CAPABILITY& twCap,TW_UINT16 cap,TW_UINT16 conType)
{
	if(DSOpen())
	{
		twCap.Cap = cap;
		twCap.ConType = conType;
		twCap.hContainer = NULL;

		if(CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_CAPABILITY,MSG_GET,(TW_MEMREF)&twCap))
		{
			return TRUE;
		}
	}
	return FALSE;
}

/*
Queries the capability of the Twain Data Source
*/
BOOL CTwain::GetCapability(TW_UINT16 cap,TW_UINT32& value)
{
TW_CAPABILITY twCap;
	if(GetCapability(twCap,cap))
	{
	pTW_ONEVALUE pVal;
		pVal = (pTW_ONEVALUE )GlobalLock(twCap.hContainer);
		if(pVal)
		{
			value = pVal->Item;
			GlobalUnlock(pVal);
			GlobalFree(twCap.hContainer);
			return TRUE;
		}
	}
	return FALSE;
}


/*
Sets the capability of the Twain Data Source
*/
BOOL CTwain::SetCapability(TW_UINT16 cap,TW_UINT16 value,BOOL sign)
{
	if(DSOpen())
	{
	TW_CAPABILITY twCap;
	pTW_ONEVALUE pVal;
	BOOL ret_value = FALSE;

		twCap.Cap = cap;
		twCap.ConType = TWON_ONEVALUE;
		
		twCap.hContainer = GlobalAlloc(GHND,sizeof(TW_ONEVALUE));
		if(twCap.hContainer)
		{
			pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
			pVal->ItemType = sign ? TWTY_INT16 : TWTY_UINT16;
			pVal->Item = (TW_UINT32)value;
			GlobalUnlock(twCap.hContainer);
			ret_value = SetCapability(twCap);
			GlobalFree(twCap.hContainer);
		}
		return ret_value;
	}
	return FALSE;
}

/*
Sets the capability of the Twain Data Source
*/
BOOL CTwain::SetCapability(TW_CAPABILITY& cap)
{
	if(DSOpen())
	{
		return CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_CAPABILITY,MSG_SET,(TW_MEMREF)&cap);
	}
	return FALSE;
}

/*
Sets the number of images which can be accpeted by the application at one time
*/
BOOL CTwain::SetImageCount(TW_INT16 nCount)
{
	if(SetCapability(CAP_XFERCOUNT,(TW_UINT16)nCount,TRUE))
	{
		m_nImageCount = nCount;
		return TRUE;
	}
	else
	{
		if(GetRC() == TWRC_CHECKSTATUS)
		{
		TW_UINT32 count;
			if(GetCapability(CAP_XFERCOUNT,count))
			{
				nCount = (TW_INT16)count;
				if(SetCapability(CAP_XFERCOUNT,nCount))
				{
					m_nImageCount = nCount;
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}

/*
Called to enable the Twain Acquire Dialog. This too can be
overridden but is a helluva job . 
*/
BOOL CTwain::EnableSource(BOOL showUI)
{
	if(DSOpen() && !SourceEnabled())
	{
		TW_USERINTERFACE twUI;
		twUI.ShowUI = showUI;
		twUI.hParent = (TW_HANDLE)m_hMessageWnd;
		if(CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_USERINTERFACE,MSG_ENABLEDS,(TW_MEMREF)&twUI))
		{
			m_bSourceEnabled = TRUE;
			m_bModalUI = twUI.ModalUI;
		}
		else
		{
			m_bSourceEnabled = FALSE;
			m_bModalUI = TRUE;
		}
		return m_bSourceEnabled;
	}
	return FALSE;
}

/*
Called to acquire images from the source. parameter numImages i the
numberof images that you an handle concurrently
*/
BOOL CTwain::Acquire(int numImages)
{
	if(DSOpen() || OpenSource())
	{
		if(SetImageCount(numImages))
		{
			if(EnableSource())
			{
				return TRUE;
			}
		}
	}
	return FALSE;
}

/*
 Called to disable the source.
*/
BOOL CTwain::DisableSource()
{
	if(SourceEnabled())
	{
	TW_USERINTERFACE twUI;
		if(CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_USERINTERFACE,MSG_DISABLEDS,&twUI))
		{
			m_bSourceEnabled = FALSE;
			return TRUE;
		}
	}
	return FALSE;
}

/*
Called by ProcessMessage to Translate a TWAIN message
*/
void CTwain::TranslateMessage(TW_EVENT& twEvent)
{
	switch(twEvent.TWMessage)
	{
	case MSG_XFERREADY:
			TransferImage();
			break;
	case MSG_CLOSEDSREQ:
			if(CanClose())
			{
				CloseDS();
			}
			break;
	}
}

/*
Gets Imageinfo for an image which is about to be transferred.
*/
BOOL CTwain::GetImageInfo(TW_IMAGEINFO& info)
{
	if(SourceEnabled())
	{
		return CallTwainProc(&m_AppId,&m_Source,DG_IMAGE,DAT_IMAGEINFO,MSG_GET,(TW_MEMREF)&info);
	}
	return FALSE;
}

/*
Trasnfers the image or cancels the transfer depending on the state of the
TWAIN system
*/
void CTwain::TransferImage()
{
TW_IMAGEINFO info;
BOOL bContinue=TRUE;
	while(bContinue)
	{
		if(GetImageInfo(info))
		{
			int permission;
			permission = ShouldTransfer(info);
			switch(permission)
			{
			case TWCPP_CANCELTHIS:
					bContinue=EndTransfer();
					break;
			case TWCPP_CANCELALL:
					CancelTransfer();
					bContinue=FALSE;
					break;
			case TWCPP_DOTRANSFER:
					bContinue=GetImage(info);
					break;
			}
		}
	}
}

/*
Ends the current transfer.
Returns TRUE if the more images are pending
*/
BOOL CTwain::EndTransfer()
{
TW_PENDINGXFERS twPend;
	if(CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_PENDINGXFERS,MSG_ENDXFER,(TW_MEMREF)&twPend))
	{
		return twPend.Count != 0;
	}
	return FALSE;
}

/*
Aborts all transfers
*/
void CTwain::CancelTransfer()
{
TW_PENDINGXFERS twPend;
	CallTwainProc(&m_AppId,&m_Source,DG_CONTROL,DAT_PENDINGXFERS,MSG_RESET,(TW_MEMREF)&twPend);
}

/*
Calls TWAIN to actually get the image
*/
BOOL CTwain::GetImage(TW_IMAGEINFO& info)
{
HANDLE hBitmap;
	CallTwainProc(&m_AppId,&m_Source,DG_IMAGE,DAT_IMAGENATIVEXFER,MSG_GET,&hBitmap);
	switch(m_returnCode)
	{
	case TWRC_XFERDONE:
			CopyImage(hBitmap,info);
			break;
	case TWRC_CANCEL:
			break;
	case TWRC_FAILURE:
			CancelTransfer();
			return FALSE;

	}
	GlobalFree(hBitmap);
	return EndTransfer();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性一级生活| 蜜桃久久av一区| 国产精品视频观看| 一区二区三区四区在线免费观看| 国产精品妹子av| 亚洲激情图片qvod| 亚洲综合在线电影| 亚洲国产aⅴ成人精品无吗| 日韩av电影免费观看高清完整版| 亚洲一区二区在线视频| 激情深爱一区二区| 91免费视频网| 精品国产一区二区三区av性色| 国产精品毛片大码女人| 亚洲男人的天堂av| 精品中文字幕一区二区| 99久久婷婷国产综合精品电影 | 99久免费精品视频在线观看| 欧美在线视频不卡| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品久久久久久久久图文区| 日韩在线播放一区二区| 91老师片黄在线观看| 精品久久久久香蕉网| 亚洲国产毛片aaaaa无费看| 粉嫩嫩av羞羞动漫久久久| 欧美三级中文字| 亚洲精品欧美专区| 99久久伊人网影院| 国产精品色呦呦| 国产盗摄一区二区三区| 337p日本欧洲亚洲大胆精品| 亚洲成人综合视频| 欧美午夜免费电影| 一区二区欧美国产| 日本二三区不卡| 亚洲一区二区三区四区在线观看| 9久草视频在线视频精品| 中国av一区二区三区| 国产精品911| 国产清纯白嫩初高生在线观看91| 国产精品99久久久久| 精品播放一区二区| 国产 日韩 欧美大片| 国产精品视频yy9299一区| 一本色道久久综合亚洲精品按摩| 亚洲国产中文字幕在线视频综合| 欧美日韩中文字幕一区二区| 麻豆国产欧美日韩综合精品二区| 精品国精品国产尤物美女| 国产成人高清视频| 亚洲亚洲人成综合网络| 91麻豆精品国产91久久久使用方法 | 成人精品免费网站| 亚洲一区欧美一区| 欧美国产精品一区| 91一区二区在线观看| 日韩精品电影在线| 1000精品久久久久久久久| 日韩欧美不卡在线观看视频| 成人免费毛片aaaaa**| 午夜av一区二区三区| 日韩高清在线观看| 久久五月婷婷丁香社区| 在线亚洲人成电影网站色www| 六月丁香综合在线视频| 最近中文字幕一区二区三区| 欧美成人精品3d动漫h| 91在线视频网址| 久久66热re国产| 青青草原综合久久大伊人精品| 尤物在线观看一区| 1024成人网| 亚洲另类一区二区| 亚洲欧美在线另类| 中文字幕永久在线不卡| 国产女人aaa级久久久级| 欧美mv日韩mv国产| 日韩欧美黄色影院| 日韩免费高清av| 日韩精品一区二区三区中文不卡| 日韩一区二区三区视频在线| 日韩免费成人网| 日韩精品综合一本久道在线视频| 在线一区二区三区做爰视频网站| 一本大道av伊人久久综合| caoporn国产一区二区| 色偷偷88欧美精品久久久| 91在线看国产| 欧美日韩精品综合在线| 欧美久久久久久蜜桃| 精品日本一线二线三线不卡| 国产欧美日韩三区| 一区二区三区在线影院| 午夜电影久久久| 国产伦理精品不卡| 色域天天综合网| 精品国产三级a在线观看| 日本一二三四高清不卡| 亚洲黄色免费网站| 老司机精品视频一区二区三区| 国产精品一卡二卡在线观看| 日本精品一区二区三区四区的功能| 91精品在线观看入口| 中文字幕在线观看一区二区| 午夜欧美2019年伦理| 成人性生交大片免费看在线播放| 欧美四级电影网| 国产精品麻豆视频| 激情综合网av| 久久久久久久久久久黄色| 日韩高清欧美激情| 色综合久久久久综合体桃花网| 26uuu色噜噜精品一区二区| 午夜电影一区二区三区| 色噜噜狠狠一区二区三区果冻| 国产香蕉久久精品综合网| 偷拍一区二区三区| 91啪九色porn原创视频在线观看| 久久女同互慰一区二区三区| 亚洲成人黄色影院| 欧美色大人视频| 亚洲狠狠爱一区二区三区| 在线亚洲人成电影网站色www| 国产精品国产成人国产三级| 972aa.com艺术欧美| 午夜精品成人在线视频| 91色porny在线视频| 亚洲综合色自拍一区| 91精品国产麻豆| 国产综合色视频| 亚洲欧洲精品一区二区三区| 成人午夜看片网址| 一区二区三区四区av| 欧美美女直播网站| 韩国一区二区三区| 国产精品久久看| 欧美日韩在线播放一区| 久久精品国产99| 国产网站一区二区| 欧美高清精品3d| 国产精品99久久久久久似苏梦涵| 国产精品二区一区二区aⅴ污介绍| 99久久精品国产一区二区三区| 午夜久久久影院| 国产视频视频一区| 欧美日韩在线播| 成人av在线影院| 亚洲第一成人在线| 欧美激情中文字幕| 欧美日韩五月天| 成人黄色a**站在线观看| 蜜桃视频第一区免费观看| 一区二区三区四区在线| 精品国产亚洲在线| 欧美一区二区视频免费观看| 91天堂素人约啪| 国产一区二区三区黄视频 | 久久久99久久精品欧美| 91国产成人在线| 豆国产96在线|亚洲| 极品美女销魂一区二区三区| 国产亚洲欧美日韩俺去了| 欧美大胆人体bbbb| 欧美人狂配大交3d怪物一区 | 欧美婷婷六月丁香综合色| 成人午夜电影小说| 成人免费黄色大片| 成人免费高清在线观看| 国产成人丝袜美腿| 日本欧美一区二区在线观看| 日韩精品1区2区3区| 日本不卡的三区四区五区| 日日噜噜夜夜狠狠视频欧美人 | 欧美日韩久久不卡| 67194成人在线观看| 日韩欧美在线1卡| 国产无人区一区二区三区| 久久影院电视剧免费观看| 国产欧美一区二区三区鸳鸯浴 | 久久毛片高清国产| 久久亚洲一区二区三区明星换脸 | 风间由美性色一区二区三区| 9人人澡人人爽人人精品| 欧美色图激情小说| 日韩午夜中文字幕| 中文字幕在线不卡国产视频| 亚洲国产精品视频| 精品一区二区三区日韩| 成人黄色777网| 欧美视频一区二区三区在线观看| 精品久久久影院| 亚洲视频小说图片| 久久99精品久久久久婷婷| 成人深夜在线观看| 在线观看91av| 日韩理论片在线| 激情都市一区二区| 欧美一级一级性生活免费录像| 国产精品视频一二三|