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