2010-07-20 24 views
7

衍生我已經創建了C#.net我自己的單行文本框控件3.5把IME在自定義文本框,從控制

我寫這完全從頭開始,包括我自己的選擇密碼,滾動,複製/粘貼等。它甚至可以選擇從左到右的文本,而不是我曾經使用過的...

我遇到的問題是IME(輸入法編輯器)集成。 IME在某種程度上確實起作用,但我遇到了一些問題。我會在這裏列出其中一個。

通常,使用文本框,IME構造呈現在文本框內。但是,在我的控制中,IME顯示在屏幕的右下角。我試着看看其他自定義控件,包括SharpDevelop中使用的控件。但是,這有同樣的問題。使用中文,日文或韓文輸入IME會在屏幕右下方完成輸入。

我需要一些關於如何在我自己的文本框中完成此操作的指針,並且我查看了Windows API for IME,但功能太多了,我不知道從哪裏開始。

那麼,有什麼想法?

這很好,如果任何代碼示例是在C++(託管/非託管)或VB.net。我可以輕鬆地將它移動。

回答

10

好吧,看起來好像StackOverflow上沒有很多IME專家......或者沒有人有興趣。

無論如何,我想通了。

基本上,我有陷阱以下Windows消息:

WM_INPUTLANGCHANGE = 0x51 
WM_KEYUP = 0x101 
WM_CHAR = 0x102 
WM_CONVERTREQUESTEX = 0x108 
WM_IME_STARTCOMPOSITION = 0x10D 
WM_IME_ENDCOMPOSITION = 0x10E 
WM_IME_COMPOSITION = 0x10F 
WM_IME_SETCONTEXT = 0x281 
WM_IME_NOTIFY = 0x282 
WM_IME_CONTROL = 0x283 
WM_IME_COMPOSITIONFULL = 0x284 
WM_IME_SELECT = 0x285 
WM_IME_CHAR = 0x286 
WM_IME_REQUEST = 0x0288 
WM_IME_KEYDOWN = 0x290 
WM_IME_KEYUP = 0x291 

我誘捕WM_KEYUPWM_CHAR,因爲如果我在合成韓語字符的中間某處點擊,我沒有得到一個組成消息,但我需要將該字符添加到我的文本框中。這是一個奇怪的行爲,我不知道這是否是一個錯誤。

一旦發生這種情況,韓國人,中國人和日本人之間會有不同的行爲。

韓國人是一個非常容易的人(我不確定漢佳轉換,因爲我不知道如何使用它)。

基本上,所有的語言,每當我得到了WM_IME_COMPOSITION,我有我的答案已經描述this question調用ImmGetCompositionString在Imm32.dll。然後我將其顯示爲正在撰寫的作文,但不要將其添加到我存儲的文本中。

當合成字符串時,來自Windows的消息對於每個IME都是不同的。每次,我都可以從WM_IME_COMPOSITION消息中得到它。

在韓國,LParam將只是GCS_RESULTSTRWParam將輸入的字符,我可以只投給char

在日本「Lparam型」將是GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE。我必須使用從先前的WM_IME_COMPOSITION消息中存儲的ImmGetCompositionString的結果,因爲此時它將是一個空字符串。

中文中,LParam將爲GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE。這與日文相同,除非先前存儲的ImmGetCompositionString爲空,在這種情況下,我需要將WParam轉換爲字符。

在所有這三種情況下,我都必須確保顯示的正在進行的壓縮過程已被清除。

如果我接收WM_IME_STARTCOMPOSITION,我設置一個合成標誌(並顯示在正在進行的合成字符串)

如果我接收WM_IME_ENDCOMPOSITION我清除標誌(並清除正在進行的合成字符串)。

有時我沒有收到WM_IME_ENDCOMPOSITION,所以我收到WM_CHAR後清除我的國旗。


總而言之,這是一個非常有趣的學習經驗,以及一個仍在進行中 - 但IME現在是我的控制使用,最後一次!我一直工作到凌晨1點才完成。

+1

剛剛發現http://stackoverflow.com/questions/434048/how-do-you-use-ime,早就看到了! – 2010-07-21 02:00:08