Window Procedures
The following code has been changed in the "InputWndProc" section.
#define   MAX_GUESS   5     // Maximum number of guesses  
#define   MAX_CHAR    20    // Maximum number of characters per guess 
 
// Global Variables *************************************************** 
HRCRESULT   vrghresult[MAX_GUESS];        // Array of results 
SYV    vsyvSymbol[MAX_GUESS][MAX_CHAR];   // Array of symbol strings 
int         vcSyv[MAX_GUESS];             // Array of string lengths 
. 
. 
. 
 
LRESULT CALLBACK      InputWndProc( 
                           HWND hwnd,      // Window handle 
                           UINT message,   // Message 
                           WPARAM wParam,  // Varies 
                           LPARAM lParam ) // Varies 
{ 
   LONG            lRet = 0L;      // Initialize return code to FALSE 
   HRC           hrc;              // HRC object 
   HDC           hdc; 
   PAINTSTRUCT   ps; 
   DWORD         dwInfo; 
   int           i, cGuess; 
 
   switch (message) 
   { 
         . 
         . 
         . 
case WM_LBUTTONDOWN: 
// 
// Two possibilities exist: user is using mouse or the pen. 
// The latter case indicates the user is starting to write. 
// 
dwInfo = GetMessageExtraInfo(); 
if (IsPenEvent( message, dwInfo )) 
{ 
    if (DoDefaultPenInput( vhwndInput, (UINT)dwInfo ) == PCMR_OK) 
        lRet = TRUE; 
    else 
        lRet = DefWindowProc( hwnd, message, wParam, lParam ); 
} 
break; 
 
case WM_PENEVENT: 
    switch (wParam) 
    { 
        case PE_GETPCMINFO: 
        // 
        // If using SREC recognizer, ensure session ends 
        // on pen-up. 
        // 
        if (viMenuSel == miSample) 
            ((LPPCMINFO) lParam)->dwPcm |= PCM_PENUP; 
        lRet = DefWindowProc( hwnd, message, wParam, lParam ); 
        break; 
 
case PE_BEGINDATA: 
    // 
    // Action based on current menu selection: 
    // 
    // 1) If currently using sample recognizer, create an HRC 
    // for it and specify it in the TARGET structure pointed 
    // to by lParam.  This tells DoDefaultPenInput to use 
    // the sample recognizer rather than the system default. 
    // 
    // 2) If displaying mirror image of ink, create an 
    // HPENDATA for it and specify it in the TARGET structure 
    // pointed to by lParam.  This tells DoDefaultPenInput to 
    // collect data into the HPENDATA block instead of 
    // passing it to a recognizer. 
    // 
    // 3) If using the default recognizer, pass to DefWindowProc, 
    // which sets the maximum number of guesses to 1 and may 
    // or may not require any guide information. The Japanese 
    // default recognizer (RODAN.DLL) does require a guide 
    // for character recognition. The following code shows 
    // how to access the HRC that DefWindowProc creates, 
    // reset the number of guesses to MAX_GUESS, and set 
    // up the client rectangle of the input window as a 
    // single guide. 
    // 
    if (vhpendata) 
    { 
        DestroyPenData( vhpendata ); 
        vhpendata = 0; 
    } 
 
    switch (viMenuSel) 
    { 
        case miSample: 
            hrc = CreateCompatibleHRC( NULL, vhrec ); 
            if (hrc) 
            { 
                ((LPTARGET) lParam)->dwData = hrc; 
                lRet = LRET_HRC; 
            } 
            break; 
 
        case miMirror: 
            vhpendata = CreatePenData( NULL, 0, 
                                    PDTS_HIENGLISH, 0 ); 
            if (vhpendata) 
            { 
                ((LPTARGET) lParam)->dwData = vhpendata; 
                lRet = LRET_HPENDATA; 
            } 
            break; 
 
        case miSystem: 
            lRet = DefWindowProc( hwnd, message, 
                                wParam, lParam ); 
            // 
            // On return, lParam->dwData points to HRC. 
            // Use it to reset max number of guesses. 
            // 
            SetMaxResultsHRC( ((LPTARGET) lParam)->dwData, 
                            MAX_GUESS ); 
            { 
            GUIDE guide; 
            RECT rc; 
 
            GetClientRect(vhwndInput, &rc); 
            ClientToScreen(vhwndInput, (LPPOINT) &rc.left); 
            ClientToScreen(vhwndInput,    (LPPOINT) &rc.right); 
            guide.xOrigin = rc.left; 
            guide.yOrigin = rc.top; 
            guide.cxBox = rc.right - rc.left; 
            guide.cyBox = rc.bottom - rc.top; 
            guide.cxBase =    0; 
            guide.cyBase =    guide.cyBox; 
            guide.cHorzBox = 1; 
            guide.cVertBox = 1; 
            guide.cyMid = guide.cyBox / 2; 
            SetGuideHRC(((LPTARGET) lParam)->dwData, &guide, 0); 
            } 
            break; 
} 
    break; 
 
case PE_ENDDATA: 
// 
// DefWindowProc will destroy vhpendata, so if collecting 
// mirror image, don't let DefWindowProc handle message 
// 
if (viMenuSel != miMirror) 
        lRet = DefWindowProc( hwnd, message, wParam, lParam ); 
    break; 
 
case PE_RESULT: 
// 
// At end of input, collect recognition results (if any) 
// into symbol strings.  DoDefaultPenInput generates the 
// PE_RESULT submessage only when using a recognizer. 
// The lParam contains the HRC for the recognition process. 
// 
// NOTE: 
//    Do not destroy HRC, even after getting results! 
//    DefWindowProc takes care of destroying the object. 
// 
 
// Collect pen data for DrawRawData 
- hpendata = CreatePenDataHRC( (HRC) lParam ); 
// Initialize array to zero 
for (i = 0; i < MAX_GUESS; i++) 
    vcSyv[i] = 0; 
 
// Get number of guesses available 
cGuess = GetResultsHRC( (HRC) lParam, 
                    GRH_ALL, 
                    (LPHRCRESULT) vrghresult, 
                    MAX_GUESS ); 
 
// Get guesses (in vsyvSymbol) and their lengths (invcSyv) 
if (cGuess != HRCR_ERROR) 
    for (i = 0; i < cGuess; i++) 
        vcSyv[i] = GetSymbolsHRCRESULT( vrghresult[i], 
                            0, 
                            (LPSYV) vsyvSymbol[i], 
                            MAX_CHAR ); 
 
// Destroy the HRCRESULTS 
for (i = 0; i < cGuess; i++) 
    DestroyHRCRESULT(vrghresult[i]); 
 
                break; 
                . 
                . 
                . 
        default: 
            lRet = DefWindowProc( hwnd, message, wParam, lParam ); 
 
    }                    // End switch (message) 
    return lRet; 
} 
 
-  In the "DisplayGuesses" section of the "InfoWndProc" section, the following
code has changed.
VOID        DisplayGuesses( HDC hdc )                // DC handle  
{ 
    TEXTMETRIC  tm; 
    int            nX, nY;                            // Text coords 
        . 
        . 
        . 
    for (i = 0; i < MAX_GUESS; i++) 
    { 
        if (vcSyv[i] > 0) 
        { 
            SymbolToCharacter( (LPSYV) vsyvSymbol[i], 
                            vcSyv[i], 
                            (LPSTR) szText, 
                            (LPINT) &cChar ); 
            for (nLen = 0; cChar > 0; cChar--) 
                nLen += IsDBCSLeadByte(*(szText + nLen)) ? 2 : 1; 
            TextOut( hdc, nX, nY, (LPSTR) szText, nLen ); 
            nY += tm.tmExternalLeading + tm.tmHeight; 
        } 
    } 
}
			
				- Software for developers
				
- 
				Delphi Components
 .Net Components
 Software for Android Developers
- More information resources
				
- 
				MegaDetailed.Net
 Unix Manual Pages
 Delphi Examples