0

パネルがあり、パネルにピクチャボックスを配置しました。すべてのピクチャボックスは正方形で同じサイズです。3列に並べました。それらを自動スクロールしたい(上に移動)。最初の3枚の写真(1行目)が消えると一番下に来ます。

タイマーを使用してピクセルごとに上に移動し、1 行目が消えたら、すべてのピクチャ ボックスの位置を変更します。しかし、ちらつきます。いくつかの方法を試してみましたが、何も機能しません。アイデアを教えてください。これが別の方法です。FlowLayoutPanelを使用しましたが、同じ問題です。

class PicturesPanel : Panel {
    private FlowLayoutPanel flowPanel;
    internal Timer timer;
    private List<BorderPictureBox> PicturesList;
    private int top;

    public ImageList Images {
        get;
        set;
    }

    public PicturesPanel() {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
        //this.AutoScroll = true;
        PicturesList = new List<BorderPictureBox>();
    }

    private void PicturesPanel_Click(object sender, EventArgs e) {
        loadImages();
    }

    private void loadImages() {
        if (this.Images != null) {
            int count = this.Images.Images.Count;
            int estimateHeight = 60 * (count / 3) - 4;

            flowPanel = new FlowLayoutPanel();
            flowPanel.Top = 0;
            flowPanel.Left = 0;
            flowPanel.Width = 200;
            flowPanel.Height = estimateHeight + 50;
            flowPanel.FlowDirection = FlowDirection.LeftToRight;
            this.Controls.Add(flowPanel);

            for (int i = 0; i < count; i++) {
                BorderPictureBox newPic = new BorderPictureBox();
                newPic.Image = this.Images.Images[i];
                newPic.Width = 56;
                newPic.Height = 56;
                newPic.SizeMode = PictureBoxSizeMode.StretchImage;
                newPic.Top = 60 * (i / 3);
                newPic.Left = 60 * (i % 3);
                flowPanel.Controls.Add(newPic);
                PicturesList.Add(newPic);
            }

            if (timer == null) {
                if (estimateHeight > this.Height) {
                    timer = new Timer();
                    timer.Interval = 25;
                    timer.Tick += new EventHandler(timer_Tick);
                    autoscroll = true;
                    timer.Start();
                }
            }
        }
    }

    private void timer_Tick(object sender, EventArgs e) {
        //this.VerticalScroll.Value += 1;
        //if (PicturesList[0].Bottom <= -4) {
        //    PicturesList.Add(PicturesList[0]);
        //    PicturesList.Add(PicturesList[1]);
        //    PicturesList.Add(PicturesList[2]);
        //    PicturesList.RemoveAt(0);
        //    PicturesList.RemoveAt(0);
        //    PicturesList.RemoveAt(0);
        //    this.VerticalScroll.Value = 0;

        //    for (int i = 0; i < PicturesList.Count; ++i) {
        //        PicturesList[i].Top = 60 * (i / 3);
        //        PicturesList[i].Left = 60 * (i % 3);
        //    }

        //}
        flowPanel.Top -= 1;
        if (flowPanel.Top <= -60) {
            flowPanel.SuspendLayout();
            flowPanel.Controls.RemoveAt(0);
            flowPanel.Controls.RemoveAt(0);
            flowPanel.Controls.RemoveAt(0);
            flowPanel.Controls.Add(PicturesList[0]);
            flowPanel.Controls.Add(PicturesList[1]);
            flowPanel.Controls.Add(PicturesList[2]);
            PicturesList.Add(PicturesList[0]);
            PicturesList.Add(PicturesList[1]);
            PicturesList.Add(PicturesList[2]);
            PicturesList.RemoveAt(0);
            PicturesList.RemoveAt(0);
            PicturesList.RemoveAt(0);
            flowPanel.Top = 0;
            flowPanel.ResumeLayout();
        }
    }
}
4

1 に答える 1

1

FlowLayoutPanel 内の PictureBoxes を移動してこの効果を得るつもりはありません。FlowLayoutPanel のスクロールバーの値を変更してみてください。

void timer_Tick(object sender, EventArgs e) {
  flowPanel.VerticalScroll.Value += 1;
  if (flowPanel.VerticalScroll.Value + flowPanel.VerticalScroll.LargeChange > 
                                       flowPanel.VerticalScroll.Maximum) {
    ((Timer)sender).Enabled = false;
  }
}
于 2013-04-21T14:19:42.320 に答える