Pregunta

Estoy subclasificación de un cuadro combinado WTL y estoy propietario de dibujo los elementos de la lista desplegable. El control tiene el CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE atributos y estoy usando la mezcla en COwnerDraw clase para implementar DrawItem () y MeasureItem (). Cuando la lista desplegable está abajo, los elementos se dibujan correctamente. Sin embargo, cuando la lista desplegable se ha terminado, el control de cuadro combinado está vacío y el artículo no se dibuja. ¿Qué estoy haciendo mal?

La clase WTL es el siguiente:

class CMyComboBox :
   public CWindowImpl<CMyComboBox, CComboBox>,
   public COwnerDraw<CMyComboBox>
{
public:
   BEGIN_MSG_MAP_EX(CMyComboBox)
      CHAIN_MSG_MAP(COwnerDraw<CMyComboBox>)
      CHAIN_MSG_MAP_ALT(COwnerDraw<CMyComboBox>, 1)
   END_MSG_MAP()

   void DrawItem(LPDRAWITEMSTRUCT lpDIS)
   {
      CDCHandle dc = lpDIS->hDC;
      dc.FillSolidRect(&lpDIS->rcItem, lpDIS->itemID == 0 ?
         RGB(255,0,0) : RGB(0,255,0));
   }

   void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
   {
      lpMeasureItemStruct->itemWidth = 12;
      lpMeasureItemStruct->itemHeight = 12;
   }
};

La clase se utiliza en un cuadro de diálogo y es una subclase de esta manera:

   m_cbMy.SubclassWindow(GetDlgItem(IDC_COMBO1));
   m_cbMy.AddString(_T("Item 1"));
   m_cbMy.AddString(_T("Item 2"));

Cambio de los atributos de control a CBS_OWNERDRAWFIXED no cambia nada.


Editar: Gracias a la ayuda de najmeddine me di cuenta de que tengo que manejar WM_PAINT para dibujar el cuadro combinado real, y no sólo los elementos de la lista desplegable. Lamentablemente ahora tengo que también dibujar el control cuadro combinado todo por mí mismo. ¿Hay una manera de dejar el IDG dibujar el borde y soltar la flecha de manera que sólo tengo que sacar las "entrañas" del control?

¿Fue útil?

Solución

(. + En XP - no decir lo que las versiones de Windows que necesita para apoyar)

Para dibujar el control de cuadro combinado se debe utilizar las API temáticos en el controlador WM_PAINT En concreto, utilice DrawThemeBackground , y pasan en uno de los Los valores CB_ para iPartId .

También tendrá que utilizar la API de pintura buffer para manejar las transiciones en Vista, lo que puede complicar el controlador de pintura - este y otros problemas de dibujo para pintar de encargo un control de cuadro combinado son explica aquí en una buena cantidad de detalle. Me gustaría sugerir que el uso de hilo del foro como su referencia principal la aplicación de esta.

Otros consejos

En DrawItem que llenar un rect con un poco de color. Pero ¿dónde está DrawText o algo parecido?

Ejemplo de DrawItem encargo .

Para dibujar el control ComboBox (no la lista), también se debe manejar el mensaje WM_PAINT y hacer su pintura allí.
el evento DrawItem solamente las pinturas de la lista desplegable y es artículos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top