2008-09-09 6 views
7

Al utilizar 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 personalizado que es aplicado por el control mismo para elementos no dibujados a medida.Win32 List-View Control Subítem de control para SubItems dibujados a medida?

¿Hay alguna manera de recuperar programáticamente este valor de relleno? ¿Es relacionado con el ancho de un carácter 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 ...?

EDIT: Para aclarar, Quiero añadir el mismo relleno para mis Subelementos NM_CUSTOMDRAWn que el control se suma a los elementos que él formuladas, y la métrica que estoy buscando, por ejemplo, es el espacio en blanco entre el comienzo de la segunda columna y la palabra "siameses" en la siguiente captura de pantalla (Nota: captura de pantalla de MSDN añadido para ayudar a explicar mi pregunta):

List View in Report View

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

+0

¿Alguna vez encontró la respuesta? Estoy encontrando el mismo problema. –

Respuesta

0

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

+0

SM_CXEDGE y SM_CYEDGE son los anchos del borde de la ventana. Estoy buscando el relleno interno inicial y posterior en cada celda de la tabla en un control ListView que está en el modo "Vista de informe". ¿O me estoy perdiendo algo? –

0

Solo se puede adivinar sin ver su salida.

Algunas sugerencias: Si está utilizando la función DrawTextEx, ¿ha experimentado con DT_INTERNAL et al?

¿Está colocando accidentalmente una imagen/icono en blanco?

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

tardía después de editar el primer comentario:

Me pregunto si el tamaño del rectángulo que coincide con el espacio necesario para el cuadro de edición LVN_ENDLABELEDIT alrededor del texto para que el texto no se mueve (o para un rectángulo de selección)?

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

+0

Si dibuja un Subtema Vista de Lista (NM_CUSTOMDRAW), obtiene una estructura NMLVCUSTOMDRAW que contiene un DC y un delimitador que es el espacio completo de "celda de tabla" de piso a techo y de pared a pared. Quiero saber qué relleno aplicar en mi método de sorteo personalizado así que mi contenido es –

+0

He usado NM_CUSTOMDRAW, pero solo para cambiar los colores de fondo de las celdas individuales (CDDS_ITEMPREPAINT), y dejar que caiga a LVN_GETDISPINFO en el proceso principal. –

1

ListView_GetSubItemRect (LVM_GETSUBITEMTECT)

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

A pesar de lo que dice la documentación Sospecho LVIR_LABEL devuelve sólo los rendimientos del rectángulo delimitador del elemento de texto, como por 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 Comentario 2:

Imagino que has visto NMLVCUSTOMDRAW el que si usted está dispuesto a utilizar 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.

+0

Desafortunadamente no. Fue fácil de probar, y el valor devuelto por LVIR_BOUNDS y LVIR_LABEL es idéntico: ambos devuelven todo el subelemento, de pared a pared. –

+0

Entonces, la documentación es correcta, lo que hace que parezca que Win32 tiene un error. Que dolor. –

2

uso ListView mensaje de cabecera HDM_GETBITMAPMARGIN ver link text

1

el camino para hacer esto es recuperar el formato de la columna correspondiente con ListView_GetColumn() continuación, active la myLVCOLUMN.mask recuperado

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

entonces 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); 
Cuestiones relacionadas