「.NETプラグイン開発 イベント編」の版間の差分

MSY-07 (トーク | 投稿記録)
<source>タグを<syntaxhighlight>タグに置き換え
MSY-07 (トーク | 投稿記録)
句読点と機種依存記号の修正
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) {
// ①Mery 操作用のオブジェクト生成
// (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) {
// ①Mery 操作用のオブジェクト生成
// (1)Mery 操作用のオブジェクト生成
var editor = new Editor(hWnd);
var editor = new Editor(hWnd);


// ②文字列を取得
// (2)文字列を取得
string text = editor.GetText();
string text = editor.GetText();


// Shift-JIS のバイト数に変換
// (3) Shift-JIS のバイト数に変換
int length = Encoding.GetEncoding(932).GetByteCount(text);
int length = Encoding.GetEncoding(932).GetByteCount(text);


// ④改行コードが CR+LF だった場合は、その分追加
// (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 のバイト数を取得するためにはまずテキスト全体を取得します(②)。<br>
GetLength() は Unicode 文字数を返すので、Shift-JIS のバイト数を取得するためにはまずテキスト全体を取得します((2))。<br>
次に③でテキストを Shift-JIS でのバイト数に換算します。<br>
次に(3)でテキストを Shift-JIS でのバイト数に換算します。<br>
正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。<br>
正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。<br>
これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。<br>
これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。<br>
CR+LF だと改行分だけバイト数がずれてしまいますので、④の改行コード判定およびその分の調整をしています。<br>
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) {
// ①固有のタイマーID
// (1)固有のタイマーID
ushort TimerID = 1;
ushort TimerID = 1;


// ②1000ms 後に処理を開始する
// (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">仮想キーコード.<see cref="VIRTUAL_KEY"/> に定義されています.</param>
/// <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">直前のキー状態が指定されます.true の場合,メッセージが送られる前からキーが押されています.</param>
/// <param name="previous">直前のキー状態が指定されます。true の場合、メッセージが送られる前からキーが押されています。</param>
/// <returns>メッセージ処理を継続する場合は false.</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) {
// ①Alt キーが押されたことによるイベントかを判定
// (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);


// ⑤通常の Alt 処理をキャンセル
// (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>
コードとしては、矩形選択にし直す、という便利なメソッドは用意されていないので、③選択範囲の取得→④矩形選択し直し、という流れになります。<br>
コードとしては、矩形選択にし直す、という便利なメソッドは用意されていないので、(3)選択範囲の取得→(4)矩形選択し直し、という流れになります。<br>
⑤で true を返さないと、本体のキー処理が走るためメニューが表示されてしまいます。<br>
(5)で true を返さないと、本体のキー処理が走るためメニューが表示されてしまいます。<br>
無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。<br>
無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。<br>
<br>
<br>
スポンサーリンク