Working with Zones(Visual C++ 5.0 and later)
Take the following steps to add code to the existing project that will let you recognize pages:
| 1. | Start with the program you created in Working with Pages. | |
| 2. | Add the following command buttons to the main window and set the ID and Caption properties as follows: | |
| 
 | ID | Caption | 
| 
 | IDC_FINDZONES | Find Zones | 
| 
 | IDC_ZONESCOUNT | Zones Count | 
| 
 | IDC_VERIFYZONE | Verify Zone | 
| 3. | Edit the OCRTutorDlg.h file and change the definition of COCRTutorDlg : CDialog by inserting the following line after DECLARE_MESSAGE_MAP: | |
   ILTZoneData* m_pZoneData; 
   CSampleZoneSink * m_pZoneSink;
   IConnectionPoint *m_pZoneCP; 
   DWORD m_dwZoneCookie;
| 4. | Edit the OCRTutorDlg.h file and add the following to the OnShutdown procrdure: | 
   if (m_pZoneData)
   {
      if (m_pZoneSink)
      {
         LPUNKNOWN pUnkSink = m_pZoneSink->GetIDispatch(FALSE);
         if (m_pZoneData)
            AfxConnectionUnadvise(m_pZoneData, DIID__LTZoneDataEvents, pUnkSink, FALSE, m_dwZoneCookie);
         delete m_pZoneSink;
         m_pZoneSink = NULL;
      }
      m_pZoneData->Release();
      m_pZoneData = NULL;
   }
| 5. | Edit the OCRTutorDlg.cpp file and add the following to the OnInitDialog procedure as follows: | 
m_pZoneData = NULL;
| 6. | Press Ctrl-W to go to the MFC Class Wizard; then do the following: | |
| 
 | a. | Click the Add Class button. | 
| 
 | b. | Click New.... | 
| 
 | c. | Type CSampleZoneSink for the name of the class. | 
| 
 | d. | Select CCmdTarget for the base class of the new class. | 
| 
 | e. | Under Automation, click the Automation radio button. | 
| 
 | f. | Click OK to create the class. | 
| 
 | g. | In the SampleZoneSink.h file, move the destructor so that it is public: | 
// Implementation
   virtual ~ CSampleZoneSink();
protected:
| 
 | h. | In the SampleZoneSink.h file, add the following to the top of the file: | 
class COCRTutorDlg;
| 
 | i. | In the SampleZoneSink.h file, add the following to the CSampleZoneSink class in the //Attributes public section: | 
// Attributes
public:
   COCRTutorDlg *m_pDlg;
| 
 | j. | In the SampleZoneSink.cpp file, add the following to the top of the file (after the #include "SampleZoneSink.h") | 
#include "OCRTutorDlg.h"
| 7. | Edit the header for the Sink class: | |
| 
 | a. | In the Project Workspace, click the FileView tab. | 
| 
 | b. | Double-click the OCRTutor Files folder to open it. | 
| 
 | c. | Double-click the Header Files folder to open it. | 
| 
 | d. | Double-click the SampleZoneSink.h file to edit it. | 
| 
 | e. | Add the following just before //}}AFX_MSG: | 
afx_msg void OnVerification (short iZoneIndex, BSTR bstrWord);
| 
 | f. | Double-click the Source Files folder to open it. | 
| 
 | g. | Double-click the SampleZoneSink.cpp file to edit it. | 
| 
 | h. | Inside the BEGIN_INTERFACE_MAP section, change the INTERFACE_PART to the following: | 
INTERFACE_PART(CSamplerZoneSink, DIID__LTZoneDataEvents, Dispatch)
| 8. | Edit the source for the Sink class: | |
| 
 | a. | In the Project Workspace, click the FileView tab. | 
| 
 | b. | Double-click the Source Files folder. | 
| 
 | c. | Double-click the SampleZoneSink.cpp file to edit it. | 
| 
 | d. | Add the following to the DISPATCH_MAP: | 
DISP_FUNCTION_ID(CSampleZoneSink,"Verification",1, OnVerification,VT_NONE,VTS_I4,VTS_BSTR)
| 
 | e. | Add the following to the end of the file: | 
void CSampleZoneSink::OnVerification (short iZoneIndex, BSTR bstrWord)
{
   m_pDlg->m_pZoneData->VerifyCode = VF_ACCEPT;
   m_pDlg->m_pZoneData->StopVerificationEvent = FALSE:
}
| 9. | Add #include statements so you can access the new class: | |
| 
 | a. | In the Project Workspace, click the FileView tab. | 
| 
 | b. | Double-click the OCRTutor files folder to open it. | 
| 
 | c. | Double-click the Header files folder to open it. | 
| 
 | d. | Double-click the StdAfx.h file to edit it. | 
| 
 | e. | Add the following lines to the end of the file: | 
#include <AFXCTL.H>
#include "SampleZoneSink.h"
| 10. | Press Ctrl-W to go to the MFC Class Wizard; then do the following: | |
| 
 | a. | Click the Message Maps tab. | 
| 
 | b. | In the Class Name combo box, select COCRTutorDlg. | 
| 
 | c. | In the Object IDs list box, select IDC_FINDZONES. | 
| 
 | d. | In the Messages list box, select BN_CLICKED | 
| 
 | e. | Click the Add function button. Choose OK for the default function name (OnFindzones). | 
| 
 | f. | Click the Edit Code button and code the OnFindzones procedure as follows: | 
   CString csBuffer;
   m_pRasterDoc->GetAutoZoneOptions ();
   m_pRasterDoc->EnableZoneForceSingleColumn = TRUE; 
   m_pRasterDoc->ShowZoneGridLines = TRUE; 
   m_pRasterDoc->SetAutoZoneOptions ();
   int nRet = m_pRasterDoc->FindZones (0, TRUE); 
   if (nRet == 0) 
      AfxMessageBox(TEXT("Automatic zones method found all available zones in the specified pages successfully."));
   else
   {
      csBuffer.Format (TEXT("Error %d in finding available zone in the specified page"), nRet); 
      AfxMessageBox (csBuffer); 
   }
| 11. | Press Ctrl-W to go to the MFC Class Wizard; then do the following: | |
| 
 | a. | Click the Message Maps tab. | 
| 
 | b. | In the Class Name combo box, select COCRTutorDlg. | 
| 
 | c. | In the Object IDs list box, select IDC_ZONESCOUNT. | 
| 
 | d. | In the Messages list box, select BN_CLICKED | 
| 
 | e. | Click the Add function button. Choose OK for the default function name (OnZonescount). | 
| 
 | f. | Click the Edit Code button and code the OnZonescount procedure as follows: | 
   CString csBuffer; 
   int nZoneCount; 
   nZoneCount = m_pRasterDoc->ZoneCount [0]; 
   csBuffer.Format (TEXT("Total Zones count = %d\n"), nZoneCount); 
   AfxMessageBox(csBuffer);
| 12. | Press Ctrl-W to go to the MFC Class Wizard; then do the following: | |
| 
 | a. | Click the Message Maps tab. | 
| 
 | b. | In the Class Name combo box, select COCRTutorDlg. | 
| 
 | c. | In the Object IDs list box, select IDC_VERIFYZONE. | 
| 
 | d. | In the Messages list box, select BN_CLICKED | 
| 
 | e. | Click the Add function button. Choose OK for the default function name (OnVerifyzone). | 
| 
 | f. | Click the Edit Code button and code the OnVerifyzone procedure as follows: | 
   CString csBuffer; 
   int nZoneCount; 
   int nRet; 
   HRESULT hr = CoCreateInstance(CLSID_LTZoneData, NULL, CLSCTX_ALL, IID_ILTZoneData, (void**)&m_pZoneData); 
   if (FAILED(hr)) 
   {
      AfxMessageBox(TEXT("Can't instantiate the Zone Data Object...")); 
      return; 
   }
   m_pZoneSink = new CSampleZoneSink; 
   m_pZoneSink->m_pView = this; 
   LPUNKNOWN pUnkSink = m_pZoneSink->GetIDispatch(FALSE); 
   AfxConnectionAdvise(m_pZoneData, DIID__LTZoneDataEvents, pUnkSink, FALSE, &m_dwZoneCookie); 
   nZoneCount = m_pRasterDoc->ZoneCount [0]; 
   for(int i=0; i<nZoneCount; i++)
   {
      nRet = m_pRasterDoc->GetZoneInfo (0, i, m_pZoneData); 
      if (nRet  ==  0) 
      {
         m_pZoneData->EnableVerificationEvent = TRUE; 
         nRet = m_pRasterDoc->UpdateZone (0, i, m_pZoneData); 
         if (nRet != 0) 
         {
            csBuffer.Format (TEXT("Error %d in updating zone # %d"), nRet, i); 
            AfxMessageBox (csBuffer); 
         }
      }
   }
| 13. | On the Build menu, select Build OCRTutor.exe. | 
| 14. | On the Build menu, select Execute OCRTutor.exe. | 
| 15. | Save this project to use for testing other code samples. |