wxPythonでIME未確定文字列の表示

wx.lib.editor.Editorを試していて、問題が発生。

日本語を入力する時、未確定文字列がちゃんと表示されない!

カーソル位置ではなく、Editorの左上。

ひどい場合には全く表示されない。



調べてみると、他にもwxPythonでエディタを作っている人がいた。


GetHandleメソッドを使えば、FrameなりPanelなりのウィンドウハンドルを取得できる。

そして、そのハンドルをctypesを使ってWinAPIに送ればよい。

from ctypes import Structure, c_long, c_byte, c_wchar_p, c_ulong
class POINT(ctypes.Structure):
    _fields_ = [
        ("x", c_long),
        ("y", c_long),
    ]
class COMPOSITIONFORM(Structure):
    _fields_ = [
        ("dwStyle", c_ulong),
        ("ptCurrentPos", POINT),
        ("rcArea", RECT),
    ]

hIMC = windll.imm32.ImmGetContext(self.GetHandle())
status = windll.imm32.ImmGetOpenStatus(hIMC)
if not status:
   return
windll.imm32.ImmReleaseContext(self.GetHandle(), hIMC)
      
x =### 表示位置の指定
y =
pt = POINT(x, y)
cf = COMPOSITIONFORM()
cf.dwStyle = 2      # CFS_POINT
cf.ptCurrentPos = pt;
windll.imm32.ImmSetCompositionWindow(hIMC, byref(cf))
windll.imm32.ImmReleaseContext(self.GetHandle(), hIMC)


これでIMEは使えるようになったが、Editorはそもそも日本語の入力を受け付けてくれない。
Editorをサブクラス化してオーバーライドするより、1から自分で作ったほうが速そうだ。