Pregunta Original (vea la Actualización de abajo)
Tengo un WinForms programa que necesita un decente desplazable en el icono de control con iconos grandes (128x128 o miniaturas más grandes, en realidad) que se puede hacer clic para hilight o hacer doble clic para realizar alguna acción. Preferiblemente no sería mínimo espacio desperdiciado (nombre de archivo corto títulos podrían ser necesarios por debajo de cada icono; si el nombre de archivo es demasiado largo como puedo agregar un botón de puntos suspensivos).
He intentado utilizar un ListView con LargeIcon (predeterminado .Vista) y los resultados son decepcionantes:
Tal vez estoy rellenando el control incorrectamente? Código:
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++;
}
Necesito iconos grandes con poco espacio vacío, no gran espacio vacío con vergonzosamente iconos pequeños.
- Hay una .RED de control que hace lo que necesito?
- Hay un favorito de control de terceros que hace esto?
- Si no, que el control sería mejor para heredar y ajustar para que funcione?
- Debo romper y hacer un Control personalizado (que tengo un montón de experiencia con... simplemente no quiero ir a ese extremo, ya que es algo que participan).
He encontrado este tutorial acerca de OwnerDraw pero trabajo desde que básicamente equivale a número de 3 o 4 anteriores, ya que la demo solo se muestra cómo darle vida a las filas en la vista de detalles.
Actualización
La adición de la línea de
ilist.ImageSize = new Size(128, 128);
antes de que el bucle for fija el tamaño de la problema, pero ahora las imágenes son de la paleta-izada de 8 bits (se parece a los colores del sistema?) aunque el depurador muestra que las imágenes se insertan en el ImageList como 24bpp Sistema.De dibujo.Mapa de bits:
- ¿Cómo puedo (¿puedo?) que las imágenes se muestran en su totalidad de color de 24 bits?
- El espacio alrededor de los iconos es todavía más derrochador... ¿cómo puedo arreglar eso? Puedo?
Actualización 2
Junto con la adición de la línea de
ilist.ColorDepth = ColorDepth.Depth24Bit;
después de la configuración de la interfaz ilist.ImageSize, he seguido árbitro del consejo y cambiar el espaciado:
[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);
El control ListView no puede ser perfecto o tener los valores predeterminados, me gustaría esperar (como una separación de la propiedad), pero me alegro de que podía domar, en la final:
Por el camino, para mantener la relación de aspecto de las miniaturas, yo tenía que hacer mi propia 128x128 mapas de bits, claro el fondo para que coincida con el de control, y el centro de las imágenes:
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();
}