Creating a Spell Dialog Box

Following are the dialog box procedure and supporting functions for the spelling checker dialog box.

HWND hwndMain;

HWND hwndEdit;

char achTemp[256]; /* temporary buffer */

LPSTR lpstrDict; /* buffer for dictionary file */

LPSTR *paLpDict; /* array of pointers to words */

UINT cWords; /* number of words */

/********************************************************

FUNCTION: SpellDlgProc

PURPOSE: Dialog procedure for Spell dialog box.

*********************************************************/

BOOL CALLBACK SpellDlgProc(hwndDlg, msg, wParam, lParam)

HWND hwndDlg;

UINT msg;

WPARAM wParam;

LPARAM lParam;

{

switch (msg) {

case WM_INITDIALOG:

if (!OpenDictionary()) {

EndDialog(hwndDlg, 0);

break;

}

SendMessage(hwndEdit, EM_SETSEL, 0, 0);

do

if (!SelectNextWord(hwndEdit, achTemp)) {

GlobalFree((HGLOBAL) lpstrDict);

LocalFree((HLOCAL) paLpDict);

EndDialog(hwndDlg, 0);

break;

}

while (!InitSpellList(

GetDlgItem(hwndDlg, IDCOMBO), achTemp));

break;

case WM_COMMAND:

switch (LOWORD(wParam)) {

case IDCOMBO:

if (HIWORD(wParam) != CBN_DBLCLK)

break;

/* For a double-click, process the OK case. */

case IDOK:

SendDlgItemMessage(hwndDlg, IDCOMBO,

WM_GETTEXT, sizeof(achTemp),

(LPARAM) achTemp);

SendMessage(hwndEdit, EM_REPLACESEL, 0,

(LPARAM) achTemp);

/* Fall through to get the next word. */

case IDIGNORE:

do

if (!SelectNextWord(hwndEdit, achTemp)) {

EndDialog(hwndDlg, 0);

break;

}

while (!InitSpellList(GetDlgItem(hwndDlg,

IDCOMBO), achTemp));

break;

case IDCANCEL:

EndDialog(hwndDlg, 0);

}

break;

case WM_DESTROY:

GlobalFree((HGLOBAL) lpstrDict);

LocalFree((HLOCAL) paLpDict);

break;

default:

return FALSE;

}

return TRUE;

}

/********************************************************

FUNCTION: InitSpellList

PURPOSE: Initializes the selection field and list

of suggestions for the specified word, if

it is not in the dictionary.

RETURNS: If the list is initialized, the return

value is TRUE. If an error occurs or the

word is in the dictionary, the return

value is FALSE.

*********************************************************/

BOOL PASCAL InitSpellList(HWND hwndCombo, LPSTR lpszWord)

{

int min = 0; /* beginning of search range */

int max = cWords; /* end of search range */

int n; /* index of word */

int cmp; /* result of comparison */

char ch; /* first character in word */

ch = *lpszWord;

CharLowerBuff(&ch, 1);

/*

* Perform a binary search for the word.

*

* The global array paLpDict contains pointers to words

* in the global array lpstrDict. These two variables are

* initialized by the OpenDictionary function.

*/

n = max / 2;

while (min < max) {

cmp = lstrcmpi(lpszWord, paLpDict[n]);

if (cmp == 0)

return FALSE; /* not misspelled */

if (cmp < 0)

max = n;

else

min = n + 1;

n = (min + max) / 2;

}

/* List words beginning with the same letter as lpszWord. */

SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);

while (n > 0 && *paLpDict[n - 1] == ch)

n--;

while (*paLpDict[n] == ch)

SendMessage(hwndCombo, CB_ADDSTRING,

0, (LPARAM) paLpDict[n++]);

/* Place the word in the selection field. */

SendMessage(hwndCombo, WM_SETTEXT, 0, (LPARAM) lpszWord);

return TRUE;

}