「.NETプラグイン開発 イベント編」の版間の差分
<source>タグを<syntaxhighlight>タグに置き換え |
句読点と機種依存記号の修正 |
||
| 16行目: | 16行目: | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
/// <summary> | /// <summary> | ||
/// | /// テキストが変更された時。 | ||
/// </summary> | /// </summary> | ||
/// <param name="hWnd">対象のエディタハンドル</param> | /// <param name="hWnd">対象のエディタハンドル</param> | ||
public void OnChanged(IntPtr hWnd) { | public void OnChanged(IntPtr hWnd) { | ||
// | // (1)Mery 操作用のオブジェクト生成 | ||
var editor = new Editor(hWnd); | var editor = new Editor(hWnd); | ||
// | // (2)文字数を取得(改行含む) | ||
int length = editor.GetLength(true); | int length = editor.GetLength(true); | ||
// | // (3)ステータスバーに結果を表示 | ||
editor.SetStatus(length.ToString()); | editor.SetStatus(length.ToString()); | ||
} | } | ||
| 36行目: | 36行目: | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
/// <summary> | /// <summary> | ||
/// | /// テキストが変更された時。 | ||
/// </summary> | /// </summary> | ||
/// <param name="hWnd">対象のエディタハンドル</param> | /// <param name="hWnd">対象のエディタハンドル</param> | ||
public void OnChanged(IntPtr hWnd) { | public void OnChanged(IntPtr hWnd) { | ||
// | // (1)Mery 操作用のオブジェクト生成 | ||
var editor = new Editor(hWnd); | var editor = new Editor(hWnd); | ||
// | // (2)文字列を取得 | ||
string text = editor.GetText(); | string text = editor.GetText(); | ||
// | // (3) Shift-JIS のバイト数に変換 | ||
int length = Encoding.GetEncoding(932).GetByteCount(text); | int length = Encoding.GetEncoding(932).GetByteCount(text); | ||
// | // (4)改行コードが CR+LF だった場合は、その分追加 | ||
if (editor.GetNewLineType() == Editor.NewLineType.CrLf) { | if (editor.GetNewLineType() == Editor.NewLineType.CrLf) { | ||
length += editor.GetLines(true) - 1; | length += editor.GetLines(true) - 1; | ||
} | } | ||
// | // (5)ステータスバーに結果を表示 | ||
editor.SetStatus(length.ToString()); | editor.SetStatus(length.ToString()); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
GetLength() は Unicode 文字数を返すので、Shift-JIS | GetLength() は Unicode 文字数を返すので、Shift-JIS のバイト数を取得するためにはまずテキスト全体を取得します((2))。<br> | ||
次に(3)でテキストを Shift-JIS でのバイト数に換算します。<br> | |||
正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。<br> | 正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。<br> | ||
これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。<br> | これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。<br> | ||
CR+LF | CR+LF だと改行分だけバイト数がずれてしまいますので、(4)の改行コード判定およびその分の調整をしています。<br> | ||
ちょっと面倒ですが、ここまで来ればマクロより楽なはずです。<br> | ちょっと面倒ですが、ここまで来ればマクロより楽なはずです。<br> | ||
| 77行目: | 77行目: | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
/// <summary> | /// <summary> | ||
/// | /// テキストが変更された時。 | ||
/// </summary> | /// </summary> | ||
/// <param name="hWnd">対象のエディタハンドル</param> | /// <param name="hWnd">対象のエディタハンドル</param> | ||
public void OnChanged(IntPtr hWnd) { | public void OnChanged(IntPtr hWnd) { | ||
// | // (1)固有のタイマーID | ||
ushort TimerID = 1; | ushort TimerID = 1; | ||
// | // (2)1000ms 後に処理を開始する | ||
// 1000ms の間に再度呼ばれた場合は後の方が有効になる | // 1000ms の間に再度呼ばれた場合は後の方が有効になる | ||
SetTimer(hWnd, TimerID, 1000, () => { | SetTimer(hWnd, TimerID, 1000, () => { | ||
| 113行目: | 113行目: | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
/// <summary> | /// <summary> | ||
/// | /// システムキーを押したときに呼ばれます。 | ||
/// </summary> | /// </summary> | ||
/// <param name="hWnd">対象のエディタハンドル</param> | /// <param name="hWnd">対象のエディタハンドル</param> | ||
/// <param name="keycode"> | /// <param name="keycode">仮想キーコード。<see cref="VIRTUAL_KEY"/> に定義されています。</param> | ||
/// <param name="repeat">リピートカウント</param> | /// <param name="repeat">リピートカウント</param> | ||
/// <param name="alt">ALT キーが押されているか</param> | /// <param name="alt">ALT キーが押されているか</param> | ||
/// <param name="previous"> | /// <param name="previous">直前のキー状態が指定されます。true の場合、メッセージが送られる前からキーが押されています。</param> | ||
/// <returns>メッセージ処理を継続する場合は | /// <returns>メッセージ処理を継続する場合は false。</returns> | ||
public bool OnSysKeyDown(IntPtr hWnd, int keycode, int repeat, bool alt, bool previous) { | public bool OnSysKeyDown(IntPtr hWnd, int keycode, int repeat, bool alt, bool previous) { | ||
// | // (1)Alt キーが押されたことによるイベントかを判定 | ||
if (keycode == (int)VIRTUAL_KEY.VK_MENU) { | if (keycode == (int)VIRTUAL_KEY.VK_MENU) { | ||
// | // (2)選択されていて、まだ矩形選択になっていないか | ||
// これを確認しないと何度も矩形選択処理をしてしまう | // これを確認しないと何度も矩形選択処理をしてしまう | ||
var editor = new Editor(hWnd); | var editor = new Editor(hWnd); | ||
if (editor.GetSelType() == Editor.SEL_TYPE.CHAR) { | if (editor.GetSelType() == Editor.SEL_TYPE.CHAR) { | ||
// | // (3)選択範囲を取得 | ||
var start = editor.GetSelStart(true); | var start = editor.GetSelStart(true); | ||
var end = editor.GetSelEnd(true); | var end = editor.GetSelEnd(true); | ||
// | // (4)矩形選択し直す | ||
editor.Select(start, end, true, true); | editor.Select(start, end, true, true); | ||
// | // (5)通常の Alt 処理をキャンセル | ||
return true; | return true; | ||
} | } | ||
} | } | ||
// | // (6)処理しなかった場合は本体のキー操作処理にゆだねる | ||
return false; | return false; | ||
} | } | ||
| 146行目: | 146行目: | ||
OnSysKeyDown() は Alt や Ctrl などの特別なキーを処理するためのイベントです。<br> | OnSysKeyDown() は Alt や Ctrl などの特別なキーを処理するためのイベントです。<br> | ||
通常の a などのキーは OnKeyDown() になるので、使い分けに注意してください。<br> | 通常の a などのキーは OnKeyDown() になるので、使い分けに注意してください。<br> | ||
コードとしては、矩形選択にし直す、という便利なメソッドは用意されていないので、(3)選択範囲の取得→(4)矩形選択し直し、という流れになります。<br> | |||
(5)で true を返さないと、本体のキー処理が走るためメニューが表示されてしまいます。<br> | |||
無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。<br> | 無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。<br> | ||
<br> | <br> | ||
スポンサーリンク