Pourquoi la méthode DrawItem de mon tirage propriétaire listbox ne peut pas être appelé
-
25-09-2019 - |
Question
J'essaie d'écrire un propriétaire dessiner avec listbox WTL. Mon code ressemble à ceci
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 le message. Ensuite, je espion ++ pour examiner le message que le listbox recevoir, j'ai trouvé un certain message qui est très étrange (WM_USER+7211
).
Mon os est VS2008 WinXp et à utiliser.
La solution
- 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 peut uniquement être réglé lorsque le contrôle est créé (Est-ce que vous entendez par « et définissez le propriétaire Dessinez Fixe dans la feuille de propriétés » ?, si pourquoi, modifier le style dans le code?)
Ce fil de discussion pourrait également aider ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow