|
2008/03/22(Sat) 00:25:19 編集(投稿者)
>>完成がたのしみですね。 >>わたしはIMEと実際のテキストがうまくかさなってくれずそこでざせつしました。 > > -------------------------------------------------------------------------- > > [DllImport("imm32.dll")] > private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd); > [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] > private class LOGFONT > { > public Int32 lfHeight; > public Int32 lfWidth; > public Int32 lfEscapement; > public Int32 lfOrientation; > public Int32 lfWeight; > public byte lfItalic; > public byte lfUnderline; > public byte lfStrikeOut; > public byte lfCharSet; > public byte lfOutPrecision; > public byte lfClipPrecision; > public byte lfQuality; > public byte lfPitchAndFamily; > [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] > public string lfFaceName; > } > > private const int WM_IME_CONTROL = 643; > > private Control _Control; おーなーこんとろーる > private IntPtr _ImeHandle; imeのはんどる > > > _ImeHandle = ImmGetDefaultIMEWnd(this._Control.Handle); > > ↑imeのハンドルを取得 > 確かオーナーコントロールのコンストラクタで取得すると正しく取得できなかったはず・・・ > コンストラクタの外でやると、うまく取得できました。 > > ↓カーソルが動いたときにこれを呼びます > private void SetImePos(int x, int y) { > LOGFONT logfnt = new LOGFONT(); > _Control.Font.ToLogFont(logfnt); > logfnt.lfFaceName = this._Control.Font.Name; > SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONFONT, logfnt); > > COMPOSITIONFORM lParam = new COMPOSITIONFORM(); > lParam.dwStyle = CFS_POINT; > lParam.ptCurrentPos.X = x; > lParam.ptCurrentPos.Y = y; > lParam.rcArea = new RECT(); > > SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONWINDOW, lParam); > } > ---------------------------------------------------------------------------------------- > こんな感じでうまく動いてます。
どうも、ソースありがとうございます。 IMEの最初の表示場所は、このソースと同じような方法で、指定することはできたのですが、 IMEで文字を入力すると、DrawStringで書き込んだソースとうまく重なってくれなかったんですよ^^; もう一度挑戦したくなってきました。
> 今は取り合えず、処理速度には問題ありですが、 > 範囲選択(矩形選択も含む)、キーワードで色分け(Pascal,C,VB,PL/SQLに対応) > 検索(通常検索、一括検索、インクリメンタルサーチ、置換、一括置換、範囲選択置換) > ブックマーク、検索文字の強調表示(色付け)、画面分割、選択範囲コメント化、 > 大文字/小文字/2バイト文字/1バイト文字 変換、補完(われながらいいでき(^^;;) > などを実装しました。 > あと、エディタとしては最低限Undoが必要ですが、地味に難しい・・・orz
Undo,Redoですね〜がんばってください。
で、久しぶりに挑戦しましたが。 ああ、DrawStringの勝手な余白をつける処理のせいで、やっぱりずれるなあ。 まず、文字の前に5ドットぐらいの余白と、文字と文字の間に余白がIME入力中の文字と比べると入ってしまいます。
|