元の質問 (以下の更新を参照)
クリックしてハイライトしたり、ダブルクリックしてアクションを実行したりできる大きなアイコン (実際には 128x128 以上のサムネイル) を備えた適切なスクロール可能なアイコン コントロールが必要な WinForms プログラムがあります。無駄なスペースを最小限に抑えることが望ましいです (各アイコンの下に短いファイル名のキャプションが必要になる場合があります。ファイル名が長すぎる場合は、省略記号を追加できます)。
(出典: updike.org )
ListView を LargeIcon (デフォルト .View) で使用してみましたが、結果は期待外れです:
(出典: 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++;
}
恥ずかしいほど小さなアイコンがある大きな空きスペースではなく、空きスペースがほとんどない大きなアイコンが必要です。
- 必要なことを行う .NET コントロールはありますか?
- これを行うお気に入りのサードパーティ製コントロールはありますか?
- そうでない場合、どのコントロールを継承して微調整して機能させるのが最適ですか?
- 分解してカスタムコントロールを作成する必要があります(私は十分な経験があります...それは多少関与しているため、極端に行きたくないだけです)。
OwnerDraw に関するこのチュートリアルを見つけましたが、そのデモは詳細ビューの行にスパイスを加える方法を示しているだけなので、基本的には上記の 3 または 4 に相当します。
アップデート
行の追加
ilist.ImageSize = new Size(128, 128);
for ループがサイズの問題を修正する前に、画像が 24bpp System.Drawing.Bitmap として ImageList に挿入されていることをデバッガーが示していても、画像は 8 ビットにパレット化されています (システム カラーのように見えますか?)。
(出典: updike.org )
- 画像をフル 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();
}