none
imageListのSizeの変更 RRS feed

  • 質問

  • windows 7 64bitで visual studio 11を使っています。

    開発言語visual C#でWindowsアプリケーションを作っています。

    まだまだ勉強中ですがよろしくお願いいたします。

     

    listViewのアイコン画像のサイズを動的に変えたいと思っています。しかし。imageListは画像を入れた後Sizeを変えると消えてしまいます。そのたびに毎回画像を挿入するのも時間がかかります。

    検索して見つけた http://dobon.net/vb/bbs/log3-5/2574.html の記述によればimageListを2つ準備して挿げ替えれば可能という書き込みがあったのですが、実際どのように記述しているのかわかりません。

    2つ準備していてもサイズを変えれば消えてしまいますし、消えた方に画像を入れても時間がかかるので連続的にサイズ変更ができませんので、どうやっているのでしょうか。

    アドバイスをよろしくお願いいたします。

    2012年1月25日 16:59

回答

  • そのサイトの質問者は 120x90 と 40x30 のイメージを切り替えたいということなので、回答者は二つのイメージリストと提案したのでしょう。

    二種類のサイズのイメージリストを作っておいて、リストビューに割り当てなおせばいいんじゃないですかね。

    段階的に切り替えたければその分だけイメージリストを用意しておく・・・のかな。

                ImageList largeImageList = new ImageList();
                largeImageList.ImageSize = new Size(120, 90);
    
                ImageList smallImageList = new ImageList();
                smallImageList.ImageSize = new Size(40, 30);
    
                listView1.LargeImageList = largeImageList;
    
                listView1.LargeImageList = smallImageList;
    
    


    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月26日 0:54
  • 色々な方法で実現してるのと思いますが、複数のスレッドを使ってやっているのかもしれませんね。

    表示する画像を別スレッドで読み込みつつ GUI のスレッドで項目を並べていき、読み込みが完了した画像から順次描画していくというふうに。

    見当違いだったらごめんなさい。

    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月26日 16:17
  • 考え方だけなこういうのもあるよと言う話を。

    私はWin7を使っていないので変更時のインターフェイスがどうなっているのか良くわかりませんけれど、
    例えば、サイズを指定している最中にサイズを変えて表示している見本みたいなアイコンがあって、
    変更中はそのアイコンだけのサイズが変わっているとすると
    変更中は元の画像の拡大・縮小で対処をしておいてサイズが確定した段階でそのイメージリストを作成して
    挿げ替えとかと言うのは何とか出来そうな気がします。

    表示中のImageListと差し替え用のImageListの二つがあれば処理可能ですし、
    アイコンサイズを確定するまでは元のImageListが表示されているので問題なし。
    サイズ確定後、新たなサイズで作成したImageListを表示対象に設定して
    元のImageListは次の挿げ替え用に裏で控えていると言う感じです。

    実際には思ったほどうまくいくか解りませんけれど、チャレンジしてみるのも手かなと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 編集済み PATIO 2012年1月27日 5:34
    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月27日 5:32

すべての返信

  • そのサイトの質問者は 120x90 と 40x30 のイメージを切り替えたいということなので、回答者は二つのイメージリストと提案したのでしょう。

    二種類のサイズのイメージリストを作っておいて、リストビューに割り当てなおせばいいんじゃないですかね。

    段階的に切り替えたければその分だけイメージリストを用意しておく・・・のかな。

                ImageList largeImageList = new ImageList();
                largeImageList.ImageSize = new Size(120, 90);
    
                ImageList smallImageList = new ImageList();
                smallImageList.ImageSize = new Size(40, 30);
    
                listView1.LargeImageList = largeImageList;
    
                listView1.LargeImageList = smallImageList;
    
    


    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月26日 0:54
  • 回答ありがとうございます。

    なるほど、サイズが2つだけなら予め2つ用意しておけばよいですね。

    ですが、例えばwindows 7はエクスプローラで小アイコンから特大アイコンまでほぼ連続的に大きさが変えられますけど、同じようなことを実現することは難しいのでしょうか。windows7の場合サムネイルはthumbcacheというdbファイルに保存されていると思いますが4種類しかありませんし。

    itunesにも大きさを連続的に変えられるバーがあり、スライドさせサイズを変えると、変更中はボケるけど変え終わったらクリアなイメージが現れるという感じで実装されています。

    一般的に使われているアルゴリズム(?)は無いのでしょうか?

    2012年1月26日 10:53
  • 色々な方法で実現してるのと思いますが、複数のスレッドを使ってやっているのかもしれませんね。

    表示する画像を別スレッドで読み込みつつ GUI のスレッドで項目を並べていき、読み込みが完了した画像から順次描画していくというふうに。

    見当違いだったらごめんなさい。

    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月26日 16:17
  • 一般的に使われているアルゴリズム(?)は無いのでしょうか?

    Windows 7 のエクスプローラーは ListView を使っておらず、独自のコントロールとして実現していると考えられます。
    (Spy++ から。同じの見解を示す海外のスレッドもある)

    コモンコントロールとして同じ方法が提供されているわけではないとみておいた方がよいでしょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2012年1月26日 22:56
    モデレータ
  • 考え方だけなこういうのもあるよと言う話を。

    私はWin7を使っていないので変更時のインターフェイスがどうなっているのか良くわかりませんけれど、
    例えば、サイズを指定している最中にサイズを変えて表示している見本みたいなアイコンがあって、
    変更中はそのアイコンだけのサイズが変わっているとすると
    変更中は元の画像の拡大・縮小で対処をしておいてサイズが確定した段階でそのイメージリストを作成して
    挿げ替えとかと言うのは何とか出来そうな気がします。

    表示中のImageListと差し替え用のImageListの二つがあれば処理可能ですし、
    アイコンサイズを確定するまでは元のImageListが表示されているので問題なし。
    サイズ確定後、新たなサイズで作成したImageListを表示対象に設定して
    元のImageListは次の挿げ替え用に裏で控えていると言う感じです。

    実際には思ったほどうまくいくか解りませんけれど、チャレンジしてみるのも手かなと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 編集済み PATIO 2012年1月27日 5:34
    • 回答としてマーク millionx 2012年1月27日 15:01
    2012年1月27日 5:32
  • 回答ありがとうございます。

    なるほど、試してみたいと思います。

    2012年1月27日 6:22
  • 回答ありがとうございます。

    別スレッドですね。最近、ようやくバックグラウンドワーカーの使い方がわかったような感じなので試してみたいと思います。

    2012年1月27日 6:23