- PR -

ListBox上の座標により適切なアイテムを選択する方法

投稿者投稿内容
DH
会議室デビュー日: 2005/03/05
投稿数: 15
投稿日時: 2006-02-18 14:28
いつもお世話になっております。

現在.net2003 C# Winアプリケーションを作成しています。

ListBox上でマウス座標からListBoxのアイテムインデックスを取得し、アイテムを
選択するプログラムを作りたいと考えています。
MouseMoveイベントを捕まえてやることでなんとか形にはなったのですが
ドラッグしてきたアイテムをListBox上で動かしているときにも同じような
動きをさせたいのですが、良いイベントが見つかりません。

ご存知の方がいらっしゃいましたら、よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-18 14:51
引用:

DHさんの書き込み (2006-02-18 14:28) より:

MouseMoveイベントを捕まえてやることでなんとか形にはなったのですが
ドラッグしてきたアイテムをListBox上で動かしているときにも同じような
動きをさせたいのですが、良いイベントが見つかりません。


Drop しない限りは Drag 元の MouseMove イベントになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DH
会議室デビュー日: 2005/03/05
投稿数: 15
投稿日時: 2006-02-18 15:59
じゃんぬねっとさん、こんにちは。
お早い回答ありがとうございます。

なるほど、Drag元のイベントで捕まえれば良かったんですね。
なんとかやれそうです。ありがとうございました。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-02-19 01:10
ん?
Drag「中」にMouse〜イベントって起きましたっけ?
#勘違いかしら。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-19 09:29
引用:

まどかさんの書き込み (2006-02-19 01:10) より:

Drag「中」にMouse〜イベントって起きましたっけ?


繰り返しになりますが、Drag 元のコントロールで起きます。
Drop した後でない限り Drop 先では一切起きません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DH
会議室デビュー日: 2005/03/05
投稿数: 15
投稿日時: 2006-02-20 10:23
まどかさん、じゃんぬねっとさんお返事遅くなりまして申し訳ありません。

なにぶん不慣れな者で確認を取るのに時間が掛かってしまいました。
Drag元のMouseMoveイベントを捕まえまして、こちらが求めるコードを
書いたのですがうまく行きませんでした。
書いたコードの内容がまずいのだと思いそちらの方を見直しておりました。
しかし、まどかさんの指摘がありましてそちらの方も調べてみました。

こんなコードでTextにログを書き込みまして試してみました。

//ここからはC#のコードです

//MouseMoveイベント
private void List1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
//ログを書き込むテキストのパス
string path = @"C:\メモ.txt";

//追加書き込み式で
System.IO.StreamWriter writer = new System.IO.StreamWriter(path,true);

//マウスポインタの位置を随時書き込む
writer.Write("MouseのX座標は『"+ Cursor.Position.X.ToString() +"』MouseのY座標は『"+Cursor.Position.Y.ToString()+"』です。");
writer.Write("\r\n");
writer.Close();
}

//List内でアイテムをドラッグしたときのイベント。
private void List1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
{
//Drag&Drop実行処理。
List1.DoDragDrop(DragするData,DragDropEffects.Move | DragDropEffects.Copy);

//ログを書き込むテキストのパス
string path = @"C:\メモ.txt";

//追加書き込み式で
System.IO.StreamWriter writer = new System.IO.StreamWriter(path,true);
writer.Write("ドラッグが開始されました。");
writer.Write("\r\n");
writer.Close();
}

ログ用のTextの内容は

//ここからはTextの内容

MouseのX座標は『522』MouseのY座標は『275』です。
MouseのX座標は『522』MouseのY座標は『276』です。
MouseのX座標は『521』MouseのY座標は『276』です。
MouseのX座標は『520』MouseのY座標は『276』です。
ドラッグが開始されました。



という感じで”ドラッグが開始されました。”で終了していました。
このことからドラッグ中はMouseMoveイベントが発生していないのではないか?
と思われるのですがどうでしょうか。
なにぶん不慣れな者でコード間違い等あると思いますが指摘の方宜しくお願い致します。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-20 11:33
引用:

DHさんの書き込み (2006-02-20 10:23) より:

このことからドラッグ中はMouseMoveイベントが発生していないのではないか?
と思われるのですがどうでしょうか。


すいません、ウソ付きました。
私も今確認したのですが発生していませんね... orz
Drag 元でイベントが発生するのは、DragDropEffects がない場合のみですね。

となると派生クラス側で DragEnter 後の WM_NCHITTEST を補足するしかないのかなぁ。

引用:

DHさんの書き込み (2006-02-20 10:23) より:

//マウスポインタの位置を随時書き込む
writer.Write("MouseのX座標は『"+ Cursor.Position.X.ToString() +"』MouseのY座標は『"+Cursor.Position.Y.ToString()+"』です。");


関係ないところですが、Console.WriteLine メソッドを使った方が良いでしょう。
MouseMove するたびに Stream を Open / Close したら負荷がかかりますから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-02-20 11:55
DragOverイベントでは駄目ですか?

スキルアップ/キャリアアップ(JOB@IT)