34 votos

Visualización de píxeles de la miniatura iconos 128 x 128 o mayor en una cuadrícula en ListView

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).

finished version of listview with proper colors, spacing, etc.

He intentado utilizar un ListView con LargeIcon (predeterminado .Vista) y los resultados son decepcionantes:

screenshot showing tiny icons in LargeIcon view

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.

  1. Hay una .RED de control que hace lo que necesito?
  2. Hay un favorito de control de terceros que hace esto?
  3. Si no, que el control sería mejor para heredar y ajustar para que funcione?
  4. 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:

large icons, finally

  1. ¿Cómo puedo (¿puedo?) que las imágenes se muestran en su totalidad de color de 24 bits?
  2. 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:

alt text

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();
}

9voto

arbiter Puntos 5503

Para actualizar:

  1. Imagen de conjunto de la lista de profundidad de color, además del tamaño de la imagen (ilist.La Profundidad De Color = Profundidad De Color.Depth24Bit)
  2. WinForms ListView no tiene posibilidad de cambiar el espacio entre iconos, sin embargo se puede hacer uso de Win32. Usted necesita para enviar LVM_SETICONSPACING a su ListView (hay un montón de tutoriales de cómo usar SendMessage función de win32 .net, así que creo que esta dirección debe ser suficiente para usted).

5voto

jvanderh Puntos 1845

Usted puede utilizar los controles flowlayoutpanel y soltar pictureboxes en ella. Establecer el cuadro de imagen a un tamaño de 128x128 y la sizemode a 'zoom' (Esto se ocupa de cambiar el tamaño de la imagen sin pérdida de la relación de aspecto). Usted puede incluso agregar mediante programación el picturebox.

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

Dado que usted necesita para tener una etiqueta bajo el control picturebox, podría crear un control de usuario al igual que el Pastor dijo que todo lo que tiene es un picturebox y una etiqueta debajo de él. A continuación, que sería la instancia de control que debería añadir a sus controles flowlayoutpanel.

3voto

Grammarian Puntos 4085

ObjectListView (open source envoltura alrededor de una .NET ListView) facilita la costumbre de sacar una ficha de la vista. Tener una mirada en el Complejo de ver en la demo, cambie a la vista en Mosaico cuando costumbre de sacar está habilitado: owner drawn tile view

Si sólo quería un 128x128 imagen, además de algunos detalles de texto, usted ni siquiera necesita de dibujo. Usted podría dar un gran imagelist y, a continuación, marca que los bits de información textual que quería mostrar en la ventana, utilizando IsTileViewColumn.

2voto

Lou Franco Puntos 48823

Descargo de responsabilidad: trabajar para Atalasoft

Hay un control miniatura de imagen en nuestro SDK .NET Imaging, DotImage

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: