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