Por que o método drawItem do meu proprietário desenho ListBox não pode ser chamado
-
25-09-2019 - |
Pergunta
Eu tento escrever uma caixa de listagem de desenho do proprietário com WTL. Meu código se parece com isso
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)
{
...
Eu também adicionei REFLECT_NOTIFICATIONS
no loop de mensagens dos pais, e o Definir Proprietário Desenho para Corrigido na Folha de Propriedade. Mas ainda não consigo receber a mensagem. Então eu usei o SPY ++ para examinar a mensagem que a caixa de listagem recebe, encontrei alguma mensagem que é muito estranha (WM_USER+7211
).
Meu sistema operacional é WinXP e use o VS2008.
Solução
- BS_OWNERDRAW? Esse é um estilo de botão.
- Mesmo com lbs_ownerdrawfixed, você ainda precisa lidar com WM_MEASEDIDE.
- Alguns estilos de controle (como) lbs_ownerdrawfixed podem só Seja definido quando o controle for criado (é isso que você quer dizer com "e definir o proprietário de desenho para corrigir na folha de propriedades"?, se sim, por que modificar o estilo no código?)
Este tópico do fórum Também pode ser útil ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow