Top / .NET備忘録 / 06.ContextMenu / 02.共通インターフェイスの実装(VBTextBox)

VBTextBox に機能を実装していきます。

 public class VBTextBox : TextBox

の部分を

 public class VBTextBox : TextBox, IVBContextMenuTarget

としてコンパイルするとエラーが出る(^_^;)ので、それを実装します。
コードエディタで「インターフェイスの実装」とすると、ひな型を生成してくれるので便利。

Delete

Delete は、WM_CLEAR メッセージを送るだけです。

        const int WM_CLEAR = 0x0303;
 
        [DllImport("user32", CharSet = CharSet.Auto)]
        private extern static IntPtr SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
  
        public void Delete()
        {
            SendMessage(this.Handle, WM_CLEAR, IntPtr.Zero, IntPtr.Zero);
        }

ImeOpenStatus

ImeOpenStatus は、プロパティとして実装します。
System.Windows.Forms.ImeContext クラスが使用できます。

        public bool ImeOpenStatus
        {
            get { return ImeContext.IsOpen(this.Handle); }
            set { ImeContext.SetOpenStatus(value, this.Handle); }
        }

Reconvert

再変換の実装はいろいろ悩みました。
ImmSetCompositionString を使って実装してみたものの、変換候補が出たあと、他のフィールドをマウスでクリックすると、変換候補が移動してしまいます。

ContextMenu1.gif

この状態で右のテキストボックスをクリックすると・・・

ContextMenu2.gif

こうなります。

結局、変換キーを押すことにします。SendInput は面倒なので keybd_event :p

        [DllImport("user32")]
        private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, IntPtr dwExtraInfo);
 
        public void Reconvert()
        {
            keybd_event((byte)Keys.IMEConvert, 0, 0, IntPtr.Zero);
        }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-16 (土) 12:59:53 (1683d)