2

winform をダイアログとして表示します (メイン ウィンドウ上に ShowDialog を使用)。コントロール ボックスもタイトル バーも必要ないので、FormBorderStyle を None に設定しました。ただし、境界線 (通常のウィンドウのような青い境界線など) を描画し、フォームを移動する機能を維持したいと思います。サイズを変更する機能は必要ありません。OnPaint をオーバーライドして境界線を描画しようとしましたが、呼び出されません。これが私のコードです:

  protected override void OnPaint (PaintEventArgs e)
  {
    base.OnPaint (e);
    int borderWidth = 2;
    Color borderColor = Color.Blue;
    ControlPaint.DrawBorder (e.Graphics, e.ClipRectangle, borderColor,
      borderWidth, ButtonBorderStyle.Solid, borderColor, borderWidth,
      ButtonBorderStyle.Solid, borderColor, borderWidth, ButtonBorderStyle.Solid,
      borderColor, borderWidth, ButtonBorderStyle.Solid); 
  }

どんな助けでも大歓迎です。

4

3 に答える 3

2

このPaint方法は、フォームのいわゆる非クライアント領域(境界線やタイトルバーなど)を描画しないため、ここでは間違っています。

ControlBoxタイトルバーを非表示にするには、プロパティをに設定しfalse、フォームのプロパティをクリアする必要がありTextます。FixedDialogフォームのサイズを変更できないようにするには、境界線をに設定します。

タイトルバーなしでフォームを移動する機能を維持するには、をオーバーライドする必要がありますWndProc

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
      case 0x84: m.Result = new IntPtr(0x2);
          return;
    }
    base.WndProc(ref m);
}

基本的に、これはWM_NCHITTESTメッセージを処理し、不正行為を行う標準的な方法です。マウスカーソルはウィンドウのキャプション[戻り値0x2]にあるため、クライアント領域をクリックしてドラッグしてもフォームを移動できます。

于 2010-10-25T09:38:00.983 に答える
1

私の問題は、細い境界線でサイズ変更可能なフォームを持つことでした。

FormBorderStyle を None に設定しました

すべてのコントロールを含むドッキング パネルを使用しています。

パネルのパディングを使用して、境界線の幅を設定します。

その後 :

Point ResizeLocation = Point.Empty;
        void panResize_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) {
                ResizeLocation = e.Location;
                ResizeLocation.Offset(-panResize.Width, -panResize.Height);
                if (!(ResizeLocation.X > -16 || ResizeLocation.Y > -16))
                    ResizeLocation = Point.Empty;
            }
            else
                ResizeLocation = Point.Empty;
        }
        void panResize_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && !ResizeLocation.IsEmpty) {
                if (panResize.Cursor == Cursors.SizeNWSE)
                    Size = new Size(e.Location.X - ResizeLocation.X, e.Location.Y - ResizeLocation.Y);
                else if (panResize.Cursor == Cursors.SizeWE)
                    Size = new Size(e.Location.X - ResizeLocation.X, Size.Height);
                else if (panResize.Cursor == Cursors.SizeNS)
                    Size = new Size(Size.Width, e.Location.Y - ResizeLocation.Y);
            }
            else if (e.X - panResize.Width > -16 && e.Y - panResize.Height > -16)
                panResize.Cursor = Cursors.SizeNWSE;
            else if (e.X - panResize.Width > -16)
                panResize.Cursor = Cursors.SizeWE;
            else if (e.Y - panResize.Height > -16)
                panResize.Cursor = Cursors.SizeNS;
            else {
                panResize.Cursor = Cursors.Default;
            }

        }

        void panResize_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ResizeLocation = Point.Empty;
        }
于 2012-01-13T09:36:02.690 に答える
0

これ以上情報が得られないようなので、境界線はそのままにして、FixedDialog に設定し、ControlBox プロパティを false に設定し、フォームの Text をクリアします。ただし、境界線とウィンドウを移動する機能には別の色を使用したいと思います。とにかく、答えてくれてありがとう。

于 2010-10-26T13:23:01.453 に答える