¿Por qué mi cuadro combinado dibujado por el propietario se muestra vacío?
-
11-09-2019 - |
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?
Solución
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?
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.