Acquiring an Image (C++ Builder)

Take the following steps to start a project and to add some code that acquires an image from a TWAIN source:

1.

Start C++ Builder 4.0.

2.

If you didn’t install LEAD RasterView Control, install it as follows:

 

On the Component pull-down menu, use the Import ActiveX Control… and select the LEAD RasterView Control (14.5). Press install, and then compile and install the package dclusr40.bpk.

3.

Select the LEAD RasterView control and add it to Form1. Size and position the control as you want it to appear at run time.

4.

On the Project pull-down menu, use the Import Type library… and select the LEAD RasterTwain Object Library (14.5). Press OK.

6.

If you didn’t import LEAD Raster Variant before, import it as follows:

7.

On the Project pull-down menu, use the Import Type library… and select the LEAD Raster Variant Object Library (14.5). Press install, and then compile and install the package dclusr40.bpk.

5.

If you didn’t install LEADEventSink Control, install it as follows:

 

On the Component pull-down menu, use install Component …, and browse to LEADXX\Include\LEvntSnk.pas. Press OK, then compile and install the package dclusr40.bpk.

6.

Open the LEvntSnk.hpp file and delete those lines below from the TLEADAbstractEventSink class and save the file.

private:
   void *__IDispatch; /* IDispatch */

public:
   operator IDispatch*(void) { return (IDispatch*)&__IDispatch; }
   operator IUnknown*(void) { return (IUnknown*)&__IDispatch; }

7.

From the ActiveX controls, add the LEADEventSink control to Form1.

8.

Add the following code to the private section of Unit1.h:

   LEADTwainCapability * pTwainCap; 
   LEADRasterTwain * pRasterTwain; 
   int nXferMode; 
   int nRet; 
   int TwainSetCapability ( short iCapability, long lCapVal, short iItemType );

9.

Handle the Form1 OnCreate event, and code the FormCreate procedure as follows:

void __fastcall TForm1::FormCreate(TObject *Sender) 
{
   CoCreateInstance (CLSID_LEADRasterTwainCapability, NULL, CLSCTX_ALL, IID_ICapability, (void **)&pTwainCap); 
   CoCreateInstance(CLSID_LEADRasterTwain, NULL, CLSCTX_ALL, IID_ILEADRasterTwain, (void**)&pRasterTwain); 

   pRasterTwain->InitSession ( (long)Handle ) ; 
   LEADEventSink1->Connect  ( pRasterTwain, DIID__LEADRasterTwainEvents ); 
}

10.

Handle the Form1 OnClose event, and code the FormClose procedure as follows:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) 
{
pRasterTwain->EndSession ( ) ; 
if ( pTwainCap ) 
         pTwainCap->Release ( ) ; 
   
if ( pRasterTwain ) 
         pRasterTwain->Release ( ) ; 
}

11.

At the top of Form1, add six Buttons and three Option Buttons and name them as follows:

 

Name

Caption

 

btnOK

OK

 

btnCancel

Cancel

 

btnAcquire

Acquire

 

btnSelectSource

Select Source

 

btnNative

Native

 

btnMemBuf

Memory Buffered

 

btnFile

File

 

btnSaveTemplate

Save Template File

 

btnLoadTemplate

Load Template File

12.

Handle the btnOK OnClick event, and code the btnOKClick procedure as follows. In online help, you can use the Edit pull-down menu to copy the block of code.

void __fastcall TForm1::btnOKClick(TObject *Sender)
{
   Close ( ) ;
}

13.

Handle the btnCancel OnClick event, and code the btnCancelClick procedure as follows. In online help, you can use the Edit pull-down menu to copy the block of code:

void __fastcall TForm1::btnCancelClick(TObject *Sender)
{
   Close ( ) ; 
}

14.

Handle the btnAcquire OnClick event, and code the btnAcquireClick procedure as follows:

void __fastcall TForm1::btnAcquireClick(TObject *Sender) 
{
   pRasterTwain->Acquire ( L_LTWAIN_SHOW_USER_INTERFACE ) ; 
}

15.

Handle the btnSelectSource OnClick event, and code the btnSelectSourceClick procedure as follows:

void __fastcall TForm1::btnSelectSourceClick(TObject *Sender) 
{
   pRasterTwain->SelectSource ( ) ; 
}

16.

Handle the btnSaveTemplate OnClick event, and code the btnSaveTemplateClick procedure as follows:

void __fastcall TForm1::btnSaveTemplateClick(TObject *Sender) 
{
   nRet= pRasterTwain->SaveTemplate ( AnsiToOLESTR ( "c:\\test.ltt" ) ) ; 
}

17.

Handle btnLoadTemplate OnClick event, and code the btnLoadTemplateClick procedure as follows:

void __fastcall TForm1::btnLoadTemplateClick(TObject *Sender) 
{
   nRet= pRasterTwain->LoadTemplate ( AnsiToOLESTR ( "c:\\test.ltt" ) ) ; 
}

18.

Handle the btnNative option button’s OnClick event, and code the btnNativeClick procedure as Follows:

void __fastcall TForm1::btnNativeClick(TObject *Sender) 
{
 ILEADRasterVariant* pCapVal= NULL;

 

 CoCreateInstance(CLSID_LEADRasterVariant,

    NULL,

    CLSCTX_ALL,

    IID_ILEADRasterVariant,

    (void**)&pCapVal );

 

 nXferMode= L_TWSX_NATIVE;

 

 pCapVal->Type= VALUE_USHORT;

 pCapVal->LongValue= nXferMode;

   TwainSetCapability ( L_ICAP_XFERMECH, pCapVal, L_TWTY_UINT16 );

 if ( pCapVal )

  pCapVal->Release ( );
}

19.

Handle the btnMemBuf Option button’s OnClick event, and code the btnMemBufClick procedure as follows:

void __fastcall TForm1::btnMemBufClick(TObject *Sender) 
{
 ILEADRasterVariant* pCapVal= NULL;

 

 CoCreateInstance(CLSID_LEADRasterVariant,

    NULL,

    CLSCTX_ALL,

    IID_ILEADRasterVariant,

    (void**)&pCapVal );

 

   nXferMode= L_TWSX_MEMORY;

 

 pCapVal->Type= VALUE_USHORT;

 pCapVal->LongValue= nXferMode;

 

   TwainSetCapability ( L_ICAP_XFERMECH, pCapVal, L_TWTY_UINT16 );

 if ( pCapVal )

  pCapVal->Release ( );
}

20.

Handle the btnFile Option button’s OnClick event, and code the btnFileClick procedure as follows:

void __fastcall TForm1::btnFileClick(TObject *Sender) 
{
   ILEADRasterVariant* pCapVal= NULL;

 

 CoCreateInstance(CLSID_LEADRasterVariant,

    NULL,

    CLSCTX_ALL,

    IID_ILEADRasterVariant,

    (void**)&pCapVal );

 

   nXferMode= L_TWSX_FILE;

 pCapVal->Type= VALUE_USHORT;

 pCapVal->LongValue= nXferMode;

 

   TwainSetCapability ( L_ICAP_XFERMECH, pCapVal, L_TWTY_UINT16 );

   pRasterTwain->FileTransferName = AnsiToOLESTR ( "c:\\twain.bmp" );

 if ( pCapVal )

  pCapVal->Release ( );
}

21.

Handle the LEADEventSink1 OnInvoke event, and code the LEADEventSink1Invoke procedure as follows:

void __fastcall TForm1::LEADEventSink1Invoke(TObject *Sender, int DispID, 
      const TGUID &IID, int LocaleID, WORD Flags, tagDISPPARAMS &Params, 
      Pointer varResult, Pointer ExcepInfo, Pointer ArgErr) 
{
   switch (DispID) 
   {
      case LEADRASTER_TWAIN_EVENTS_ACQUIREPAGEEVENT: 
      {
         int pBitmap= OleVariant ( Params.rgvarg[0] ) ; 
         ShowMessage ( "Acquisition of Image Done" ) ; 
         LEADRasterView1->Raster->InsertBitmapListItem ( -1, pBitmap ) ; 
      }
      break; 
   }
}

22.

Add the TwainSetCapability function body to the Unit1 file.

int TForm1::TwainSetCapability ( short iCapability, ILEADRasterVariant* pCapVal, short iItemType ) 
{
   int iRet; 

   pTwainCap->EnableMethodErrors = False; 
   pTwainCap->CapInfo->Capability = iCapability; 
   pTwainCap->CapInfo->ConType = L_TWON_ONEVALUE; 
   pTwainCap->CapOneValue->OneValItemType = iItemType; 
   pTwainCap->CapOneValue->set_OneValCapValue ( pCapVal ) ; 

   iRet= pRasterTwain->SetCapability2 ( pTwainCap, L_LTWAIN_CAPABILITY_SET); 
   return iRet; 
}

23.

In Unit1.h file include these files.

#include "LTRASTERTWAINLib_TLB.h"

#include "LTRASTERVARIANTLib_TLB.h"

24.

Run your program to test it.