Winform如何拖动左边框、上边框以调整窗体尺寸?FormBorderStyle=none

p523399 2015-02-03 02:05:30
我把一个Form的FormBorderStyle设置为none,然后它就没有边框了,我要模拟一个边框,于是,我就放了4个panel在四边,模拟边框。
现在,拖拽右边框的代码写好了,而且有效:

private void panel_right_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Size = new Size(this.PointToClient(MousePosition).X, this.Height);
this.panel_right.Location = new Point(
this.Width - 8,//8就是这个panel的宽度
0);
}
}

请问各位高手,如何拖动左边框以调整窗体尺寸、如何拖动上边框以调整窗体尺寸?
...全文
385 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianjixue1 2015-02-04
  • 打赏
  • 举报
回复
引用 5 楼 p523399 的回复:
谢谢,但是真的不能用你这个,因为要模拟出一个边框来
我说不用Panel,只是说这个方法与外边的Panel没有关系。你想放就放,想模拟边框就模拟,不影响的。
於黾 2015-02-04
  • 打赏
  • 举报
回复
如果仅仅是为了模拟边框,你在OnPaint里重绘一下,在四周加个阴影什么的就好了 panel是容器,不要用它来绘图
p523399 2015-02-03
  • 打赏
  • 举报
回复
引用 4 楼 dianjixue1 的回复:
试试这个 不用放4个Panel,在窗体上加上


        private const int WM_NCLBUTTONDBLCLK = 163;
        private const int WM_NCHITTEST = 132;
        /// <summary>
        /// 边框改变大小
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截鼠标非客户区左键双击消息,决定窗体是否最大化显示
                    if (this.MaximizeBox)
                    {
                        base.WndProc(ref m);
                        this.Invalidate();
                    }
                    return;
                case WM_NCHITTEST://WM_NCHITTEST=132 <0x84> 
                    base.WndProc(ref m);//如果去掉这一行代码,窗体将失去MouseMove..等事件
                    //Point lpint = new Point((int)m.LParam);//可以得到鼠标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放
                    //if (lpint.Y < 30)
                    //    m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>
                    if (WindowState != FormWindowState.Maximized)
                    {
                        Point p2 = this.PointToClient(MousePosition);//鼠标相对于窗体的坐标
                        //当然可以托动也可以改变大小了
                        //label1.Text = p2.X + "," + p2.Y;
                        //HTLEFT=10 <0xA> 左边框
                        if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)
                            m.Result = (IntPtr)0xA;
                        else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)
                            m.Result = (IntPtr)0xC;
                        //HTTOP=12 <0xC> 上边框                   
                        else if (p2.X < 5 && p2.Y < 5)
                            m.Result = (IntPtr)0xD;
                        //HTTOPLEFT=13 <0xD>
                        else if (p2.X >= this.Width - 5 && p2.Y < 5)
                            m.Result = (IntPtr)0xE;
                        //HTTOPRIGHT=14 <0xE> 
                        else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)
                            m.Result = (IntPtr)0xB;
                        //HTRIGHT=11 <0xB>
                        else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)
                            m.Result = (IntPtr)0xF;
                        //HTBOTTOM=15 <0xF>
                        else if (p2.X < 5 && p2.Y >= this.Height - 5)
                            m.Result = (IntPtr)0x10;
                        //HTBOTTOMLEFT=16 <0x10>
                        else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)
                            m.Result = (IntPtr)0x11;
                        //HTBOTTOMRIGHT=17 <0x11>

                        //HTBORDER=18 <0x12>

                        //HTMINBUTTON=8 <0x8> 最小化按钮

                        //HTMAXBUTTON=9 <0x9> 最大化按钮
                        //HTCLOSE=20 <0x14> 关闭按钮
                    }
                    return;
                default:
                    base.WndProc(ref m);
                    return;
            }

        }
谢谢,但是真的不能用你这个,因为要模拟出一个边框来
dianjixue1 2015-02-03
  • 打赏
  • 举报
回复
试试这个 不用放4个Panel,在窗体上加上


        private const int WM_NCLBUTTONDBLCLK = 163;
        private const int WM_NCHITTEST = 132;
        /// <summary>
        /// 边框改变大小
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截鼠标非客户区左键双击消息,决定窗体是否最大化显示
                    if (this.MaximizeBox)
                    {
                        base.WndProc(ref m);
                        this.Invalidate();
                    }
                    return;
                case WM_NCHITTEST://WM_NCHITTEST=132 <0x84> 
                    base.WndProc(ref m);//如果去掉这一行代码,窗体将失去MouseMove..等事件
                    //Point lpint = new Point((int)m.LParam);//可以得到鼠标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放
                    //if (lpint.Y < 30)
                    //    m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>
                    if (WindowState != FormWindowState.Maximized)
                    {
                        Point p2 = this.PointToClient(MousePosition);//鼠标相对于窗体的坐标
                        //当然可以托动也可以改变大小了
                        //label1.Text = p2.X + "," + p2.Y;
                        //HTLEFT=10 <0xA> 左边框
                        if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)
                            m.Result = (IntPtr)0xA;
                        else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)
                            m.Result = (IntPtr)0xC;
                        //HTTOP=12 <0xC> 上边框                   
                        else if (p2.X < 5 && p2.Y < 5)
                            m.Result = (IntPtr)0xD;
                        //HTTOPLEFT=13 <0xD>
                        else if (p2.X >= this.Width - 5 && p2.Y < 5)
                            m.Result = (IntPtr)0xE;
                        //HTTOPRIGHT=14 <0xE> 
                        else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)
                            m.Result = (IntPtr)0xB;
                        //HTRIGHT=11 <0xB>
                        else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)
                            m.Result = (IntPtr)0xF;
                        //HTBOTTOM=15 <0xF>
                        else if (p2.X < 5 && p2.Y >= this.Height - 5)
                            m.Result = (IntPtr)0x10;
                        //HTBOTTOMLEFT=16 <0x10>
                        else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)
                            m.Result = (IntPtr)0x11;
                        //HTBOTTOMRIGHT=17 <0x11>

                        //HTBORDER=18 <0x12>

                        //HTMINBUTTON=8 <0x8> 最小化按钮

                        //HTMAXBUTTON=9 <0x9> 最大化按钮
                        //HTCLOSE=20 <0x14> 关闭按钮
                    }
                    return;
                default:
                    base.WndProc(ref m);
                    return;
            }

        }
tcmakebest 2015-02-03
  • 打赏
  • 举报
回复
楼主这样子好玩吗?有没有更重要的东东可以研究啊
於黾 2015-02-03
  • 打赏
  • 举报
回复
为什么放4个panel 代码判断鼠标位置如果在窗体的最右边,就修改一下鼠标样式,然后左键点下就修改大小,不就得了 右边的会改,左边的有什么区别吗 我知道你纠结在哪里 你现在是把鼠标的当前X轴坐标当做窗体宽度直接赋值给窗体了 你应该在左键点下时记录当前的坐标,然后在拖动时判断拖动后的坐标和点下时的坐标到底相差了多少(有正有负) 而且应该获取的是屏幕坐标,而不是鼠标相对于窗体的坐标 否则鼠标在左边时,坐标永远是0,你怎么知道拖动过
p523399 2015-02-03
  • 打赏
  • 举报
回复
忘记说了,在Form_Resize里面,是这样的: this.panel_right.Location = new Point(this.Width -8 ,0);

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧