当单击右箭头键不间断时,如何在trackBar滚动中移动图像?

时间:2012-07-22 21:05:52

标签: c# winforms

如果我逐个点击,请单击箭头键然后单击并再次离开,等等图像变好。 但是,如果我不断按下右箭头键,只有当我离开右箭头键时,图像才会改变,因此加载此trackBar值的图像。

这是我的滚动事件:

private void trackBar1_Scroll(object sender, EventArgs e)
{   
    currentFrameIndex = trackBar1.Value;
    textBox1.Text = "Frame Number : " + trackBar1.Value;
    wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex)); 
    LoadPictureAt(trackBar1.Value, sender);

    button1.Enabled = false;
    button2.Enabled = false;
    button3.Enabled = false;
    button4.Enabled = false;
    button8.Enabled = false;
    SaveFormPicutreBoxToBitMapIncludingDrawings();
    return;
}

到目前为止,我没有其他trackBar事件。

这是LoadPictureAt函数:

private bool LoadPictureAt(int nIndex, object c)
{
    bool bRet = false;
    if (nIndex >= 0 && nIndex < fi.Length)
    {
        if (c.Equals(trackBar1))
            pictureBox1.Load(fi[nIndex].FullName);
        bRet = true;
    }   
    return bRet;
}

我解决了这个问题:

我在滚动事件之前添加了一个新函数:

private void setpicture(int indx)
        {
            if (fi == null)
            {

            }
            else
            {
                if (indx >= 0 && indx <= trackBar1.Maximum && fi.Length > indx)
                {
                    try
                    {
                        label19.ForeColor = Color.Red;
                        fileToolStripMenuItem.Enabled = true;
                        label19.Visible = false;
                        label20.Visible = false;
                        label14.Visible = true;
                        label15.Visible = true;
                        label8.Visible = true;
                        label9.Visible = true;

                        trackBar1.Enabled = true;
                        using (FileStream fs = new FileStream(fi[indx].FullName, FileMode.Open))
                        {
                            this.label8.Visible = true;
                            this.label9.Visible = true;
                            this.label9.Text = fi[indx].Name;
                            Image img = null;
                            Bitmap bmp = null;
                            Image imgOLd = null;

                            try
                            {


                                img = Image.FromStream(fs);
                                bmp = new Bitmap(img);

                                imgOLd = this.pictureBox1.Image;
                                this.pictureBox1.Image = bmp;
                                if (imgOLd != null)
                                    imgOLd.Dispose();

                                img.Dispose();
                                img = null;
                            }
                            catch
                            {
                                if (img != null)
                                    img.Dispose();
                                if (bmp != null)
                                    bmp.Dispose();
                                if (imgOLd != null)
                                    imgOLd.Dispose();
                            }
                        }
                    }
                    catch
                    {

                    }
                }
                else
                {
                    Image imgOLd = this.pictureBox1.Image;


                    if (imgOLd != null)
                    {
                        imgOLd.Dispose();
                        imgOLd = null;
                    }

                    Application.DoEvents();
                }
            }
        }

并将滚动事件更改为:

private void trackBar1_Scroll(object sender, EventArgs e)
        {

            currentFrameIndex = trackBar1.Value;
            textBox1.Text = "Frame Number : " + trackBar1.Value;
            wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex)); 

            trackBar1.Minimum = 0;
            trackBar1.Maximum = fi.Length - 1;
            setpicture(trackBar1.Value);
            pictureBox1.Refresh();

            button1.Enabled = false;
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            button8.Enabled = false;
            SaveFormPicutreBoxToBitMapIncludingDrawings();
            return;









        }

1 个答案:

答案 0 :(得分:0)

当您按住光标键或尽可能快地反复猛击它时,没有“不停”这样的事情。它的KeyDown事件以现代cpus的冰川速度生成。你不能做得比每秒大约20次点击要好,每次点击之间50毫秒。现代核心可以轻松地在击键之间执行一亿条指令。

然而,重要的是你用这个巨大的资源做了什么。不幸的是,你没有做太多,你在Scroll事件中击中了这个磁盘。你调用Image.Load(),看起来像Image.Save()。这些方法只能在磁盘旋转时执行,cpu在等待磁盘完成工作时没有做任何有用的事情。浪费了数亿个cpu周期,等待机械事件发生。

实际上它从那里变得更糟。接下来发生的事情是Winforms需要使用从磁盘检索到的图像绘制窗口。绘画是一种低优先级的操作,只有在没有什么比这更重要的事情需要做的时候才能完成。

问题是,需要做的更重要的事情。等待磁盘检索/保存图像需要很长时间,以至于Winforms消息循环遇到的下一件事是 more 比绘画更重要。输入事件,下一次击键。

如果正确执行,您的图片框实际上会分配其图像。你只是看不到它,因为它没有画到屏幕上。停止点击光标键和 bam ,它现在有时间和颜色。

这完全是设计上的。您可以通过调用图片框'Update()方法强制重绘,用户现在肯定会看到图像。但这实际上也不是很好,你的程序开始滞后。键盘被缓冲在消息队列中,并且您的程序将在您释放密钥后很长时间内更新图像。

选择你的毒药。