J'essaie d'écrire une liste déroulante owner draw avec WTL. Mon code ressemble à ceciPourquoi la méthode DrawItem de ma liste de propriétés owner draw ne peut pas être appelée
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)
{
...
J'ai aussi ajouté REFLECT_NOTIFICATIONS
dans la boucle de message du parent et mis propriétaire à tirage fixe en feuille de propriétés. Mais je ne peux toujours pas recevoir le message. Puis j'ai utilisé spy ++ pour examiner le message que la boîte de réception reçoit, j'ai trouvé un message qui est très étrange (WM_USER+7211
).
Mon OS est WinXp et utilise VS2008.
ModifyStyle est trop tard, le drapeau doit allumé lorsque la fenêtre est créée. Je ne sais pas comment cela se fait dans WTL. –