Stavo pensando di contare i pixel se il modulo è in realtà trascinato, ma deve esserci un modo migliore.
No, è esattamente come devi farlo.
Questa non è solo una limitazione del software; è anche molto pratico. Se pensate al problema dal punto di vista dell'utente, vedrete immediatamente il problema e la soluzione. Chiediti, qual è la differenza tra un clic e un trascinamento?
Entrambi iniziano con il pulsante del mouse che scende sopra l'oggetto, ma uno di essi termina con il pulsante del mouse che torna sopra l'oggetto nella stessa posizione e l'altro termina con il pulsante del mouse che risale in una posizione completamente diversa.
Dal momento che le macchine del tempo non sono ancora state perfezionate, non si ha modo di saperlo in anticipo.
Quindi sì, è necessario mantenere una sorta di soglia di distanza, e se il puntatore si muove al di fuori di tale soglia di distanza mentre è giù sull'oggetto, allora si considera un trascinamento. Altrimenti, lo consideri un clic.
Tale soglia di distanza non deve essere 0. L'utente non deve essere tenuto a tenere il mouse completamente immobile per iniziare un trascinamento. Molti utenti sono meno esperti. È molto probabile che si contraggano leggermente quando si tenta di fare clic. Se la soglia è 0, finiranno per fare un sacco di trascinamento involontario quando provano a fare clic.
Ovviamente, non devi preoccuparti di nulla di tutto questo né calcolare la soglia di trascinamento.Utilizzare invece i valori predefiniti di Windows, ottenibili chiamando la funzione GetSystemMetrics
e specificando SM_CXDRAG
o SM_CYDRAG
. (Questi potrebbero essere esposti da qualche parte dal quadro WinForms, ma io non la penso così. E 'altrettanto facile P/Invoke da soli.)
const int SM_CXDRAG = 68;
const int SM_CYDRAG = 69;
[DllImport("user32.dll")]
static extern int GetSystemMetrics(int index);
Point GetDragThreshold()
{
return new Point(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG));
}
"contare pixel" è abbastanza comune, perché nella maggior parte dei casi che in realtà ** ** non si desidera la resistenza al fuoco quando il la "distanza di movimento" è più corta rispetto, ad esempio, a 7,15 pixel. Anche il desktop di Windows ha una soglia di pochi pixel. – quetzalcoatl
Non utilizzare 'Click', e invece usare' MouseUp'? – Neolisk
Ho creato una demo e non sto ottenendo questo comportamento. Dopo aver raggiunto MouseDown, viene raggiunto. Puoi pubblicare del codice? –