1

サイズ変更できない 800x600 ピクセルの Windows フォームを作成しました。私の問題は、高さがフォームの高さよりも小さい画面解像度でフォームを表示すると、ダイアログの下部が Windows タスク バーで覆われることです。

次の方法を使用して、ユーザーがどこからでもフォームをドラッグできるようにすることで、これを解決しようとしました。

[DllImport("user32.dll")]
        static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, UIntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        static extern bool ReleaseCapture(IntPtr hwnd);

        const uint WM_SYSCOMMAND = 0x112;
        const uint MOUSE_MOVE = 0xF012;

        public void Drag()
        {
            DefWindowProc(this.Handle, WM_SYSCOMMAND, (UIntPtr)MOUSE_MOVE, IntPtr.Zero);
        }


        private void OnMainPanelMouseDown(object sender, MouseEventArgs e)
        {
            Control ctrl = sender as Control;
            ReleaseCapture(ctrl.Handle);

            this.Drag(); // put the form into drag mode.
        }

フォームをどこにでもドラッグできましたが、今は問題があります。Windows では、画面の上端を超えてウィンドウをドラッグすることはできません。ウィンドウを画面の上部にスナップします。

少なくとも私のフォームでは、このウィンドウの動作を無効にする方法を探しています。

4

2 に答える 2

0

ちょっとしたコツで解決できました。主に ResizeEnd イベントを処理し、MouseDown イベントと ResizeEnd イベントの間でマウス ポインターの位置をトレースします。次に、MouseDown イベントに保存された初期フォームの Y 座標に差を加算/減算し、フォームの位置をその座標に設定するだけです。

Windowsがフォームをスナップするときとコードがその場所を強制するときの場所の違いにより、何らかのちらつきが発生するため、誰かが別の回答を提供できる場合は、まだ他の回答を受け付けています。

于 2012-12-02T16:40:21.673 に答える
0

これは非常に古いことは知っていますが、この問題の簡単な解決策を検索したときにこの質問を見つけました。

何も計算する必要はありません。値を保存して再度使用するだけです。

Forms Y Location を MouseUp イベントと ResizeEnd イベントに保存するだけで、Forms Y Location を保存した場所に設定できます。

int oldY;

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        oldY = this.Location.Y;
        Console.WriteLine("LMB Up");
    }
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    this.Location = new Point(this.Location.X, oldY);
    Console.WriteLine("ResizeEnd");
}

これが、この問題の簡単な解決策を探している人に役立つことを願っています.

于 2021-10-19T17:36:36.770 に答える