winapi listview custom-draw

winapi - Win32 List-View Control Subítem de control para SubItems dibujados a medida?



listview custom-draw (5)

Al usar el dibujo personalizado (NM_CUSTOMDRAW) para dibujar todo el contenido de un SubElemento de ListView (en la vista Informe / Detalles), sería bueno poder aplicar el mismo relleno izquierdo y derecho en mi método de pintura personalizada que aplica el se controla solo para elementos no dibujados a medida.

¿Hay alguna manera de recuperar programáticamente este valor de relleno? ¿Está relacionado con el ancho de un personaje en particular ("" o "w" o algo así?) O es un valor fijo (6px a la izquierda y 3px a la derecha o algo así) o ...?

EDITAR: Para aclarar, quiero agregar el mismo relleno a mis Sub artículos NM_CUSTOMDRAWn que el control agrega a los elementos que dibuja , y la métrica que estoy buscando, por ejemplo, es el espacio en blanco entre el comienzo de la 2da columna y la palabra "Siamés" en la siguiente captura de pantalla ( Nota: se agregó una captura de pantalla de MSDN para ayudar a explicar mi pregunta ):

Tenga en cuenta que la palabra "Siamés" está alineada con el elemento del encabezado ("Raza"). Me gustaría poder garantizar la misma alineación para artículos personalizados.


Supongo que GetSystemMetrics () es lo que necesita mirar. Creo que SM_CXEDGE y SM_CYEDGE son probablemente los valores que desea, pero no me cite sobre eso. ;-)


Solo puedo adivinar sin ver tu salida.

Algunas sugerencias: si está utilizando la función DrawTextEx, ¿ha experimentado con DT_INTERNAL y otros?

¿Estás poniendo accidentalmente una imagen / icono en blanco?

¿Se ve bien en el modo de pantalla clásico? Si es así, miraría las funciones del Tema XP para ver si algo está sucediendo.

Edición tardía después del primer comentario:

Me pregunto si el tamaño del rectángulo coincide con el espacio requerido para el cuadro de edición LVN_ENDLABELEDIT alrededor del texto para que el texto no se mueva (o para un rectángulo de enfoque).

Supongo que puede comparar el resultado de LVM_GETITEMRECT con LVIR_LABEL en la primera columna y usar la diferencia como su borde izquierdo.


ListView_GetSubItemRect (LVM_GETSUBITEMTECT)

http://msdn.microsoft.com/en-us/library/ms930172.aspx

A pesar de lo que dice la documentación, sospecho que LVIR_LABEL solo devuelve el rectángulo delimitador del texto del elemento, según ListView_GetItemRect.

(Esto solo me molestaba porque pensé que había visto una respuesta en algún lugar cuando jugaba con NM_CUSTOMDRAW).

Editar después del comentario 2:

Me imagino que has visto NMLVCUSTOMDRAW, que si estás dispuesto a usar la Versión 6.0. tiene rcText. No lo haría desde que uso Win2K.

Dado lo que ha encontrado, volvería a la sugerencia de usar ListView_GetItemRect para obtener LVIR_LABEL y compararlo con LVIR_BOUNDS y usar la diferencia.


use el mensaje del encabezado ListView HDM_GETBITMAPMARGIN vea el texto del enlace


la forma de hacerlo es recuperar el formato de la columna correspondiente con ListView_GetColumn () y luego verificar myLVCOLUMN.mask recuperado

LVCOLUMN myLVCOLUMN; myLVCOLUMN.mask=LVCF_FMT; ListView_GetColumn(hwnd,nCol,&myLVCOLUMN);

luego cuando dibujamos la etiqueta correspondiente que pertenece a esa columna

if(myLVCOLUMN.fmt & LVCFMT_CENTER) DrawText(x,x,x,x, DT_CENTER | DT_WORD_ELLIPSIS ); else if (myLVCOLUMN.fmt & LVCFMT_RIGHT) DrawText(x,x,x,x, DT_RIGHT | DT_WORD_ELLIPSIS ); else DrawText(x,x,x,x, DT_LEFT | DT_WORD_ELLIPSIS );