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

📄 imagescanforgood.cpp

📁 图像扫描类的完整代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif




#ifdef WIN32
#define DSM_FILENAME "TWAIN_32.DLL"
#define DSM_ENTRYPOINT "DSM_Entry"
#else
#define DSM_FILENAME "TWAIN.DLL"
#define DSM_ENTRYPOINT "DSM_ENTRY"
#endif



#define IsValidHandle(h) ((h) != NULL)



#define TRACE_ERROR(e) { if (bTrace) TRACE("TWAIN: Error(%d) ", e); TwainError(e); }



static int iAvailable; // TWAIN available: 0:unknown, -1:No, 1:Yes
static DSMENTRYPROC pSM_Entry; // entry point of Data Source Manager (TWAIN_32.DLL)
static HINSTANCE hSMLib; // handle of SM



// default application identity structure:
const TW_IDENTITY DefAppId = {
0, // Id, filled in by SM
{ 1, 0, TWLG_USA, TWCY_USA, "OSM"}, // Version
TWON_PROTOCOLMAJOR,
TWON_PROTOCOLMINOR,
DG_IMAGE | DG_CONTROL,
"OSM", // Mfg
"OSM", // Family
"OSM" // Product
};
static TW_IDENTITY SourceId; // source identity structure




// CTwain class members
CTwain::CTwain(void)
: pDefWnd(NULL), nState(NO_TWAIN_STATE)
{
bShowUI = TRUE;
hDib = NULL;
rc = TWRC_SUCCESS;
// turn off if you get tired of seeing the output:
bTrace = TRUE;



AppId = DefAppId; // provide default registration
SetState(PRE_SESSION);



iAvailable= 0;//-1;
pSM_Entry = NULL;
hSMLib = NULL;
}



//注册应用信息 
void CTwain::RegisterApp( // record application information
int nMajorNum, int nMinorNum, // major and incremental revision of application. E.g.
// for version 2.1, nMajorNum == 2 and nMinorNum == 1
int nLanguage, // language of this version (use TWLG_xxx from TWAIN.H)
int nCountry, // country of this version (use TWCY_xxx from TWAIN.H)
LPSTR lpszVersion, // version info string e.g. "1.0b3 Beta release"
LPSTR lpszMfg, // name of manufacturer/developer e.g. "Crazbat Software"
LPSTR lpszFamily, // product family e.g. "BitStomper"
LPSTR lpszProduct) // specific product e.g. "BitStomper Deluxe Pro"
{
AppId.Id = 0; // init to 0, but Source Manager will assign real value
AppId.Version.MajorNum = nMajorNum;
AppId.Version.MinorNum = nMinorNum;
AppId.Version.Language = nLanguage;
AppId.Version.Country = nCountry;
lstrcpy (AppId.Version.Info, lpszVersion);



AppId.ProtocolMajor = TWON_PROTOCOLMAJOR;
AppId.ProtocolMinor = TWON_PROTOCOLMINOR;
AppId.SupportedGroups = DG_IMAGE | DG_CONTROL;
lstrcpy (AppId.Manufacturer, lpszMfg);
lstrcpy (AppId.ProductFamily, lpszFamily);
lstrcpy (AppId.ProductName, lpszProduct);
}



CTwain::~CTwain()
{
// shut down the Twain connection
CloseSourceManager();
UnloadSourceManager();
}



//
int CTwain::TwainAvailable(void)
{
if (pSM_Entry) return TRUE; // SM currently loaded



if (iAvailable == 0) {
if (LoadSourceManager()) {
iAvailable = 1;
} else {
iAvailable = -1;
}
}
return (iAvailable > 0);
}



//扫描状态 
TW_STATE CTwain::State(void)
{
return nState;
}



//设置扫描状态 
void CTwain::SetState(TW_STATE nS)
{
#ifdef _DEBUG
if (bTrace) {
const char *pzState[] = {
"",
"1:PRE_SESSION",
"2:SOURCE_MANAGER_LOADED",
"3:SOURCE_MANAGER_OPEN",
"4:SOURCE_OPEN",
"5:SOURCE_ENABLED",
"6:TRANSFER_READY",
"7:TRANSFERRING"
};
TRACE("TWAIN: State %s -> %s ", pzState[nState], pzState[nS]);
}
#endif



nState = nS; // update the 'global'
StateChange(nS); // notify derived classes via callback
} // SetState




void CTwain::SetDefWindow(CWnd* pWnd)
// Sets the CWnd* to be used as the default for all other calls that
// take a window argument - SelectSource, OpenSourceManager, etc.
// If no default window is set, AfxGetMainWnd() is used.
{
pDefWnd = pWnd;
}




CWnd* CTwain::DefWnd(CWnd* pWnd)
// Returns pWnd if it's non-null, otherwise it
// finds a safe non-null default substitute.
{
return pWnd ? pWnd : pDefWnd ? pDefWnd : AfxGetMainWnd();
} // DefWnd



//选择扫描源 
int CTwain::SelectSource(CWnd* pWnd)
{
TW_IDENTITY NewSourceId;
TW_STATE nStartState = State();
int bSuccess = FALSE;



pWnd = DefWnd(pWnd);
if (!OpenSourceManager(pWnd)) {
TRACE_ERROR(TWERR_OPEN_DSM);
//"Unable to load & open TWAIN Source Manager");
} else {
// I will settle for the system default. Shouldn't I get a highlight
// on system default without this call?
SM(DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &NewSourceId);
// now do the real thing
bSuccess = SM(DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &NewSourceId);
}



DropToState(nStartState, pWnd);



return bSuccess;
}



//接受模式
void CTwain::ModalAcquire(CWnd* pWnd)
{
pWnd = DefWnd(pWnd);
if (BeginAcquire(pWnd)) {
pWnd->EnableWindow(FALSE);
// source is enabled, wait for transfer or source closed
ModalEventLoop();
pWnd->EnableWindow(TRUE);
DropToState(nStartState);
} else {
// BeginAcquire puts everything back when it fails
}
}



//开始接受扫描源 
int CTwain::BeginAcquire(CWnd* pWnd)
{
nStartState = State();
pWnd = DefWnd(pWnd);



if (State() >= SOURCE_MANAGER_OPEN || OpenSourceManager(pWnd)) {
if (State() >= SOURCE_OPEN || OpenDefaultSource()) {
SetPixelType(TWPT_BW);
if (State() >= SOURCE_ENABLED || EnableSource(pWnd)) {
return TRUE;
} else {
TRACE_ERROR(TWERR_ENABLE_SOURCE);
}
} else {
TRACE_ERROR(TWERR_OPEN_SOURCE);
}
} else {
TRACE_ERROR(TWERR_OPEN_DSM);
}
DropToState(nStartState);
return FALSE;
} // BeginAcquire




int CTwain::LoadSourceManager(void)
{
char szSM[256];
OFSTRUCT of;

if (nState >= SOURCE_MANAGER_LOADED) {
return TRUE; // SM already loaded
}



GetWindowsDirectory(szSM, sizeof(szSM));
if (szSM[lstrlen(szSM)-1] != '\') {
lstrcat(szSM, "\");
}
lstrcat(szSM, DSM_FILENAME); // could crash!
if (OpenFile(szSM, &of, OF_EXIST) != -1) {
hSMLib = LoadLibrary(szSM);
} else {
if (bTrace) TRACE("TWAIN: LoadLibrary(%s) failed ", szSM);
hSMLib = NULL;
}
if (IsValidHandle(hSMLib)) {
pSM_Entry = (DSMENTRYPROC) GetProcAddress(hSMLib, DSM_ENTRYPOINT);
if (pSM_Entry) {
iAvailable = 1;
SetState(SOURCE_MANAGER_LOADED);
} else {
if (bTrace) TRACE("TWAIN: GetProcAddress() failed!! ");
FreeLibrary(hSMLib);
hSMLib = NULL;
}
} else {
pSM_Entry = NULL;
}



if (nState != SOURCE_MANAGER_LOADED && bTrace)
TRACE("TWAIN: LoadSourceManager() failed. ");

return (nState >= SOURCE_MANAGER_LOADED);
} // LoadSourceManager



//打开资源管理器
int CTwain::OpenSourceManager(CWnd* pWnd)
{
TW_INT32 hwnd32 = (TW_INT32)(int)(DefWnd(pWnd)->m_hWnd);



if (LoadSourceManager()) {
SM(DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &hwnd32);
if (nState != SOURCE_MANAGER_OPEN && bTrace) TRACE("TWAIN: OPENDSM failed. ");
}
return (nState >= SOURCE_MANAGER_OPEN);
}



//打开缺省的扫描源 
int CTwain::OpenDefaultSource(void)
{
if (nState != SOURCE_MANAGER_OPEN) return FALSE;



// open the system default source
SourceId.ProductName[0] = '
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -