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