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;
}