Perché il metodo DrawItem del mio padrone pareggio casella di riepilogo non può essere chiamato
-
25-09-2019 - |
Domanda
provo a scrivere una casella di riepilogo proprietario pareggio con WTL. I miei sguardi codice come questo
template<class T, class TBase = CListBox, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyListBoxImpl :
public CWindowImpl< T, TBase, TWinTraits >,
public COwnerDraw< T >
{
...
BEGIN_MSG_MAP(CMyListBoxImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
CHAIN_MSG_MAP(COwnerDraw< T >)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
...
void Init()
{
...
ModifyStyle(0, BS_OWNERDRAW | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
...
}
void DrawItem(LPDRAWITEMSTRUCT lpdis)
{
...
Ho anche aggiunto REFLECT_NOTIFICATIONS
nel ciclo di messaggi del genitore, e impostare Proprietario Draw a fisso in finestra delle proprietà. Ma io ancora non riesco a ricevere il messaggio. Poi ho usato spia ++ per esaminare il messaggio che la casella di riepilogo ricevere, ho trovato qualche messaggio che è molto strano (WM_USER+7211
).
Il mio sistema operativo è WinXP e uso VS2008.
Soluzione
- BS_OWNERDRAW? Questo è uno stile di pulsante.
- Anche con LBS_OWNERDRAWFIXED, è ancora necessario maniglia WM_MEASUREITEM.
- Alcuni stili di controllo (come) LBS_OWNERDRAWFIXED possono solo da impostare quando si crea il controllo (È questo che si intende per "impostare e Proprietario Draw al fisso in lamiera di proprietà" ?, in caso affermativo, perché modificare lo stile in codice?)
Questo thread nel forum potrebbe anche essere di aiuto ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow