3

クライアント領域でマウスの右ボタンを押したままにしてウィンドウフォームを移動したい状況があります。私が述べたように、それはボーダレスです。

「ネイティブ」に移動したいと思います(可能であれば、他の回答でも構いません)。タイトルバーでマウスの左ボタンを押したままにしたときの動作を意味します (マウスの移動などで、多くの奇妙な動作が発生しますが、それは私だけかもしれません)。

私は多くのことを読みましたが、この投稿は役に立ちます

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9985b19-cab5-4fba-9dc5-f323d0d37e2f/

私はそれを使用するさまざまな方法を試し、http://msdn.microsoft.com/en-us/library/ff468877%28v=VS.85%29.aspx を見ての有用なものを見つけましたが、WM_NCRBUTTONDOWN が頭に浮かびました。おそらくフォームによって処理されているため、wndproc はそれを検出しませんか?

どんな提案でも大歓迎です、ありがとう

フランチェスコ

4

2 に答える 2

5
public partial class DragForm : Form
{
    // Offset from upper left of form where mouse grabbed
    private Size? _mouseGrabOffset;

    public DragForm()
    {
        InitializeComponent();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if( e.Button == System.Windows.Forms.MouseButtons.Right )
            _mouseGrabOffset = new Size(e.Location);

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        _mouseGrabOffset = null;

        base.OnMouseUp(e);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (_mouseGrabOffset.HasValue)
        {
            this.Location = Cursor.Position - _mouseGrabOffset.Value;
        }

        base.OnMouseMove(e);
    }
}
于 2011-05-07T04:51:46.423 に答える
1

これを行うには、2 つの P/Invoke メソッドが必要です。

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

いくつかの定数:

const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;

フォームでイベントを処理してMouseDownから、次のようにします。

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
    }
}

これにより、マウスがクリックしてキャプション領域を押したままにしたときに受け取るのと同じイベントがフォームに送信されます。マウスを動かすとウィンドウが移動します。マウス ボタンを放すと、移動が停止します。非常に簡単。

于 2011-04-29T02:54:05.497 に答える