Implement Duplex TWAIN

Take the following steps to create and run a program that implement LEADTOOLS TWAIN features. Remember, the purpose of the TWAIN tutorial is to provide you a quick and easy way to generate a TWAIN program.

  1. Start Microsoft Visual Studio.
  2. Select the File->New menu option and then click the Project menu.
  3. From Project Types select Other Languages to expand it, then select Visual C++ to expand it, then select MFC. From the right window select MFC Application.
  4. In the Project Name dialog box, enter TwainDuplex.
  5. In the Location dialog box, use the "Examples\Scanning\ClassLibrary" directory of your LEAD installation. For example, if you installed LEADTOOLS in *C:\LEADTOOLS22*, enter C:\LEADTOOLS22\Examples\Scanning\ClassLibrary, then click OK. Then click Next.
  6. Choose Dialog based and click Finish.
  7. Click the Solution Explorer tab, and then click the TwainDuplex project to expand it. Click the Header files, then Open TwainDuplex.h. 8.Add the following line immediately before the class CTwainDuplexApp declaration (keep in mind, you may have to change the path to where the header files reside):

    #include "..\..\..\..\include\ClassLib\ltwrappr.h" 

  8. Click the Class View tab.

  9. Click to open the TwainDuplex classes branch.
  10. Click CTwainDuplexApp, and then double-click the CTwainDuplexApp(void) constructor.
  11. Add the following lines after //TODO: add construction code here:

    LBase::LoadLibraries(LT_ALL_LEADLIB);   
    L_TCHAR * pszLicenseFile = L"Replace this with the path to the LEADTOOLS license file";   
    L_TCHAR * pszDeveloperKey = L"Replace this with your developer key";   
    LSettings::SetLicenseFile(pszLicenseFile, pszDeveloperKey);   

  12. Create a new file called Imports.cpp and place it beside your project files.

    1. In the Project Workspace, click the Solution Explorer tab.
    2. Double-click the TwainDuplex folder to open it.
    3. Right-click the source files folder and select Add New item.
    4. Expand the Visual C++ tree, if it is not already expanded.
    5. Select Code from the sub-tree.
    6. Select C++ File (.cpp) from the right window.
    7. In the Name text box, specify Imports.cpp.
    8. Click the Add button.
    9. Double-click the imports.cpp in the Solution Explorer and add the following lines:
      #include "StdAfx.h"   
      #if defined(WIN64)    
            
      #else   
         #pragma comment(lib, "..\\..\\..\\..\\Lib\\CDLL\\Win32\\Ltwvc_u.lib")   
      #endif // #if defined(WIN64)  
  13. Click the Solution Explorer tab.

  14. Double-click the TwainDuplex folder to open it.
  15. Double-click the Header Files folder to open it. Then double-click the TwainDuplexDlg.h file to open it.
  16. Add the following class declaration before the CTwainDuplexDlg class.

    class LMyTwain : public LTwain 
    { 
       LEAD_DECLAREOBJECT(LMyTwain); 
    public: 
       LMyTwain(); 
       virtual ~LMyTwain(); 
       virtual L_INT BitmapCallBack(pBITMAPHANDLE pBitmap); 
    }; 

  17. Click the Solution Explorer tab.

  18. Double-click the TwainDuplex folder to open it.
  19. Double-click the Source Files folder to open it. Then double-click the TwainDuplexDlg.cpp file to open it.
  20. Add the following class:

    LEAD_IMPLEMENTOBJECT(LMyTwain); 
    LMyTwain::LMyTwain() 
    { 
       EnableCallBack(TRUE); 
    } 
    LMyTwain::~LMyTwain() 
    { 
    } 
    L_INT LMyTwain::BitmapCallBack(pBITMAPHANDLE pBitmap) 
    { 
       //Copy the acquired bitmap here 
       return SUCCESS; 
    } 

  21. Click the Class View tab

  22. Right-click CTwainDuplexDlg and select Add Add Variable...
  23. For Variable Type enter LMyTwain, and for Variable Declaration put m_MyTwain. Leave Access as Public and click OK.
  24. Click to open the CTwainTutorDlg branch. Double-click the OnInitDialog() function and add the following code after the line:

// TODO: Add extra initialization here

   APPLICATIONDATA AppData;    
   memset(&AppData, 0, sizeof(APPLICATIONDATA));    
   AppData.hWnd = m_hWnd;    
   AppData.uStructSize = sizeof(AppData);    
   lstrcpy(AppData.szManufacturerName, _T("LEAD Technologies, Inc."));    
   lstrcpy(AppData.szAppProductFamily, _T("LEAD Test Applications"));   
   lstrcpy(AppData.szVersionInfo, _T("Version 1.0"));   
   lstrcpy(AppData.szAppName, _T("TWAIN Test Application"));   
   m_MyTwain.InitSession(&AppData);  

  1. Right-click the CTwainTutorDlg branch, and choose Properties.
  2. From the Properties window toolbar, click the Messages icon. Then click the empty area beside the item WM_DESTROY and choose OnDestroy.
  3. Add the following code after the opening bracket {:

       m_MyTwain.EndSession();   
       LBase::UnloadLibraries(LT_ALL_LEADLIB);  

  4. Click the Solution Explorer tab.

  5. Double-click the TwainDuplex folder to open it.
  6. Double-click the Resource Files folder to open it. Then double-click the TwainDuplex.rc file to open it, then double-click Dialog, and then double-click IDD_TWAINDUPLEX_DIALOG.
  7. Now drag and drop 2 buttons and 3 radio buttons, and change their properties as follows:

    Control Type ID Caption
    Button1 IDC_ACQUIRE Acquire
  8. From the View menu, select the Other Windows menu, then select the Resource View menu, then select Dialog, and select IDD_TWAINTUTOR3_DIALOG.

  9. Double-click the Acquire button, and add the following code:

    BITMAPHANDLE Bitmap; 
    L_INT nRet; 
    TW_CAPABILITY twCap; 
    m_MyTwain.SelectSource(NULL); 
    twCap.Cap = CAP_DUPLEX; 
    twCap.ConType = TWON_ONEVALUE; 
    twCap.hContainer = NULL; 
    nRet = m_MyTwain.GetCapability(&twCap, LTWAIN_CAPABILITY_GETVALUES); 
    if (nRet == TWAIN_SUCCESS) 
    { 
       // check if the selected driver supports duplex capability 
       pTW_ONEVALUE pOneValue = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); 
       if (pOneValue->ItemType != TWTY_UINT16) 
       { 
          GlobalUnlock(twCap.hContainer); 
          m_MyTwain.FreeContainer(&twCap); 
          return; 
       } 
       TW_UINT16 item = (TW_UINT16)pOneValue->Item; 
       switch (item) 
       { 
          case TWDX_NONE: 
          AfxMessageBox(TEXT("Duplex capability is not supported in the selected driver")); 
          break; 
          case TWDX_1PASSDUPLEX: 
          AfxMessageBox(TEXT("1 Pass Duplex capability is supported in the selected driver")); 
          break; 
          case TWDX_2PASSDUPLEX: 
          AfxMessageBox(TEXT("2 Pass Duplex capability is supported in the selected driver")); 
          break; 
       } 
       GlobalUnlock(twCap.hContainer); 
       m_MyTwain.FreeContainer(&twCap); 
       // make sure the duplex capability is enabled 
       if (item != TWDX_NONE) 
       { 
          BOOL bEnable = TRUE; 
          twCap.Cap = CAP_DUPLEXENABLED; 
          twCap.ConType = TWON_ONEVALUE; 
          twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE)); 
          pTW_ONEVALUE pOneValue = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); 
          pOneValue->ItemType = TWTY_BOOL; 
          pOneValue->Item = (TW_UINT32)bEnable; 
          GlobalUnlock(twCap.hContainer); 
          nRet = m_MyTwain.SetCapability(&twCap, LTWAIN_CAPABILITY_SET); 
          if (nRet == TWAIN_SUCCESS) 
             AfxMessageBox(TEXT("The duplex capability is enabled")); 
          else 
             AfxMessageBox(TEXT("Can't enable duplex capability")); 
       } 
    } 
    else 
       AfxMessageBox(TEXT("Duplex capability is not supported in the selected driver")); 
    // try to acquire pages using duplex capability 
    m_MyTwain.Acquire(&Bitmap, sizeof(BITMAPHANDLE), LTWAIN_SHOW_USER_INTERFACE | LTWAIN_MODAL_USER_INTERFACE, NULL); 

  10. Compile and test the program.

Help Version 22.0.2022.12.7
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS TWAIN C++ Class Library Help
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.