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

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

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

Re[1]: ListBoxにクラスを追加した際の表示のカスタマイズ?


(過去ログ 101 を表示中)

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

■60716 / inTopicNo.1)  ListBoxにクラスを追加した際の表示のカスタマイズ?
  
□投稿者/ やんまー (55回)-(2011/07/16(Sat) 01:38:48)

分類:[.NET 全般] 

ListBoxにはクラスも追加できるとわかりました。

Public Partial Class MainForm

	Class Test
		public a As String
	End Class
	
	Sub Button2Click(sender As Object, e As EventArgs)
		Dim obj_test As Test = New Test()
		obj_test.a = textBox1.Text
		
		listBox1.Items.Add(test1)
		
		Debug.Print(test1.a)
	End Sub


	Sub ListBox1SelectedIndexChanged(sender As Object, e As EventArgs)
		Dim test As Test = listBox1.SelectedItem
		Debug.Print( test.a)
	End Sub

End Class


--

テキストボックスに’a’の値を設定して、
変更しながらボタンを押すことで、それぞれがリストボックスに追加されることを確認できました。


しかし、表示される物はstringになってしまうようで、このばあいは
「List_class.MainForm+Test」
と表示されてしまいます。


ここで疑問なのですが、
クラスをリストボックスに追加した場合に、表示されるものをカスタマイズできないのでしょうか?

例えば、Testクラスにさらに
 public b as image

としておいて、このbに画像を設定し追加したら、
リストボックスには test.b を表示させるカスタマイズを行いたいのですが・・・


これが近いのかと思いましたが、よくわかりませんでした。。。
http://msdn.microsoft.com/ja-jp/library/cc265158(v=vs.95).aspx

引用返信 編集キー/
■60721 / inTopicNo.2)  Re[1]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ shu (857回)-(2011/07/16(Sat) 07:45:11)
No60716 (やんまー さん) に返信

> しかし、表示される物はstringになってしまうようで、このばあいは
> 「List_class.MainForm+Test」
> と表示されてしまいます。
>
>
> ここで疑問なのですが、
> クラスをリストボックスに追加した場合に、表示されるものをカスタマイズできないのでしょうか?
ToStrnigをオーバーライドすればToStringの結果が表示されるようになります。


> 例えば、Testクラスにさらに
> public b as image
>
> としておいて、このbに画像を設定し追加したら、
> リストボックスには test.b を表示させるカスタマイズを行いたいのですが・・・
Imageの表示はOwnerDrawでないと駄目です。
引用返信 編集キー/
■60724 / inTopicNo.3)  Re[1]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ shu (859回)-(2011/07/16(Sat) 08:42:23)
No60716 (やんまー さん) に返信

> これが近いのかと思いましたが、よくわかりませんでした。。。
> http://msdn.microsoft.com/ja-jp/library/cc265158(v=vs.95).aspx

このリンクはSilverLightのものですが、SelverLightの画面を作成したいのでしょうか?
引用返信 編集キー/
■60726 / inTopicNo.4)  Re[1]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ 魔界の仮面弁士 (2255回)-(2011/07/16(Sat) 10:32:29)
2011/07/16(Sat) 12:18:26 編集(投稿者)
No60716 (やんまー さん) に返信
> ListBoxにはクラスも追加できるとわかりました。
クラスでも構造体でも列挙型でも、好きな型を渡せますよ。


> obj_test.a = textBox1.Text
> listBox1.Items.Add(test1)

listBox1.Items.Add(obj_test) ですよね。

# コントロール名が小文字で始まっていると、なんだか
# VB ではなく C# なコードに見えてくる…。


> Dim test As Test = listBox1.SelectedItem
> Debug.Print( test.a)
ListBox の項目が選択されていなかった場合に備え、上記は、
 Dim test As Test = TryCast(listBox1.SelectedItem, Test)
 If test IsNot Nothing Then
  Debug.Print(test.a)
 End If
とした方が安全です。Option Strict On への対応にもなりますし。


> 表示されるものをカスタマイズできないのでしょうか?
Test クラスの a メンバーが、フィールド変数ではなくプロパティであるなら、
listBox1.Items の代わりに、listBox1.DataSource と listBox1.DisplayMember を
用いるという手法もあります。

ただし今回のケースでは、shu さんが回答された方法を使った方が手っ取り早いと思います。


> public b as image
> としておいて、このbに画像を設定し追加したら、
> リストボックスには test.b を表示させるカスタマイズを行いたいのですが・・・
System.Windows.Forms の ListBox に画像を表示させるには、オーナー描画が必要です。
(WPF の場合はまた事情が変わってきますが)

下記のサンプルが役に立つかもしれません。
http://www.atmarkit.co.jp/fdotnet/dotnettips/344listboxvari/listboxvari.htmlNo60721 (shu さん) に返信
> ToStrnigをオーバーライドすればToStringの結果が表示されるようになります。
スペルミスはさておき、それが最も簡単な手法ですね。

もしも画像表示のためにオーナー描画させるなら、文字列も同様に
描画すれば、ToString を実装せずとも ListBox に表示させられますが、
デバッグ時の役にも立ちますので、ToString も一緒に実装しておいた方が
何かと便利かと思います。

なお、実装時には「overrides」まで入力してからスペースを入力すると
http://homepage1.nifty.com/rucio/images/DNA/DNA02_aOverridableList.gif
のように一覧が現れるので、そこから ToString を選ぶと楽ですね。
たとえば、以下のようなコードになります。

    <DebuggerDisplay("aの内容は「{a}」です")> _
    Class Test
        Public a As String

        Public Overrides Function ToString() As String
            Return a  '※ListBoxに表示させる内容※
        End Function
    End Class


上記ではさらに、 DebuggerDisplay 属性も付与しています。
こちらは必須ではありませんが、この属性をつけておくと、
    Dim item As New Test()
    item.a = "データ"
    ListBox1.Items.Add(item)  'ここにブレークポイントを貼っておく
などで一時停止させた場合、変数 item の上にマウスカーソルをポイントすると
『aの内容は「"データ"」です』と表示されるようになります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/994debugdisp/debugdisp.html

引用返信 編集キー/
■60727 / inTopicNo.5)  Re[2]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ shu (860回)-(2011/07/16(Sat) 10:38:21)
No60726 (魔界の仮面弁士 さん) に返信
> ■No60716 (やんまー さん) に返信

> ■No60721 (shu さん) に返信
>>ToStrnigをオーバーライドすればToStringの結果が表示されるようになります。
> スペルミスはさておき、それが最も簡単な手法ですね。
ToStrnig => ToString
でした。失礼しました。2つ目はちゃんとタイピング出来てたのですが^^;
引用返信 編集キー/
■60731 / inTopicNo.6)  Re[3]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ 魔界の仮面弁士 (2256回)-(2011/07/16(Sat) 12:28:34)
No60727 (shu さん) に返信
> でした。失礼しました。2つ目はちゃんとタイピング出来てたのですが^^;
ついでに No60724 もスペルミスしています。(^^;

さらに言えば、Silverlight は通常、Light ではなく light と小文字表記されます。



No60726 (魔界の仮面弁士) に追記
> System.Windows.Forms の ListBox に画像を表示させるには、オーナー描画が必要です。
> (WPF の場合はまた事情が変わってきますが)
Silverlight / WPF で、ListBox に画像を表示する場合の例として:
http://codezine.jp/article/detail/5557?p=2
http://social.msdn.microsoft.com/Forums/ja-JP/silvelightdotnetja/thread/8dd1e876-b4f3-4219-a7d3-3c5c40330ba3/
引用返信 編集キー/
■60732 / inTopicNo.7)  Re[4]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (56回)-(2011/07/16(Sat) 14:05:54)
shu さん
> このリンクはSilverLightのものですが、SelverLightの画面を作成したいのでしょうか?

違いました。。。



魔界の仮面弁士さん

> listBox1.Items.Add(obj_test) ですよね。

すいません。書き写しミスです。


> 下記のサンプルが役に立つかもしれません。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/344listboxvari/listboxvari.html


ありがとうございます。URL先はすでに見ていました。
でも、この方法だと、最終的にaddするのはBitmapそのもので、
数個addした場合に、すべておなじになってしまいませんか。。。

それとも何かうまいやり方がありますでしょうか。。。


また、
Overrides してリストボックスにaの値が表示することができました。

でも、ここからimageを返してもだめですよね・・・
引用返信 編集キー/
■60733 / inTopicNo.8)  Re[5]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ 魔界の仮面弁士 (2257回)-(2011/07/16(Sat) 14:26:11)
No60732 (やんまー さん) に返信
> > http://www.atmarkit.co.jp/fdotnet/dotnettips/344listboxvari/listboxvari.html
> でも、この方法だと、最終的にaddするのはBitmapそのもので、
Bitmap というか、Image ですよね。

Test クラスの b は Image 型にするのですから、Image を継承したクラスなら、
Bitmap でも Metafile でも構いません。


> 数個addした場合に、すべておなじになってしまいませんか。。。
同じ画像を Add すれば同じ画像になるでしょうし、
異なる画像を Add すれば異なる画像になります。

URL 中のコードから抜粋すると、ListBox の DrawItem イベントで
  Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Image)
というコードが書かれていますが、今回の場合はこれが No60726 で示したように
 Dim item As Test = TryCast(ListBox1.SelectedItem, Test)
 If item IsNot Nothing Then
  thumbnail = item.b
 End If
になるでしょうね。


> それとも何かうまいやり方がありますでしょうか。。。
今はどの部分で躓いているのでしょうか?

引用返信 編集キー/
■60734 / inTopicNo.9)  Re[5]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ shu (861回)-(2011/07/16(Sat) 14:59:38)
No60732 (やんまー さん) に返信

No60646 のスレと目的は同じなのでしょうか?というか言っていることが
同じ気がするのですが、画像を表示するにはオーナードローしないと駄目です。
今のListBoxの仕様ではオーナードローなしで画像を表示する機能はないと思います。

> でも、この方法だと、最終的にaddするのはBitmapそのもので、
> 数個addした場合に、すべておなじになってしまいませんか。。。
ListBox1.Add(new Test() with {.a = "aaa", .b = bitmap1})
ListBox1.Add(new Test() with {.a = "bbb", .b = bitmap2})
ListBox1.Add(new Test() with {.a = "ccc", .b = bitmap3})
ListBox1.Add(new Test() with {.a = "ddd", .b = bitmap4})
というように別のインスタンスで追加すればよいですよ。

オーナードローについてはNo60646でも書いているので分かるかと思います。
表示した画像内にaの内容も表示したいのであればDrawStringを使うとよいかと思います。

引用返信 編集キー/
■60735 / inTopicNo.10)  Re[1]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ 魔界の仮面弁士 (2258回)-(2011/07/16(Sat) 15:03:37)
No60716 (やんまー さん) に返信
> としておいて、このbに画像を設定し追加したら、
> リストボックスには test.b を表示させるカスタマイズを行いたいのですが・・・

表示させるのがアイコン程度の画像であれば、ListBox の代わりに
ListView や TreeView を使うと良いかも知れません。
引用返信 編集キー/
■60739 / inTopicNo.11)  Re[6]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (57回)-(2011/07/16(Sat) 20:51:57)
No60734 (shu さん) に返信
> ■No60732 (やんまー さん) に返信
>
> No60646 のスレと目的は同じなのでしょうか?というか言っていることが
> 同じ気がするのですが、画像を表示するにはオーナードローしないと駄目です。
> 今のListBoxの仕様ではオーナードローなしで画像を表示する機能はないと思います。
>
>


すいません。
No60646 のスレでは、単に画像をセット出来ればいいと思っていたので
一旦閉じました。
ただ、よく考えたら、複数セットしたときにそれぞれ別のものと判定したかったので
それではまずいということで、インスタンスをセット出来れば、、、と思ったのですが、
多分オーナードローの仕組みがよくわかっていないので、とんちんかんなことをいってしまっているんでしょうか・・・




>>でも、この方法だと、最終的にaddするのはBitmapそのもので、
>>数個addした場合に、すべておなじになってしまいませんか。。。
> ListBox1.Add(new Test() with {.a = "aaa", .b = bitmap1})
> ListBox1.Add(new Test() with {.a = "bbb", .b = bitmap2})
> ListBox1.Add(new Test() with {.a = "ccc", .b = bitmap3})
> ListBox1.Add(new Test() with {.a = "ddd", .b = bitmap4})
> というように別のインスタンスで追加すればよいですよ。



このようにセット出来るところまではわかったのですが、
Test.bを表示に使う。。。というところで固まってしまいました・・・
引用返信 編集キー/
■60740 / inTopicNo.12)  Re[6]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (58回)-(2011/07/16(Sat) 20:53:41)
魔界の仮面弁士 さん

たびたびすみません 汗

>>> http://www.atmarkit.co.jp/fdotnet/dotnettips/344listboxvari/listboxvari.html
>>でも、この方法だと、最終的にaddするのはBitmapそのもので、
> Bitmap というか、Image ですよね。

最終的に画像をaddする時のサムネイルは
Function createThumbnail
からの返り値がBitmapとなっていたので、Bitmapかなと思ってしまいましたが、違うのでしょうか・・・


>>数個addした場合に、すべておなじになってしまいませんか。。。
> 同じ画像を Add すれば同じ画像になるでしょうし、
> 異なる画像を Add すれば異なる画像になります。
>


上手く説明できなくて申し訳ありません。

リストボックスに追加された要素一つ一つはインスタンスなんですが、
リストボックス表示されるものを画像(例えばインスタンス中のb as image)にしたいのです。

参考URLでは最終的に画像のみをセットしているように見えるのですが、
セットされている要素はインスタンスだけど、表示されるのは画像、というふうにしたいのですが、
それを実現するにはどうするかつまずいています。




> URL 中のコードから抜粋すると、ListBox の DrawItem イベントで
> Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Image)
> というコードが書かれていますが、今回の場合はこれが No60726 で示したように
>  Dim item As Test = TryCast(ListBox1.SelectedItem, Test)
>  If item IsNot Nothing Then
>   thumbnail = item.b
>  End If
> になるでしょうね。
>
>



DrawItem イベント次第で、表示するものが変わるのですね。。
すいません、まだ仕組みがよくわかっていません。。

一度やり直してみます。

引用返信 編集キー/
■60741 / inTopicNo.13)  Re[7]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ shu (862回)-(2011/07/16(Sat) 21:39:07)
2011/07/16(Sat) 21:39:23 編集(投稿者)
No60739 (やんまー さん) に返信
 
> このようにセット出来るところまではわかったのですが、
> Test.bを表示に使う。。。というところで固まってしまいました・・・

No60691のやんまー さんのPGを使用すると以下のようになります。

Sub ListBox2DrawItem(sender As Object, e As DrawItemEventArgs)
    If e.Index = -1 Then ' 項目がない場合にも呼び出される
        Return
    End If

    e.DrawBackground()
		
    'Dim thumbnail As Image = CType(ListBox2.Items(e.Index), Image)
ここを
    Dim thumbnail As Image = CType(ListBox2.Items(e.Index), Test).b
とすればよいです。
ただしbにはcreateThumbnailの結果のBitmapが設定されているものとします。


    ' 画像を中央に表示
    e.Graphics.DrawImage(thumbnail, _
			e.Bounds.X + (e.Bounds.Width - thumbnail.Width) \ 2, _
			e.Bounds.Y + (e.Bounds.Height - thumbnail.Height) \ 2)
		e.DrawFocusRectangle()
End Sub


またbでなくaを表示する場合、オーナードロー設定の場合、すべてのアイテムを描画しなければならないので

Sub ListBox2DrawItem(sender As Object, e As DrawItemEventArgs)
    If e.Index = -1 Then ' 項目がない場合にも呼び出される
        Return
    End If

    e.DrawBackground()
		
すべてのItemがTest型としてDirectCast、混ざる場合はTypeOfとかTryCastで処理をする。
    Dim itm as Test = DirectCast(ListBox2.Items(e.Index), Test)

    if itm.a.Length > 0 then
aに文字が入っていたら描画することにする。画像と同時なら画像表示の後で

ListBoxのForeColorと同じ色でブラシを作成
        Dim brs As New SolidBrush(ListBox1.ForeColor)
文字列(itm.a)を描画
        e.Graphics.DrawString(itm.a, ListBox1.Font, brs, e.Bounds)
フォーカス有無を判断してフォーカスの四角形を描画
        e.DrawFocusRectangle()
作成したブラシを破棄
        brs.Dispose()
    else
        Dim thumbnail As Image = CType(ListBox2.Items(e.Index), Test).b
        ' 画像を中央に表示
        e.Graphics.DrawImage(thumbnail, _
			e.Bounds.X + (e.Bounds.Width - thumbnail.Width) \ 2, _
			e.Bounds.Y + (e.Bounds.Height - thumbnail.Height) \ 2)
		e.DrawFocusRectangle()
    end if

End Sub

引用返信 編集キー/
■60749 / inTopicNo.14)  Re[8]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (59回)-(2011/07/17(Sun) 01:22:57)
shuさん

たびたび申し訳ありません。
教えていただいたようにやってみたのですが、私の理解力が足りなくて、まだわかりません。
以下のようにしたのですが、やっぱり、画像になりません。。。

ToStringのオーバーライドが悪いのかと思いとってみたのですが、
やはり画像にはならず・・・でした。

---

Public Partial Class MainForm
	<DebuggerDisplay("aの内容は「{a}」です")> _
	Class Test
		public a As String
		public b As Image
		Public Overrides Function ToString() As String
            Return a
        End Function
	End Class
	
	Const spacing As Integer = 3 ' 画像の周りのスペース
	Const MaxItemHeight As Integer = 255 ' ItemHeightの最大値
	
	
	' 幅w、高さh内に収まるようなImageオブジェクトを作成
	Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
		Dim fw As Double = CDbl(w) / CDbl(image.Width)
		Dim fh As Double = CDbl(h) / CDbl(image.Height)
		Dim scale As Double = Math.Min(fw, fh)
		Dim nw As Integer = CInt(image.Width * scale)
		Dim nh As Integer = CInt(image.Height * scale)
		Return New Bitmap(image, nw, nh)
	End Function
	
	
	Sub Button2Click(sender As Object, e As EventArgs)
		Dim test1 As Test = New Test()
		test1.a = textBox1.Text
		
		Dim original As Image = Image.FromFile("e:\test.png")
		test1.b = createThumbnail(original, _
			ListBox1.ClientSize.Width - spacing * 2, _
			MaxItemHeight - spacing * 2)
		
		listBox1.Items.Add(test1)
	End Sub
	
	'確認用
	Sub ListBox1SelectedIndexChanged(sender As Object, e As EventArgs)
		Dim test As Test = listBox1.SelectedItem
	End Sub
	
	Sub ListBox1DrawItem(sender As Object, e As DrawItemEventArgs)
		If e.Index = -1 Then ' 項目がない場合にも呼び出される
			Return
		End If
		
		e.DrawBackground()
		
		Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Test).b

		' 画像を中央に表示
		e.Graphics.DrawImage(thumbnail, _
			e.Bounds.X + (e.Bounds.Width - thumbnail.Width) \ 2, _
			e.Bounds.Y + (e.Bounds.Height - thumbnail.Height) \ 2)
		e.DrawFocusRectangle()
	End Sub
	
	Sub ListBox1MeasureItem(sender As Object, e As MeasureItemEventArgs)
		Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Image)
		e.ItemHeight = thumbnail.Height + spacing * 2
	End Sub
End Class

引用返信 編集キー/
■60755 / inTopicNo.15)  Re[9]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ Azulean (789回)-(2011/07/17(Sun) 08:44:26)
No60749 (やんまー さん) に返信
> ToStringのオーバーライドが悪いのかと思いとってみたのですが、
> やはり画像にはならず・・・でした。

ToString はあくまで”文字列にする”であり、画像を表示する際に使うものではありません。
もう少し、仕組みを理解するための努力が必要に感じられます。

今のアプローチは 「ListBox が画面に表示するときの処理を横取りして、自分が責任を持って画像を描く」ことだと考えています。
それに必要なイベントに結び付けはできていますか?MeasureItem とか DrawItem とかはきちんと呼び出される状態にできていますか?

まずはそこから確認してください。
引用返信 編集キー/
■60775 / inTopicNo.16)  Re[10]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (61回)-(2011/07/18(Mon) 01:30:46)
Azulean さん

> それに必要なイベントに結び付けはできていますか?MeasureItem とか DrawItem とかはきちんと呼び出される状態にできていますか?
>
> まずはそこから確認してください。


大変失礼いたしました。

DrawModeがnomalのままでした。

申し訳ありません。
引用返信 編集キー/
■60776 / inTopicNo.17)  Re[9]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (62回)-(2011/07/18(Mon) 01:39:25)
おそれいります。あと一歩だと思うのですが・・・

D&Dと組み合わせてみたのですが、上手く動きませんでした。。

何故か
ListBox1.Items.Add(part1) ' 画像の追加 ★★
のところから、
Sub ListBox1DrawItem
に飛んでしまうようです。で、処理はそこで終了してしまい、何も追加されません。
Debug.Print("drop!") の行まで行きません。。

(まずはSub ListBox1MeasureItem に行くはずでは・・・)


どうしてこうなってしまうのか・・・ずっと見比べているのですが、わかりません。。

なにか見落としがあると思うのですが、、、、



----
Public Partial Class MainForm
	Const spacing As Integer = 3 ' 画像の周りのスペース
	Const MaxItemHeight As Integer = 255 ' ItemHeightの最大値
	Dim mouseDownPoint As Point
	
	Public Sub New()
		' The Me.InitializeComponent call is required for Windows Forms designer support.
		Me.InitializeComponent()
		pictureBox1.Load("cube001_a.gif")
	End Sub
	
	<DebuggerDisplay("txtの内容は「{txt}」です")> _
	Class Parts
		public txt As String
		public icon As Image
		Public Overrides Function ToString() As String
            Return txt
        End Function
	End Class

	
	' 幅w、高さh内に収まるようなImageオブジェクトを作成
	Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
		Dim fw As Double = CDbl(w) / CDbl(image.Width)
		Dim fh As Double = CDbl(h) / CDbl(image.Height)	
		Dim scale As Double = Math.Min(fw, fh)
		Dim nw As Integer = CInt(image.Width * scale /2)
		Dim nh As Integer = CInt(image.Height * scale /2)	
		Return New Bitmap(image, nw, nh)
	End Function

	
	Sub ListBox1DragEnter(sender As Object, e As DragEventArgs)
		If e.Data.GetDataPresent(GetType(PictureBox)) Then
			e.Effect = DragDropEffects.Copy
			Debug.Print("enter")
		Else
			'picturebox型でなければ受け入れない
			e.Effect = DragDropEffects.None
			Debug.Print("NG")
		End If
	End Sub

	
	Sub ListBox1DragDrop(sender As Object, e As DragEventArgs)
		Debug.Print("drop IN")
		'ドロップされたデータがPictureBox型か調べる
		If e.Data.GetDataPresent(GetType(PictureBox)) Then
			Debug.Print("drop IN 1")
			Dim part1 As Parts = New Parts()
			
			Dim target As ListBox = CType(sender, ListBox)
			Dim pic As PictureBox = _
			    DirectCast(e.Data.GetData(GetType(PictureBox)), PictureBox)
			'ドロップされたデータをリストボックスに追加する
			Dim original As Image = pic.image
			Debug.Print("test " & pic.ImageLocation)
			Debug.Print("drop IN 2")
			part1.icon = createThumbnail(original, _
				ListBox1.ClientSize.Width - spacing * 2, _
				MaxItemHeight - spacing * 2)
			Debug.Print("drop IN 3")	
			ListBox1.Items.Add(part1) ' 画像の追加 ★★
			Debug.Print("drop!")
		End If
	End Sub
	
	
	Sub PictureBox1MouseDown(sender As Object, e As MouseEventArgs)
		'マウスの左ボタンだけが押されている時のみドラッグできるようにする
		If e.Button = MouseButtons.Left Then
			'ドラッグの準備
			Dim pic As PictureBox = DirectCast(sender, PictureBox)
			'マウスの押された位置を記憶
			mouseDownPoint = New Point(e.X, e.Y)
		Else
			mouseDownPoint = Point.Empty
		End If		
	End Sub

	
	Sub PictureBox1MouseMove(sender As Object, e As MouseEventArgs)
		If mouseDownPoint <> Point.Empty Then
			'ドラッグとしないマウスの移動範囲を取得する
			Dim moveRect As New Rectangle(mouseDownPoint.X - SystemInformation.DragSize.Width / 2, mouseDownPoint.Y - SystemInformation.DragSize.Height / 2, SystemInformation.DragSize.Width, SystemInformation.DragSize.Height)
			'ドラッグとする移動範囲を超えたか調べる
			If Not moveRect.Contains(e.X, e.Y) Then
				'ドラッグの準備
				Dim pic As PictureBox = DirectCast(sender, PictureBox)
				'ドラッグ&ドロップ処理を開始する
				Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox1, DragDropEffects.Copy)
				mouseDownPoint = Point.Empty
			End If
		End If		
	End Sub

	
	Sub ListBox1MeasureItem(sender As Object, e As MeasureItemEventArgs)
		Debug.Print("MeasureItem")
		Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Parts).icon
		e.ItemHeight = thumbnail.Height + spacing * 2
	End Sub

	
	Sub ListBox1DrawItem(sender As Object, e As DrawItemEventArgs)
		Debug.Print("DrawItem")
		If e.Index = -1 Then ' 項目がない場合にも呼び出される
			Return
		End If
		e.DrawBackground()
		Dim thumbnail As Image = CType(ListBox1.Items(e.Index), Parts).icon
		' 画像を中央に表示
		e.Graphics.DrawImage(thumbnail, _
			e.Bounds.X + (e.Bounds.Width - thumbnail.Width) \ 2, _
			e.Bounds.Y + (e.Bounds.Height - thumbnail.Height) \ 2)
		e.DrawFocusRectangle()		
	End Sub
End Class

引用返信 編集キー/
■60778 / inTopicNo.18)  Re[10]: ListBoxにクラスを追加した際の表示のカスタマイズ?
□投稿者/ やんまー (63回)-(2011/07/18(Mon) 12:20:39)
2011/07/18(Mon) 23:12:17 編集(投稿者)

原因がわかりました。

インスタンスのtxtに値を設定していないせいでした。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -