C# 在窗体背景图片上放置panel 遮挡 自适应变化

.Net技术 码拜 5年前 (2016-06-03) 1888次浏览
C# 在窗体背景图片上放置panel 遮挡 自适应变化
如图 panel放置在背景图片上,遮挡住屋顶的位置,然后窗体放大后
C# 在窗体背景图片上放置panel 遮挡 自适应变化
放大以后位置跑偏了,怎么样设置才能让panel跟着背景图片动 一直遮挡屋顶部分。
解决方案

5

引用:
Quote: 引用:

1. 注册图片大小改变时触发的SizeChanged事件;2. 重写图片PictureBox的onRender函数。
这两种方法都可以在图片发送改变或重绘后允许你更新你的panel。

可不可以具体一点

先讲一下原理吧。例如你的图片原来是200X200的,而你的panel的位置为x=20, y=20,长为10,宽为10。那么相对于pannel在图片中的相对位置就是x为20/200=0.1,y为20/200=0.1,长和宽都为10/200 = 0.05。按照这个比例关系,假如图片变成了原来的1.5倍,图片的长宽都是300,那么你的panel的位置和大小也要随之变化。那么panel的x为300*0.1=30,y位300*0.1=30,长和宽也是300*0.05=15。
那么剩下的就是要知道什么时候图片的大小发生改变,并在改变后更新panel的位置和大小。
本人看你图片好像是平铺占满整个form,那么你可以注册form的SizeChanged事件form.SizeChanged+=……。在事件的处理函数中获得图片的大小并根据比例关系更新panel的位置和大小

30

        RectangleF k;
        protected override void OnLoad(EventArgs e)
        {
            //记录下 Panel 与 Form 的相对位置
            k = new RectangleF(
                (float)panel1.Left / (float)Width,
                (float)panel1.Top / (float)Height,
                (float)panel1.Width / (float)Width,
                (float)panel1.Height / (float)Height);
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            //重置 Panel 的相关属性
            panel1.Left = (int)(k.X * Width);
            panel1.Top = (int)(k.Y * Height);
            panel1.Width = (int)(k.Width * Width);
            panel1.Height = (int)(k.Height * Height);
        }

5

        protected override void OnLoad(EventArgs e)
        {
            foreach (Control c in Controls)
            {
                var k = new RectangleF(
                    (float)c.Left / (float)Width,
                    (float)c.Top / (float)Height,
                    (float)c.Width / (float)Width,
                    (float)c.Height / (float)Height);
                c.Tag = k;
            }
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            foreach (Control c in Controls)
            {
                var k = (RectangleF)c.Tag;
                c.Left = (int)(k.X * Width);
                c.Top = (int)(k.Y * Height);
                c.Width = (int)(k.Width * Width);
                c.Height = (int)(k.Height * Height);
            }
        }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 在窗体背景图片上放置panel 遮挡 自适应变化
喜欢 (0)
[1034331897@qq.com]
分享 (0)