1. 程式人生 > >winform 中panel動態新增控制元件座標原點問題

winform 中panel動態新增控制元件座標原點問題

問題描述

最近在寫winform程式的時候遇到一個小問題,目標效果是類似QQ的聊天對話方塊,每傳送一條訊息會在介面上顯示傳送方的頭像、傳送氣泡、以及訊息內容,如圖

這裡寫圖片描述
按照原來的想法,每條訊息都是一個獨立的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的範圍出現滾動條後,訊息顯示不正常了,相鄰兩條訊息中間出現了空隙,如圖
這裡寫圖片描述


經過不斷的百度,才發現原來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的座標原點和原來一致