13

form_MouseDown イベントに Drag() メソッドがあります。フォームにクリックイベントもあります。問題は、フォームをクリックすると、MouseDown イベントがトリガーされ、クリック イベントをトリガーする機会が得られないことです。

この問題を解決する最善の方法は何ですか? フォームが実際にドラッグされた場合、ピクセルをカウントすることを考えていましたが、より良い方法が必要です。助言がありますか?

4

3 に答える 3

5

ダブルクリックとマウスダウンのイベント用ですが、この解決策を見つけました:

void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.Clicks ==1)
{
PictureBox pb = (PictureBox)sender;
DoDragDrop((ImageData)pb.Tag, DragDropEffects.Copy);
}
}

ソース: http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html

于 2015-09-07T03:02:24.987 に答える
4

フォームが実際にドラッグされた場合にピクセルを数えることを考えていましたが、もっと良い方法が必要です。

いいえ、それはまさにあなたがそれをしなければならない方法です。

これは単なるソフトウェアの制限ではありません。それは非常に実用的なものでもあります。ユーザーの視点から問題を考えると、問題と解決策がすぐにわかります。クリックとドラッグの違いは何ですか?

どちらも、マウスボタンがオブジェクトの上に下がるところから始まりますが、一方はマウスボタンが同じ位置にあるオブジェクトの上に戻るところに終わり、もう一方はマウスボタンがまったく異なる位置に戻るところにあります。 。

タイムマシンはまだ完成していないので、これを事前に知る方法はありません。

そうです、ある種の距離のしきい値を維持する必要があります。ポインターがオブジェクトの上にあるときに、ポインターがその距離のしきい値の外側に移動した場合、それはドラッグと見なされます。それ以外の場合は、クリックと見なします。

その距離のしきい値は0であってはなりません。ユーザーは、クリックを開始するためにマウスを完全に静止させる必要はありません。多くのユーザーは標準以下のマウスです。クリックしようとすると、わずかにけいれんする可能性が非常に高くなります。しきい値が0の場合、クリックしようとすると、不注意で多くのドラッグを実行することになります。

もちろん、実際にこれについて心配したり、ドラッグのしきい値を自分で計算したりする必要はありません。GetSystemMetrics代わりに、関数を呼び出してまたはのいずれSM_CXDRAGかを指定することで取得できるWindowsのデフォルト値を使用してSM_CYDRAGください。(これらはWinFormsフレームワークによってどこかに公開される可能性がありますが、私はそうは思いません。自分でP / Invokeするのも同じくらい簡単です。)

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));
}

UX / UIの分野では、この種のことは、物理学や電子工学でのこれらの用語の使用と同様に、ヒステリシスまたはデバウンスと呼ばれます。

于 2013-03-10T12:57:56.333 に答える
2

残念ながら、「ボタンが押された」時点では、目的のアクションがクリックなのかドラッグ アンド ドロップなのかはまだわかりません。後でわかります。

クリックの場合、決定要因は「動かない」と「ボタンを押す」です。

ドラッグの場合、決定要因は「移動」と「ボタンアップ」です。

したがって、これらの相互作用を明確にするには、ボタンだけでなく動きも追跡する必要があります。全体の動きを追跡する必要はなく、ボタンダウンとボタンアップの間の動きだけが興味深いものです。

したがって、これらのイベントは、Mouse.Capture メカニズムを開始/停止する (ドラッグ アドナーを動的に提示し、場所のヒントをドロップする)、またはより単純な形式で、移動ベクトルの原点とターゲットを格納し、距離が > D (移動が発生した場合でも、DRAG がキャンセルされる安全な最小距離が存在する必要があります。マウスは時々「ギザギザ」になり、ドラッグの最後でダブルクリックしたときにアプリがドラッグを開始することを本当に好まないでしょう。マウスポインターの動きが速い:))

于 2013-03-10T12:51:30.603 に答える