vez ver puedo mis miniaturas miniatura imagenes imagen iconos icono fotos como c# winforms listview .net-2.0 thumbnails

c# - ver - Mostrar iconos en miniatura de 128x128 píxeles o más en una grilla en ListView



ver imagen en icono de video (5)

Descargo de responsabilidad: trabajo para Atalasoft

Hay un control de miniatura de imagen en nuestro SDK de DotImage imágenes .NET, DotImage

Pregunta original (ver la actualización a continuación)

Tengo un programa WinForms que necesita un control de icono desplazable decente con íconos grandes (en realidad, miniaturas de 128x128 o más grandes) en los que se puede hacer clic para aprovechar o hacer doble clic para realizar alguna acción. Preferiblemente, habrá un espacio desperdiciado mínimo (es posible que se necesiten subtítulos cortos para el nombre debajo de cada icono; si el nombre del archivo es demasiado largo, puedo agregar puntos suspensivos).

versión final de la vista de lista con los colores, el espaciado, etc. apropiados http://www.updike.org/images/listview-great.png

Intenté usar un ListView con LargeIcon (por defecto .View) y los resultados son decepcionantes:

captura de pantalla que muestra pequeños iconos en LargeIcon view http://www.updike.org/images/listview-poor.png

¿Tal vez estoy poblando 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 un gran espacio vacío con iconos vergonzosamente pequeños.

  1. ¿Hay un control .NET que haga lo que necesito?
    • ¿Hay un control de terceros favorito que hace esto?
    • Si no, ¿qué control sería mejor heredar y modificar para que funcione?
    • ¿Debería desglosarme y hacer un control personalizado (con el que tengo mucha experiencia ... simplemente no quiero ir a ese extremo ya que eso está algo involucrado).

Encontré este tutorial sobre OwnerDraw pero el trabajo de eso básicamente equivale al número 3 o 4 anterior, ya que esa demostración solo muestra cómo darle vida a las filas en la vista de detalles.

Actualizar

Agregar la línea

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

antes de que el bucle for haya solucionado el problema de tamaño pero ahora las imágenes tienen una paleta de 8 bits (¿se parecen a los colores del sistema?) aunque el depurador muestra que las imágenes se insertan en ImageList como 24bpp System.Drawing.Bitmap''s:

iconos grandes, finalmente http://www.updike.org/images/listview-poor2.png

  1. ¿Cómo puedo (¿puedo?) Hacer que las imágenes se muestren en color de 24 bits completo?
    • El espacio entre los íconos sigue siendo un desperdicio ... ¿Cómo lo arreglo? ¿Puedo?

Actualización 2

Junto con agregar la línea

ilist.ColorDepth = ColorDepth.Depth24Bit;

Luego de configurar ilist.ImageSize, seguí el consejo del árbitro y cambié el espacio:

[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 puede no ser perfecto o tener los valores predeterminados que esperaba (como una propiedad de espaciado) pero me alegro de poder domesticarlo, al final:

texto alternativo http://www.updike.org/images/listview-great.png

Por cierto, para mantener la relación de aspecto adecuada para las miniaturas, tuve que hacer mis propios mapas de bits de 128x128, borrar el fondo para que coincida con el control y centrar esas 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(); }


Hacer un control personalizado no sería tan malo. Yo heredaría de Panel o Usercontrol ya que creo que ambos agregan automáticamente barras de desplazamiento para el contenido.

Agregue contenedores dinámicamente (como PictureBoxes) y leyendas para cada imagen, maneje el evento mousedown o mouseclick para el contenedor y tal vez dibuje un cuadrado rojo a su alrededor para mostrar que está seleccionado. La parte "más difícil" sería remuestrear la imagen a 128x128 si aún no tienen ese tamaño e incluso eso puede ser fácilmente con GDI +.


Para la actualización:

  1. Establezca la profundidad de color de la lista de imágenes además del tamaño de la imagen (ilist.ColorDepth = ColorDepth.Depth24Bit)
  2. WinForms ListView no tiene posibilidad de cambiar el espacio entre iconos, sin embargo, se puede hacer fácilmente usando Win32. LVM_SETICONSPACING enviar LVM_SETICONSPACING a su ListView (hay muchos tutoriales sobre cómo usar la función SendMessage win32 en .net, así que creo que esta dirección debe ser suficiente para usted).

Puede usar el FlowLayoutPanel y colocar cuadros de imagen en él. Configure el cuadro de imagen en un tamaño de 128x128 y el modo de tamaño en "ampliar" (Esto le permite cambiar el tamaño de su imagen sin pérdida de relación de aspecto). Incluso puede agregar programáticamente las cajas de imágenes.

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

Como necesita una etiqueta debajo de la ventana de imágenes, podría crear un Usercontrol como Pastor dijo que todo lo que tiene es una imagen y una etiqueta debajo de ella. Entonces esa sería la instancia de control que agregaría a su panel de flujo de salida.


ObjectListView (un contenedor de código abierto alrededor de .NET ListView) hace que sea fácil dibujar una vista de mosaico personalizada. Eche un vistazo a la vista Compleja en la demostración, cambie a la vista de mosaico cuando el dibujo personalizado esté habilitado: vista de mosaico dibujado por el propietario http://objectlistview.sourceforge.net/cs/_images/tileview-ownerdrawn.png

Si solo deseara una imagen de 128x128 más algunos detalles de texto, ni siquiera necesitaría dibujarla. Podría darle una lista de imágenes grande y luego marcar qué bits de información textual deseaba mostrar en el mosaico, usando IsTileViewColumn.