« 2011年1月 | トップページ | 2011年3月 »

2011年2月

2011年2月13日 (日)

TextBox のマウス位置に該当する行・桁位置を求める

短くて済むので、C# Tips というより、覚え書きとして、書き残しておきます。

C#2005 以降を前提としますが、任意のマウス位置から、テキストの文字インデックスを得るものとして、GetCharIndexFromPosition プロパティがあります。また、この文字インデックスにあたる行番号を取得出来る GetLineFromCharIndex プロパティと、指定行番号の先頭文字インデックスを得る GetFirstCharIndexFromLine プロパティを使用すれば、簡単な計算で桁位置も求められます。

具体的な使用例は、以下のとおりです。

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    int index = textBox1.GetCharIndexFromPosition(e.Location);
    int line = textBox1.GetLineFromCharIndex(index);
    int column = index - textBox1.GetFirstCharIndexFromLine(line);
    Console.WriteLine("{0}行 {1}桁", line, column);
}

ここでは、MouseDown イベントを使用したので、この様な記述となります。しかし、例えば DrapDrop イベントで使用する場合は、マウスの座標がスクリーン座標となっている為、クライアント座標に変換する必要がある事に注意します。

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    int index = textBox1.GetCharIndexFromPosition(
        textBox1.PointToClient(new Point(e.X, e.Y)));
    int line = textBox1.GetLineFromCharIndex(index);
    int column = index - textBox1.GetFirstCharIndexFromLine(line);
    Console.WriteLine("{0}行 {1}桁", line, column);
}

2011年2月 4日 (金)

OLEドラッグ&ドロップ対応にする方法(オブジェクト編)

.NETにおけるOLEドラッグ&ドロップは、いろいろなデータを取り扱えますが、その制約について改めて確認しておきます。
Control.DoDragDrop メソッドで、『データは、基本マネージ クラス (String 、 Bitmap 、または Metafile)、あるいは ISerializable または IDataObject を実装するオブジェクトのいずれかである必要があります。』と説明されています。
つまり、これらのデータである限り、OLEドラッグ&ドロップが出来るという事です。

ではここで、前回ファイル編で使用したドロップソース側のサンプルを修正して、ListBox から ListView に置き換えてみます。ここでは、View プロパティを View.Details 、MultiSelect プロパティを false に設定している前提とします。そしてドラッグした、ListViewItem 自身をドラッグで受け渡すデータとしてみます。なお、ListViewItem は、ISerializable インターフェースを実装しているので、前述のデータ受け渡し制約の範囲内となります。

なお、今回も最後にサンプルコードがダウンロード出来るようにしています。詳細はそちらを見て頂きたいのですが、ListViewItem として、改造前同様任意のフォルダ内のファイル情報を表示しています。但し、今回の記事の関連で、若干ながら凝った造りにしています。
では、さっそく本題に入ります。

続きを読む "OLEドラッグ&ドロップ対応にする方法(オブジェクト編)" »

« 2011年1月 | トップページ | 2011年3月 »