调整twain_user接口

This commit is contained in:
luoliangyi 2022-07-21 16:20:51 +08:00
parent d37f9632ab
commit 581d2d139e
6 changed files with 90 additions and 118 deletions

View File

@ -104,6 +104,9 @@ BOOL CHGTestDlg::OnInitDialog()
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
HGTwain_LoadDSM(&m_dsm);
HGTwain_OpenDSM(m_dsm, m_hWnd, DSEventCallback, this);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
@ -158,30 +161,24 @@ HCURSOR CHGTestDlg::OnQueryDragIcon()
void CHGTestDlg::OnBnClickedButton1()
{
if (NULL != m_dsm)
if (NULL != m_ds)
{
return;
}
HGTwain_LoadDSM(&m_dsm);
HGTwain_OpenDSM(m_dsm);
HGTwain_SelectDS(m_dsm, &m_ds);
if (NULL == m_ds)
if (NULL != m_ds)
{
HGTwain_UnloadDSM(m_dsm);
m_dsm = NULL;
return;
HGTwain_OpenDS(m_ds);
HGTwain_EnableDS(m_ds, HGTRUE, NULL);
}
HGTwain_OpenDS(m_ds);
HGTwain_EnableDS(m_ds, HGFALSE, NULL, DSEventCallback, this);
}
void CHGTestDlg::OnBnClickedButton2()
{
HGTwain_UnloadDSM(m_dsm);
m_dsm = NULL;
HGTwain_CloseDS(m_ds);
m_ds = NULL;
}
void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param)
@ -218,12 +215,12 @@ void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param)
}
else if (HGTWAIN_DSEVENT_CLOSEDSREQ == event)
{
HGTwain_UnloadDSM(p->m_dsm);
p->m_dsm = NULL;
HGTwain_CloseDS(p->m_ds);
p->m_ds = NULL;
}
else if (HGTWAIN_DSEVENT_CLOSEDSOK == event)
{
HGTwain_UnloadDSM(p->m_dsm);
p->m_dsm = NULL;
HGTwain_CloseDS(p->m_ds);
p->m_ds = NULL;
}
}

View File

@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
return HGBASE_ERR_OK;
}
HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm)
HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param)
{
if (NULL == dsm)
{
@ -46,7 +46,7 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm)
}
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->OpenDSM();
return twainDSMImpl->OpenDSM(hwnd, func, param);
}
HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm)
@ -148,8 +148,7 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
return twainDSImpl->dsmImpl->GetCapability(twainDSImpl, cap, value);
}
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent,
HGDSEventFunc func, HGPointer param)
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent)
{
if (NULL == ds)
{
@ -157,11 +156,10 @@ HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent,
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->EnableDSUIOnly(twainDSImpl, showUI, parent, func, param);
return twainDSImpl->dsmImpl->EnableDSUIOnly(twainDSImpl, showUI, parent);
}
HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent,
HGDSEventFunc func, HGPointer param)
HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent)
{
if (NULL == ds)
{
@ -169,7 +167,7 @@ HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent,
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->EnableDS(twainDSImpl, showUI, parent, func, param);
return twainDSImpl->dsmImpl->EnableDS(twainDSImpl, showUI, parent);
}
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)

View File

@ -54,7 +54,7 @@ HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm);
* 1) TWAIN状态从2变为3
* 2) 线
*/
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm);
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param);
/* 关闭DSM
* :
@ -150,8 +150,7 @@ HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* v
* :
* 1) TWAIN状态从4变为5
*/
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent,
HGDSEventFunc func, HGPointer param);
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent);
/* 启动DS
* :
@ -163,8 +162,7 @@ HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND
* :
* 1) TWAIN状态从4变为5
*/
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent,
HGDSEventFunc func, HGPointer param);
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent);
/* 停止DS
* :

View File

@ -1,9 +1,7 @@
#include "HGTwainImpl.hpp"
#include "../base/HGInc.h"
extern HMODULE g_hInst;
ULONG HGTwainDSMImpl::m_nRefCount = 0;
std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd;
HGTwainDSMImpl::HGTwainDSMImpl()
{
@ -11,34 +9,15 @@ HGTwainDSMImpl::HGTwainDSMImpl()
m_pDSMProc = NULL;
GetIdentity();
m_hWnd = NULL;
m_oldWndProc = NULL;
m_dsEventFunc = NULL;
m_dsEventParam = NULL;
m_DSMOpen = HGFALSE;
if (0 == m_nRefCount)
{
WNDCLASSW wndcls;
wndcls.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndcls.lpfnWndProc = WndProc;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hInstance = g_hInst;
wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);
wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = L"TwainDSMWnd";
ATOM atom = RegisterClassW(&wndcls);
assert(0 != atom);
}
++m_nRefCount;
}
HGTwainDSMImpl::~HGTwainDSMImpl()
{
--m_nRefCount;
if (0 == m_nRefCount)
{
UnregisterClassW(L"TwainDSMWnd", g_hInst);
}
UnloadDSM();
}
HGResult HGTwainDSMImpl::LoadDSM()
@ -82,26 +61,24 @@ HGResult HGTwainDSMImpl::UnloadDSM()
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::OpenDSM()
HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param)
{
if (NULL == m_pDSMProc || m_DSMOpen)
if (NULL == m_pDSMProc || m_DSMOpen || NULL == hwnd || NULL == func)
{
return HGBASE_ERR_FAIL;
}
assert(NULL == m_hWnd);
HWND hWnd = CreateWindowExW(0, TEXT("TwainDSMWnd"), NULL, WS_OVERLAPPEDWINDOW, -1, -1, 1, 1, NULL, (HMENU)0, g_hInst, NULL);
assert(NULL != hWnd);
SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)this);
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hWnd);
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd);
if (TWRC_SUCCESS != ret)
{
DestroyWindow(hWnd);
return HGBASE_ERR_FAIL;
}
m_hWnd = hWnd;
m_hWnd = hwnd;
m_mapWnd[m_hWnd] = this;
m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
m_dsEventFunc = func;
m_dsEventParam = param;
m_DSMOpen = HGTRUE;
// 获取DS列表
@ -141,8 +118,20 @@ HGResult HGTwainDSMImpl::CloseDSM()
m_DSList.clear();
m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd);
DestroyWindow(m_hWnd);
SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc);
m_oldWndProc = NULL;
std::map<HWND, HGTwainDSMImpl*>::iterator iter;
for (iter = m_mapWnd.begin(); iter != m_mapWnd.end(); ++iter)
{
if (iter->first == m_hWnd)
{
m_mapWnd.erase(iter);
break;
}
}
m_hWnd = NULL;
m_dsEventFunc = NULL;
m_dsEventParam = NULL;
m_DSMOpen = HGFALSE;
return HGBASE_ERR_OK;
}
@ -436,9 +425,9 @@ HGResult HGTwainDSMImpl::GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* val
return HGBASE_ERR_FAIL;
}
HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent)
{
if (NULL == ds || NULL == func)
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
@ -463,8 +452,6 @@ HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND p
m_DSList[i].showUI = showUI;
m_DSList[i].parent = parent;
m_DSList[i].func = func;
m_DSList[i].param = param;
m_DSList[i].enable = HGTRUE;
return HGBASE_ERR_OK;
}
@ -473,9 +460,9 @@ HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND p
return HGBASE_ERR_FAIL;
}
HGResult HGTwainDSMImpl::EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
HGResult HGTwainDSMImpl::EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent)
{
if (NULL == ds || NULL == func)
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
@ -500,8 +487,6 @@ HGResult HGTwainDSMImpl::EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent,
m_DSList[i].showUI = showUI;
m_DSList[i].parent = parent;
m_DSList[i].func = func;
m_DSList[i].param = param;
m_DSList[i].enable = HGTRUE;
return HGBASE_ERR_OK;
}
@ -528,13 +513,11 @@ HGResult HGTwainDSMImpl::DisableDS(HGTwainDSImpl* ds)
TW_USERINTERFACE twUI;
twUI.ShowUI = (TW_BOOL)m_DSList[i].showUI;
twUI.hParent = (TW_HANDLE)m_DSList[i].param;
twUI.hParent = (TW_HANDLE)m_DSList[i].parent;
m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &twUI);
m_DSList[i].showUI = HGFALSE;
m_DSList[i].parent = NULL;
m_DSList[i].func = NULL;
m_DSList[i].param = NULL;
m_DSList[i].enable = HGFALSE;
return HGBASE_ERR_OK;
}
@ -658,40 +641,40 @@ void HGTwainDSMImpl::GetIdentity()
strcpy(m_AppId.ProductName, "MyTwain");
}
LRESULT CALLBACK HGTwainDSMImpl::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HGTwainDSMImpl *p = (HGTwainDSMImpl *)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
if (NULL != p)
{
MSG msg2 = { 0 };
msg2.hwnd = hWnd;
msg2.message = msg;
msg2.wParam = wParam;
msg2.lParam = lParam;
HGTwainDSMImpl* p = m_mapWnd[hWnd];
assert(NULL != p);
MSG msg2 = { 0 };
msg2.hwnd = hWnd;
msg2.message = msg;
msg2.wParam = wParam;
msg2.lParam = lParam;
for (int i = 0; i < (int)p->m_DSList.size(); ++i)
for (int i = 0; i < (int)p->m_DSList.size(); ++i)
{
if (p->m_DSList[i].enable)
{
if (p->m_DSList[i].enable)
TW_EVENT twEvent;
twEvent.pEvent = (TW_MEMREF)&msg2;
twEvent.TWMessage = MSG_NULL;
USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_DSList[i].ds, DG_CONTROL, DAT_EVENT,
MSG_PROCESSEVENT, (TW_MEMREF)&twEvent);
if (TWRC_DSEVENT == ret)
{
TW_EVENT twEvent;
twEvent.pEvent = (TW_MEMREF)&msg2;
twEvent.TWMessage = MSG_NULL;
USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_DSList[i].ds, DG_CONTROL, DAT_EVENT,
MSG_PROCESSEVENT, (TW_MEMREF)&twEvent);
if (TWRC_DSEVENT == ret && NULL != p->m_DSList[i].func)
{
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
if (MSG_XFERREADY == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_XFERREADY;
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_CLOSEDSREQ;
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_CLOSEDSOK;
p->m_DSList[i].func((HGTwainDS)&p->m_DSList[i], event, p->m_DSList[i].param);
}
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
if (MSG_XFERREADY == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_XFERREADY;
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_CLOSEDSREQ;
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
event = HGTWAIN_DSEVENT_CLOSEDSOK;
p->m_dsEventFunc((HGTwainDS)&p->m_DSList[i], event, p->m_dsEventParam);
}
}
}
return DefWindowProc(hWnd, msg, wParam, lParam);
return CallWindowProcW(p->m_oldWndProc, hWnd, msg, wParam, lParam);
}

View File

@ -5,6 +5,7 @@
#include "../base/HGDll.h"
#include "twain.h"
#include <vector>
#include <map>
struct HGTwainDSImpl
{
@ -15,8 +16,6 @@ struct HGTwainDSImpl
open = HGFALSE;
showUI = HGFALSE;
parent = NULL;
func = NULL;
param = NULL;
enable = HGFALSE;
}
@ -25,8 +24,6 @@ struct HGTwainDSImpl
HGBool open;
HGBool showUI;
HWND parent;
HGDSEventFunc func;
HGPointer param;
HGBool enable;
};
@ -38,7 +35,7 @@ public:
HGResult LoadDSM();
HGResult UnloadDSM();
HGResult OpenDSM();
HGResult OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param);
HGResult CloseDSM();
HGResult GetDSList(HGTwainDSImpl** ds, HGUInt* size);
@ -50,8 +47,8 @@ public:
HGResult SetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt value);
HGResult GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* value);
HGResult EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
HGResult EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
HGResult EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent);
HGResult EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent);
HGResult DisableDS(HGTwainDSImpl* ds);
HGResult ImageNativeXfer(HGTwainDSImpl* ds, HGUInt type, HGUInt origin, HGImage* image);
HGResult EndXfer(HGTwainDSImpl* ds, HGUInt* count);
@ -59,14 +56,17 @@ public:
private:
void GetIdentity();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
private:
static ULONG m_nRefCount;
HGDll m_hDll;
DSMENTRYPROC m_pDSMProc;
TW_IDENTITY m_AppId;
HWND m_hWnd;
static std::map<HWND, HGTwainDSMImpl*> m_mapWnd;
WNDPROC m_oldWndProc;
HGDSEventFunc m_dsEventFunc;
HGPointer m_dsEventParam;
HGBool m_DSMOpen;
std::vector<HGTwainDSImpl> m_DSList;
};

View File

@ -1,20 +1,16 @@
#include <windows.h>
HMODULE g_hInst = NULL;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hInst = hModule;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
g_hInst = NULL;
break;
}