46

元の質問 (以下の更新を参照)

クリックしてハイライトしたり、ダブルクリックしてアクションを実行したりできる大きなアイコン (実際には 128x128 以上のサムネイル) を備えた適切なスクロール可能なアイコン コントロールが必要な WinForms プログラムがあります。無駄なスペースを最小限に抑えることが望ましいです (各アイコンの下に短いファイル名のキャプションが必要になる場合があります。ファイル名が長すぎる場合は、省略記号を追加できます)。

適切な色、間隔などを備えたリストビューの完成版。
(出典: updike.org )

ListView を LargeIcon (デフォルト .View) で使用してみましたが、結果は期待外れです:

LargeIcon ビューで小さなアイコンを表示しているスクリーンショット
(出典: updike.org )

おそらく私はコントロールを間違って設定していますか? コード:

        ImageList ilist = new ImageList();
        this.listView.LargeImageList = ilist;
        int i = 0;
        foreach (GradorCacheFile gcf in gc.files)
        {
            Bitmap b = gcf.image128;
            ilist.Images.Add(b);
            ListViewItem lvi = new ListViewItem("text");
            lvi.ImageIndex = i;
            this.listView.Items.Add(lvi);
            i++;
        }

恥ずかしいほど小さなアイコンがある大きな空きスペースではなく、空きスペースがほとんどない大きなアイコンが必要です。

  1. 必要なことを行う .NET コントロールはありますか?
    • これを行うお気に入りのサードパーティ製コントロールはありますか?
    • そうでない場合、どのコントロールを継承して微調整して機能させるのが最適ですか?
    • 分解してカスタムコントロールを作成する必要があります(私は十分な経験があります...それは多少関与しているため、極端に行きたくないだけです)。

OwnerDraw に関するこのチュートリアルを見つけましたが、そのデモは詳細ビューの行にスパイスを加える方法を示しているだけなので、基本的には上記の 3 または 4 に相当します。

アップデート

行の追加

ilist.ImageSize = new Size(128, 128);

for ループがサイズの問題を修正する前に、画像が 24bpp System.Drawing.Bitmap として ImageList に挿入されていることをデバッガーが示していても、画像は 8 ビットにパレット化されています (システム カラーのように見えますか?)。

大きなアイコン、ついに
(出典: updike.org )

  1. 画像をフル 24 ビット カラーで表示するにはどうすればよいですか (できますか?)。
    • アイコンの周りのスペースはまだかなり無駄です...どうすれば修正できますか? できますか?

更新 2

行を追加するとともに

ilist.ColorDepth = ColorDepth.Depth24Bit;

次に、ilist.ImageSize を設定した後、アービターのアドバイスに従い、間隔を変更しました。

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public int MakeLong(short lowPart, short highPart)
{
    return (int)(((ushort)lowPart) | (uint)(highPart << 16));
}

public void ListView_SetSpacing(ListView listview, short cx, short cy)
{
    const int LVM_FIRST = 0x1000;
    const int LVM_SETICONSPACING = LVM_FIRST + 53;
    // http://msdn.microsoft.com/en-us/library/bb761176(VS.85).aspx
    // minimum spacing = 4
    SendMessage(listview.Handle, LVM_SETICONSPACING,
    IntPtr.Zero, (IntPtr)MakeLong(cx, cy));

    // http://msdn.microsoft.com/en-us/library/bb775085(VS.85).aspx
    // DOESN'T WORK!
    // can't find ListView_SetIconSpacing in dll comctl32.dll
    //ListView_SetIconSpacing(listView.Handle, 5, 5);
}

///////////////////////////////////////////////////////////

ListView_SetSpacing(this.listView, 128 + 12, 128 + 4 + 20);

ListView コントロールは完璧ではないか、期待どおりのデフォルト (Spacing プロパティなど) になっている可能性がありますが、最終的にはそれを飼いならすことができてうれしいです:

代替テキスト
(出典: updike.org )

ところで、サムネイルの適切な縦横比を維持するために、独自の 128x128 ビットマップを作成し、コントロールに合わせて背景をクリアし、それらの画像を中央に配置する必要がありました。

public void CenterDrawImage(Bitmap target, Color background, Bitmap centerme)
{
    Graphics g = Graphics.FromImage(target);
    g.Clear(background);
    int x = (target.Width - centerme.Width) / 2;
    int y = (target.Height - centerme.Height) / 2;
    g.DrawImage(centerme, x, y);
    g.Dispose();
}
4

5 に答える 5

14

更新の場合:

  1. 画像サイズに加えて、画像リストの色深度を設定します (ilist.ColorDepth = ColorDepth.Depth24Bit)
  2. WinForms ListView にはアイコンの間隔を変更する機能はありませんが、Win32 を使用すると簡単に変更できます。LVM_SETICONSPACINGを ListViewに送信する必要があります (.net で SendMessage win32 関数を使用する方法に関するチュートリアルはたくさんあるので、この方向で十分だと思います)。
于 2009-07-09T08:40:58.030 に答える
5

FlowLayoutPanel を使用して、そこにピクチャボックスをドロップできます。ピクチャボックスを 128x128 のサイズに設定し、sizemode を 'zoom' に設定します (これにより、アスペクト比を失うことなく画像のサイズを変更できます)。プログラムでピクチャボックスを追加することもできます。

PictureBox pb = New Picturebox;
 pb.image = gcf.image128;
 FlowLayoutPanel1.Controls.Add(pb)

ピクチャボックスの下にラベルが必要なので、Pastor が言ったように、ピクチャボックスとその下のラベルしかないというユーザーコントロールを作成できます。それが、flowlayoutpanel に追加するコントロール インスタンスになります。

于 2009-07-09T00:19:18.517 に答える
5

ObjectListView (.NET ListView のオープン ソース ラッパー) を使用すると、Tile ビューを簡単にカスタム描画できます。デモの複雑なビューを見て、カスタム描画が有効になっているときにタイル ビューに切り替えます: (ソース: sourceforge.net )所有者が描いたタイル ビュー

128x128 の画像とテキストの詳細だけが必要な場合は、所有者が描画する必要さえありません。大きな画像リストを指定してから、IsTileViewColumn を使用して、タイルに表示するテキスト情報のビットをマークすることができます。

于 2009-07-13T09:07:40.477 に答える
2

免責事項: 私はアタラソフトで働いています

当社の .NET Imaging SDK であるDotImageには、画像サムネイル コントロールがあります。

于 2009-07-09T00:23:50.093 に答える
1

カスタム コントロールを作成することも悪くありません。どちらもコンテンツのスクロールバーを自動的に追加すると思うので、Panel または Usercontrol から継承します。

コンテナー (PictureBoxes など) と各画像のキャプションを動的に追加し、コンテナーの mousedown または mouseclick イベントを処理し、選択されていることを示すためにコンテナーの周りに赤い四角を描画します。「最も難しい」部分は、画像がまだそのサイズになっていない場合、画像を 128x128 にリサンプリングすることです。

于 2009-07-09T00:03:16.037 に答える