C'est un contrôle de bon sens parce que j'ai perdu le mien.
J'ai une méthode IsCaptured()
qui compare un membre de l'état d'un enum à une valeur donnée et renvoie un bool
. Je l'utilise en conjonction avec une vérification du seuil de la souris pour déterminer si un message de début de déplacement doit être envoyé et si une opération de déplacement doit commencer. Le problème est que ce message est déclenché par le déplacement de la souris alors qu'il ne devrait pas l'être. J'ai ajouté les messages de trace suivants :
TRACE(L"%s\n", (IsCaptured()) ? L"true" : L"false");
CPoint delta = pt - m_trackMouse;
static CPoint thresh(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG));
if (IsCaptured() &&
abs(delta.x) >= thresh.x || abs(delta.y) >= thresh.y)
{
TRACE(L"%s\n", (IsCaptured()) ? L"true" : L"false");
// Send message to enter drag mode
bool bDrag = ::SendMessage(m_trackWnd, WM_DD_BEGIN, ::GetDlgCtrlID(m_trackWnd), (LPARAM)(void*)&m_info) != 0;
// ...
}
Maintenant la partie étrange, la sortie :
false
false
La méthode est mise en œuvre comme suit et m_dragState
est réglé sur NONE
jusqu'à ce qu'il y ait un bouton vers le bas intercepté :
enum { NONE, CAPTURED, DRAGGING };
bool IsCaptured() const { return m_dragState == CAPTURED; }
J'ai essayé de reconstruire la solution entière, sans succès. J'utilise VS2010 Debug 64-bit et le programme est une application MFC à un seul thread. Qu'est-ce qui se passe ici ?