winform 中panel动态添加控件坐标原点问题

问题描述

最近在写winform程序的时候遇到一个小问题,目标效果是类似QQ的聊天对话框,每发送一条消息会在界面上显示发送方的头像、发送气泡、以及消息内容,如图

winform 中panel动态添加控件坐标原点问题_第1张图片
按照原来的想法,每条消息都是一个独立的panel,然后在主界面的大的panel中add每一个panel进去,同时设置大panel的AutoScroll为true

    //前面把头像pictureBox、气泡pictureBox、以及文字label设置好了
    //新建一个小的panel
    Panel p = new Panel();
    p.size = new Size(100,50);
    p.Controlls.Add(iconBox);
    p.Controlls.Add(pictureBox);
    p.Controlls.Add(messageLabel);
    p.Location = new Point(0,currentHeight);
    //把小的panel挂在大的panel上
    this.messagesPanel.Controlls.Add(p);
    this.PerformLayout();
    currentHeight += p.Size.Height +10;

这里的currentHeight是一个全局的保存下一个新加入panel位置的变量,每新添加一个小panel就把currentHeight增加panel的高再加10
一开始显示正常,可是当消息超出了panel的范围出现滚动条后,消息显示不正常了,相邻两条消息中间出现了空隙,如图
winform 中panel动态添加控件坐标原点问题_第2张图片
经过不断的百度,才发现原来panel的坐标原点是在左上角,而且是在可视区域的左上角,也就是说当你的滚动条往下移动的时候,坐标原点也会跟着移动!!所以造成了currentHeight是相对于最开始的坐标原点的高度,而实际显示的是相对于可视区域的坐标原点的高度。


解决方法

两种方法

1.设置panel的AutoScrollPosition属性

messagesPanel.AutoScrollPosition = new Point(0,0);
//messagePanel.AutoScrollPosition = messagesPanel.VerticalScrol.Minimum;

这样使得外面那个大的panel的滚动条回到最顶端,从而使得panel的坐标原点和原来保持一致

2.设置panel.VerticalScrol.Value属性

messagesPanel.VerticalScrol.Value = 0;

改变滚动条的值,从而改变滚动条的位置,使得滚动条回到最顶端,从而使得panel的坐标原点和原来一致

你可能感兴趣的:(c#,winform,panel,winform,控件,坐标原点)