如何为WinForm,C#制作框架?

时间:2016-01-30 02:27:47

标签: c# winforms frame

我一直在考虑改变窗体边框的颜色,发现它是由窗户决定的,好吧,这是有道理的,所以我看到之前问过这个问题的人被告知要去这里{ {3}}看起来该网站暂时无法使用。那么我必须制作自己的画框吗?如果是这样我会去哪里看出来,出去?我正在使用visual studio 2012。

3 个答案:

答案 0 :(得分:2)

以下是绘制自己边框的表单示例,可以调整大小并移动..:

public partial class BorderForm : Form
{
    public BorderForm()
    {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None;
        this.DoubleBuffered = true;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
        BorderColor = Color.DarkSlateGray;
    }


    private const int hWidth = 12;        // resize handle width
    private const int bWidth = 28;        // border width
    public Color BorderColor { get; set;  }

    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;

    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    protected override void OnPaint(PaintEventArgs e)
    {
        // draw the border..
        using (Pen pen = new Pen(BorderColor, bWidth)
             { Alignment = System.Drawing.Drawing2D.PenAlignment.Inset})
            e.Graphics.DrawRectangle(pen, ClientRectangle);
        // now maybe draw a title text..

        base.OnPaint(e);
    }


    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }
    }


    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x84) // Trap WM_NCHITTEST
        {  
            Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
            pos = PointToClient(pos);

            bool isTop = pos.Y <= hWidth;
            bool isBottom = pos.Y >= ClientSize.Height - hWidth;
            bool isRight = pos.X >= ClientSize.Width - hWidth;
            bool isLeft = pos.X <= hWidth;

            m.Result = (IntPtr)1;

            if (isTop) m.Result = 
                       isLeft ? (IntPtr)13 : isRight ? (IntPtr)14 : (IntPtr)12;
            else if (isBottom) m.Result = 
                 isLeft ? (IntPtr)16 : isRight ? (IntPtr)17 : (IntPtr)15;
            else if (isLeft) m.Result = (IntPtr)10;  
            else if (isRight) m.Result = (IntPtr)11;

            if ( m.Result != (IntPtr)1) return;
        }
        base.WndProc(ref m);
    }

}

WM_NCHITTEST文档向您展示如何在需要时模拟控件和调整大小框。当然,你应该以某种方式画它们!

答案 1 :(得分:0)

我想你想做自定义winform。在这种情况下,您可能不想渲染默认窗口。在photoshop中绘制您想要的winform并将其用作应用程序的背景。这种方法的问题在于您需要设计自己的最小化,最大化和关闭按钮。

您可以使用FormBorderStyle使其消失。

答案 2 :(得分:0)

它真的涉及,但如果你想要你可以创建自己的Windows窗体库,那就是根本不使用Windows窗体项目。使用Windows GDI文档和PInvoke.Net调用GDI API函数来创建窗口等,并设计自己的表单系统。

您要查看的特定部分是窗口函数:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx