wxPython での IME 操作についていくつか
StaccatoEditor で IME まわりの処理を実装しているんだけど、それ絡みでいくつか。
IME の候補ウィンドウにフォントが反映されない件
ImmSetCompositionFontW を呼び出しているはずなのに、フォントが変わらない現象が起きていて。いろいろ試してたけど、実はしょうもないバグだった。
- lf.lfPitchAndFamily = 1 & 48 # FIXED_PITCH & FF_MODERN + lf.lfPitchAndFamily = 1 | 48 # FIXED_PITCH | FF_MODERN
& と | を間違えるとか恥ずかしいなぁ・・・。
この辺の処理は
で参考にされてたりするけど、他にも lfCharSet を設定しないとダメだったりとかあったので、参考にされる方は↓もご確認ください。前半は別のバグ対策を入れてしまったので、該当の変更は下のほうです。(日付見るとわかるけど、実は半年位前の話だったり・・・。)
wxPython で WndProc いじれる件
wxPython(wxWidget)はクロスプラットフォームなライブラリだから、Windows 特有の IME の処理なんかは考慮してくれません。なので IME が有効な状態でのキー入力を拾いたくても、それは拾えない・・・と思ってたんですけど、実は WM_xxxx 相当のメッセージを処理できるようで、
この辺に説明が載ってました。これでいろいろ制御できそうなので、↑のコミットではこの辺の調査用コードも入れちゃってます。
他にも MSWWindowProc を定義する方法とかあるみたいですね。
- 【GUI】wxWidgets(旧wxWindows) その4【サイザー】 の >>61-66 くらい。
Editra(同じく wxPython を使っているエディタ)も IME まわりの処理がおかしいけど、頑張れば Windows だけでもそれっぽい動作にできるんじゃないかなとか。もし実装されたら参考にさせてもらおう。