Pergunta

Estou tentando implementar algumas funcionalidades de arrastar e soltar para um sistema de materiais que está sendo desenvolvido em meu trabalho.Parte deste sistema inclui uma 'Biblioteca de Materiais' que funciona como um repositório, dividido em grupos, de materiais salvos no disco rígido do usuário.

Como parte de um aprimoramento da interface do usuário, eu esperava implementar um recurso do tipo 'destaque'.Ao arrastar e soltar, as janelas nas quais você pode soltar legalmente um material mudarão de cor muito sutilmente para melhorar o feedback ao usuário de que esta é uma ação válida.

Estou mudando a barra com 'Materiais Básicos' (apenas um CWnd com CStatic) de um fundo cinza médio quando não destacado para um fundo azul quando você passa o mouse sobre ela.Tudo funciona bem, as mensagens OnDragEnter e OnDragExit parecem robustas e definem um sinalizador indicando o status de destaque.Então no OnCtrlColor eu faço isso:

    if (!m_bHighlighted) {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}

No entanto, como você pode ver na captura de tela, a pintura apresenta “falhas” abaixo do objeto arrastado, deixando o cinza original no lugar.Parece muito feio e basicamente estraga todo o efeito.

Existe alguma maneira de contornar isso?

Foi útil?

Solução 3

Obrigado pelas respostas pessoal, ajryan, vocês parecem sempre ajudar para minhas perguntas, muito obrigado.

Felizmente desta vez a resposta foi bastante direta....

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

Isso desativa o desenho da imagem arrastada e, em seguida, envia uma mensagem para a janela que está sendo inserida para repintar em um estado destacado e, finalmente, redesenha a imagem arrastada por cima.Parece ter funcionado.

Outras dicas

A depuração remota é uma dádiva de Deus para depurar problemas visuais.É difícil configurar, mas ter uma VM pronta para depuração remota certamente valerá a pena.

O que eu gosto de fazer é definir vários pontos de interrupção no tratamento da pintura, bem como no próprio código de pintura da estrutura.Isso permite que você efetivamente "congele o quadro" da pintura sem aborrecê-la, mudando para devenv.Dessa forma, você pode obter a imagem real de quem está pintando em que ordem e onde você tem a chance de quebrar um preenchimento que retifique da maneira que você precisa.

Quase parece que o CStatic não sabe que precisa se repintar, então a cor de fundo do objeto arrastável é deixada para trás.Talvez tente invalidar o CStatic e veja se isso ajuda em alguma coisa?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top