C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ListBoxのIndexFromPointについて


(過去ログ 102 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■60851 / inTopicNo.1)  ListBoxのIndexFromPointについて
  
□投稿者/ やんまー (70回)-(2011/07/21(Thu) 10:56:42)

分類:[VB.NET/VB2005 以降] 

ListboxにD&Dする際に、
すでに要素がある場合には挿入するようにしたいです。

そこで、
http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200812/08120014.txt
を参考にしまして、

ListBox1.IndexFromPoint(ListBox1.PointToClient(MousePosition))
の値が-1だったらadd、それ以外だったらInsertとしました。

If Index = -1 Then
ListBox1.Items.Add(要素)
Else
ListBox1.Items.Insert(要素)
End If


このやり方で通常の文字列型のListboxでは全く問題なかったのですが、
DrawItemで画像をListboxに表示している際に問題が発生しました。

試しに、マウスダウンイベントでマウス位置のインデックスがいくつと判定されるか調べてみたのですが、困りました。

まず要素がないとき
Stringの時・・・-1
画像の時・・・65535

となります。この場合は65535と置き換えればよかったのですが、

要素がすでにある場合、追加された要素の下側を調べると
Stringの時・・・-1
画像の時・・・インデックスの最大値

となってしまいます。
画像の時は例えば要素が2つの時
2つ目の要素を選択した場合も、その下の空白部分を選択(クリック)した場合も
「1」となってしまいます。
これでは末尾にaddさせることができません・・・。

リストボックスの挙動を見ると
下の空白部分をクリックした場合、
stringの場合は選択されませんが、画像の時は選択されてしまう、という違いがありました。

どうやったら末尾に追加できるのでしょうか・・・

引用返信 編集キー/
■60852 / inTopicNo.2)  Re[1]: ListBoxのIndexFromPointについて
□投稿者/ shu (874回)-(2011/07/21(Thu) 11:06:11)
No60851 (やんまー さん) に返信

> まず要素がないとき
> Stringの時・・・-1
> 画像の時・・・65535
>
> となります。この場合は65535と置き換えればよかったのですが、
>
> 要素がすでにある場合、追加された要素の下側を調べると
> Stringの時・・・-1
> 画像の時・・・インデックスの最大値

この内容からすると
>= インデックスの最大値
でいいような気がしますがどうでしょう?
念のため
 >= インデックスの最大値 or = -1
としておけばより良い気がします。


引用返信 編集キー/
■60853 / inTopicNo.3)  Re[2]: ListBoxのIndexFromPointについて
□投稿者/ やんまー (71回)-(2011/07/21(Thu) 11:36:28)
shu さん

いつもお世話になっております。

うまく説明出来ていなくて申し訳ありません。

問題なのは、画像のリストボックスの時に
一番下のインデックスを選択しているのか、その下の何も無いところを選択しているのか
の判定ができないことです。


要素 INDEX0
----
要素 INDEX1
---@
要素 INDEX2
---
A



文字列型の時は
INDEXが2だったら@に挿入
INDEXが-1だったらAに挿入(add)
とやっているのですが、

画像の時はAの場所にいてもINDEX2となってしまうのでAの場所に挿入(add)ができないのです。



引用返信 編集キー/
■60854 / inTopicNo.4)  Re[3]: ListBoxのIndexFromPointについて
□投稿者/ やんまー (72回)-(2011/07/21(Thu) 11:41:17)
ちょっと不本意ですが、
空の画像を一つ追加しておけば、それっぽく見えるでしょうか・・・

空のItemがselectできてしまうのがいまいちですが。。。
引用返信 編集キー/
■60858 / inTopicNo.5)  Re[3]: ListBoxのIndexFromPointについて
□投稿者/ shu (875回)-(2011/07/21(Thu) 12:06:05)
No60853 (やんまー さん) に返信

> 問題なのは、画像のリストボックスの時に
> 一番下のインデックスを選択しているのか、その下の何も無いところを選択しているのか
> の判定ができないことです。
> 
> 
> 要素 INDEX0
> ----
> 要素 INDEX1
> ---@
> 要素 INDEX2
> ---
> A

失礼しました。下の空白部でも最後のアイテムのインデックスと同じということですね。勝手に+1なのかと
思ってましたmm

    Private Sub ListBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
        Dim idx = ListBox1.IndexFromPoint(e.Location)
        Dim rect = ListBox1.GetItemRectangle(idx)
        If rect.Contains(e.Location) Then
            Label1.Text = idx.ToString
        Else
            Label1.Text = "Not Contains"
        End If
    End Sub

こんな感じでそのインデックスでアイテムのレクタングルを取り直してそこに含まれているか確認すると
良いかと思います。

引用返信 編集キー/
■60863 / inTopicNo.6)  Re[4]: ListBoxのIndexFromPointについて
□投稿者/ やんまー (73回)-(2011/07/21(Thu) 14:44:02)
2011/07/21(Thu) 14:54:27 編集(投稿者)
2011/07/21(Thu) 14:45:01 編集(投稿者)

shu さん

ああああ!いつもすみません!

出来ました!



こうして見ました。

part1が追加する要素です。



Dim Index As Integer= ListBox1.IndexFromPoint(ListBox1.PointToClient(MousePosition))
If Index = 65535 Then
	ListBox1.Items.Add(part1)
Else if ListBox1.GetItemRectangle(ListBox1.IndexFromPoint _
		(ListBox1.PointToClient(MousePosition) ) ) _
		.Contains _
		(ListBox1.PointToClient(MousePosition) ) Then

		ListBox1.Items.Insert(Index,part1)
Else
	ListBox1.Items.Add(part1)
End If

ありがとうございます!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -