With the help of several API functions, you can be creative in the way you customize the user interface for any or all of the IME windows. For example, your application could hide the status window completely, just as the FULLIME sample from the PDK does, and instead display status information in menus or on the border of the application window. To retrieve the information normally displayed in the status window, such as the sentence mode and the input mode, you can call ImmGetConversionStatus. If you provide an application-defined menu to allow the user to change the input mode, your application can respond to user changes by calling ImmSetConversionStatus to update the IME.
If you plan to customize the candidate or composition windows, familiarize yourself with the CANDIDATELIST, COMPOSITIONFORM, and CANDIDATEFORM structures, as well as with the flags and style bits associated with these structures and related functions. The Win32 SDK documentation gives detailed descriptions.
For example, the function ImmGetCompositionString can give you a great deal of information about the string displayed in the composition window. It can tell you whether the string contains the characters the user has entered (for example, hiragana or katakana characters), the characters resulting from the conversion, the characters that have been selected but not yet converted, or the characters that have been converted and are still selected. The function can also tell you which characters in the string constitute clauses and what position they hold in the composition string, as well as where the cursor is positioned and which characters the user originally entered. Because you are drawing the composition window yourself, you can use any font you want in any style you want and position the window wherever you want it to besuch as in the corner of the client area or next to the current insertion point. You decide whether the composition window will have a border.
Similarly, you can paint the candidate window to your own specifications, but you must first retrieve the list of candidate strings from the IME. ImmGetCandidateListCount will tell you how large the buffer must be to accommodate the list of strings, and ImmGetCandidateList will return a pointer containing the actual list and the number of strings in the list. ImmGetCandidateList will also tell you how the candidate strings are related, such as whether they have the same reading, have the same meaning, have the same number of strokes, or are based on the same radical.