紧急请帮助,一个WinAPI转换到MFC应用程序中的问题,在线等候,
现做一个Symbol的手持扫描开发一个小软件,Symbol公司的提供的打开扫描的例子全是WinAPI的,我做的是MFC应用程序,请问各用大哥哥们,怎么下面这个程序转换到我的程序里?Symbol公司WinAPI的原程序如下,刚学VC.NET,请帮助谢谢!:
//--------------------------------------------------------------------
#include <windows.h>
#include <windowsx.h>
#include <ScanCAPI.h>
#include "resource.h"
#define countof(x) sizeof(x)/sizeof(x[0])
// Define user messages
enum tagUSERMSGS
{
UM_SCAN = WM_USER + 0x200,
UM_STARTSCANNING,
UM_STOPSCANNING
};
// Global variables
HINSTANCE hInst = NULL;
HANDLE hScanner = NULL;
LPSCAN_BUFFER lpScanBuffer = NULL;
TCHAR szScannerName[MAX_PATH] = TEXT("SCN1:"); // default scanner name
DWORD dwScanSize = 7095; // default scan buffer size
DWORD dwScanTimeout = 2000; // default timeout value (0 means no timeout)
BOOL bUseText = TRUE;
BOOL bTriggerFlag = FALSE;
BOOL bRequestPending = FALSE;
BOOL bStopScanning = FALSE;
BOOL bContinuousMode = FALSE;
// Forward declarations
LRESULT CALLBACK BasicScanProc(HWND,UINT,WPARAM,LPARAM);
void ErrorExit(HWMD, UINT, LPTSTR);
LPTSTR LoadMsg(UINT, LPTSTR, int);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpszCmdLine,
int nCmdShow)
{
int nResult;
hInst = hInstance; // save the instance handle to a global variable
nResult = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_SSCAN), NULL,
BasicScanProc);
return nResult;
}
LRESULT CALLBACK BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD dwResult;
TCHAR szLabelType[10];
TCHAR szLen[MAX_PATH];
TCHAR szMsgBuf[256];
LPSCAN_BUFFER lpScanBuf;
HWND hctl_data, hctl_length, hctl_type;
switch(uMsg)
{
case WM_INITDIALOG:
PostMessage(hwnd,UM_STARTSCANNING,0,0L);
break;
case UM_STARTSCANNING:
dwResult = SCAN_Open(szScannerName, &hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
ErrorExit(hwnd, IDS_FAILURE, TEXT("SCAN_Open"));
break;
}
dwResult = SCAN_Enable(hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
ErrorExit(hwnd, IDS_FAILURE, TEXT("SCAN_Enable"));
break;
}
lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer == NULL)
{
ErrorExit(hwnd, IDS_FAILURE, TEXT("SCAN_AllocateBuffer"));
return TRUE;
}
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
ErrorExit(hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
break;
return TRUE;
case UM_STOPSCANNING:
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner);
if (!bRequestPending)
{
SCAN_Disable(hScanner);
if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer);
SCAN_Close(hScanner);
EndDialog(hwnd, 0);
}
bStopScanning = TRUE;
return TRUE;
case UM_SCAN:
bRequestPending = FALSE;
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
lpScanBuf = (LPSCAN_BUFFER)lParam;
if ( lpScanBuf == NULL )
ErrorExit(hwnd, IDS_ERR_BUF, 0);
hctl_data = GetDlgItem(hwnd,IDC_EDIT_DATA);
hctl_length = GetDlgItem(hwnd,IDC_EDIT_LEN);
hctl_type = GetDlgItem(hwnd,IDC_EDIT_TYPE);
switch (SCNBUF_GETSTAT(lpScanBuf))
{
case E_SCN_DEVICEFAILURE:
break;
case E_SCN_READPENDING:
break;
case E_SCN_READCANCELLED:
if (bStopScanning)
{ // complete the second step of UM_STOPSCANNING
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
return TRUE;
}
if (!GetFocus())
break; // Do nothing if read was cancelled while deactivation
break;
case E_SCN_READTIMEOUT:
if(bContinuousMode)
PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
case E_SCN_SUCCESS:
//Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
MessageBox(NULL, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer), NULL, MB_OK);
if(bContinuousMode)
PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
}
// Submit next read request if we are foreground
if (GetFocus())
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
ErrorExit(hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_SOFTTRIGGER:
// Clear the state first before we set it to TRUE
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
bTriggerFlag = TRUE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
break;
case IDC_CONTINUOUS: //Check for Continuous Scan Mode
bContinuousMode = !bContinuousMode;
if(bContinuousMode)
PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
case IDOK: // fall through
case IDCANCEL:
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
return FALSE;
}
void ErrorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
{
TCHAR szMsg[256];
TCHAR szBuf[256];
if (szFunc == NULL)
wcscpy(szMsg, LoadMsg(uID, szBuf, countof(szBuf)));
else
wsprintf(szMsg, TEXT("%s %s"), szFunc,
LoadMsg(uID, szBuf, countof(szBuf)));
MessageBox(NULL, szMsg, NULL, MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
}
LPTSTR LoadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
{
if (!LoadString(hInst, uID, lpBuffer, nBufSize))
wcscpy(lpBuffer, TEXT(""));
return lpBuffer;
}
问题点数:100、回复次数:6Top
1 楼YJX5888()回复于 2006-11-04 14:35:14 得分 0
MFC本身已经对WINAPI进行的封装。。开发商提供API接口函数。。一定提供的有DLL,
你只需要把DLL文件加载到你的程序里,至于DLL中的函数,你就可以像调用WINDOWS的API函数一样,调用它了!Top
2 楼sgnaw(李逍遥)回复于 2006-11-04 14:45:32 得分 100
http://community.csdn.net/Expert/topic/5132/5132935.xml?temp=.1252863Top
3 楼hdt(倦怠)回复于 2006-11-04 19:29:40 得分 0
MFC 只不过是对api的简单封装,你用mfc可以直接调用Top
4 楼liu_yanzhi()回复于 2006-11-04 23:44:38 得分 0
上面的这位哥哥,请说明白一点好吗?怎么调用Top
5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-11-05 09:32:16 得分 0
API=>MFC?
楼主用VC多久了?Top
6 楼liu_yanzhi()回复于 2006-11-05 09:41:42 得分 0
真心谢谢:sgnaw(李逍遥)大哥的帮助Top




