Pregunta

Estoy intentando implementar alguna funcionalidad de arrastrar y soltar para un sistema de materiales que se está desarrollando en mi trabajo.Parte de este sistema incluye una 'Biblioteca de materiales' que actúa como un depósito, dividido en grupos, de materiales guardados en el disco duro del usuario.

Como parte de un poco de pulido de la interfaz de usuario, esperaba implementar una función de tipo "resaltado".Al arrastrar y soltar, las ventanas en las que puede colocar legalmente un material cambiarán de color muy sutilmente para mejorar la respuesta al usuario de que se trata de una acción válida.

Estoy cambiando la barra con 'Materiales básicos' (solo un CWnd con un CStatic) de tener un fondo gris medio cuando no está resaltado a un fondo azul cuando se coloca el cursor sobre ella.Todo funciona bien, los mensajes OnDragEnter y OnDragExit parecen sólidos y establecen una bandera que indica el estado resaltado.Luego en OnCtrlColor hago esto:

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

Sin embargo, como puedes ver en la captura de pantalla, la pintura 'falla' debajo del objeto arrastrado, dejando el gris original en su lugar.Se ve muy feo y básicamente arruina todo el efecto.

¿Hay alguna manera de solucionar esto?

¿Fue útil?

Solución 3

Gracias por las respuestas chicos, ajryan, parece que siempre me ayudas con mis preguntas, así que muchas gracias.

Afortunadamente esta vez la respuesta fue bastante sencilla....

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

Esto desactiva el dibujo de la imagen arrastrada, luego envía un mensaje a la ventana a la que se ingresa para volver a pintarla en un estado resaltado y finalmente vuelve a dibujar la imagen arrastrada en la parte superior.Parece haber hecho el truco.

Otros consejos

La depuración remota es una bendición para depurar problemas visuales.Es complicado configurarlo, pero tener una máquina virtual lista para la depuración remota seguramente dará sus frutos.

Lo que me gusta hacer es establecer un montón de puntos de interrupción en mi manejo de pintura, así como en el propio código de pintura del marco.Esto le permite "congelar el marco" de manera efectiva la pintura sin estropearla volteándola a devenv.De esta manera, puedes obtener una imagen real de quién está pintando, en qué orden, y dónde tienes la oportunidad de introducir un relleno que se ajuste a tus necesidades.

Casi parece que CStatic no sabe que necesita volver a pintarse, por lo que el color de fondo del objeto que se puede arrastrar queda atrás.¿Quizás intentar invalidar CStatic y ver si eso ayuda en algo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top