2010-08-04 3 views
0

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.

+0

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. –

Répondre

1
  • BS_OWNERDRAW? C'est un style de bouton.
  • Même avec LBS_OWNERDRAWFIXED, vous devez toujours gérer WM_MEASUREITEM.
  • Certains styles de contrôle (comme) LBS_OWNERDRAWFIXED peuvent seulement être défini lorsque le contrôle est créé (Est-ce que vous entendez par "et définir propriétaire dessiner à fixe dans la feuille de propriétés"? Si oui, pourquoi modifier le style dans le code ?)

This forum thread pourrait également aider ...

Questions connexes