2008-09-16 10 views
0

J'essaie d'implémenter des fonctionnalités de glisser-déposer pour un système matériel développé dans mon travail. Une partie de ce système comprend une «bibliothèque de matériaux» qui sert de référentiel, divisé en groupes, de matériaux enregistrés sur le disque dur de l'utilisateur.Comment réparer un Glitch de peinture MFC?

Dans le cadre de certains vernis d'interface utilisateur, j'espérais implémenter une fonctionnalité de type 'highlight'. Lorsque vous faites glisser et déposer, les fenêtres sur lesquelles vous pouvez légalement déposer un matériau changeront très subtilement de couleur pour améliorer le retour à l'utilisateur qu'il s'agit d'une action valide.

Je suis en train de changer la barre avec 'Basic Materials' (juste un CWnd avec un CStatic) d'avoir un arrière-plan gris moyen lorsqu'il n'est pas surligné sur un arrière-plan bleu lorsque survolé. Tout fonctionne bien, les messages OnDragEnter et OnDragExit semblent robustes et définissent un drapeau indiquant l'état de surbrillance. Puis, en OnCtrlColor je fais ceci:

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

Cependant, comme vous pouvez le voir dans la capture d'écran, le tableau « » glitches sous l'objet traîné, laissant le gris d'origine en place. Il a l'air vraiment moche et gâche tout l'effet.

Y at-il un moyen de contourner ce problème?

Répondre

0

Merci pour les réponses les gars, ajryan, vous semblez toujours venir avec de l'aide pour mes questions, donc merci supplémentaire.

Heureusement cette fois, la réponse était assez simple ....

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

Cela désactive le dessin de l'image traîné, puis envoie un message à la fenêtre en cours de saisie de repeindre dans un état en surbrillance, puis Enfin, redessine l'image glisser sur le dessus. Il semble avoir fait l'affaire.

0

Il semble presque que le CStatic ne sait pas qu'il doit se repeindre, donc la couleur de fond de l'objet déplaçable est laissée derrière. Peut-être essayer d'invalider le CStatic, et voir si cela aide du tout?

1

Le débogage à distance est une aubaine pour le débogage des problèmes visuels. C'est difficile à configurer, mais avoir un VM prêt pour le débogage à distance sera payant à coup sûr. Ce que j'aime faire, c'est définir une tonne de points d'arrêt dans ma gestion de la peinture, ainsi que dans le code de peinture de la structure elle-même. Cela vous permet de "geler" efficacement la peinture sans la fermer en la retournant. De cette façon, vous pouvez obtenir la vraie image de qui peint dans quel ordre, et où vous avez la chance de casser dans un remplissage de cette manière comme vous le souhaitez.