为什么我的第二个C#fadein条件不会改变pictureBox?

时间:2013-02-05 21:48:35

标签: c# winforms graphics

当我点击一个按钮时,我有C#淡出一个图片框,在淡出后,相同的图片框会在下一个图像中淡出。目前,我将淡出代码放在淡出和淡入条件下。 (我仍然需要重写用于淡入的代码。)一旦代码命中第二个图像的逻辑,代码就会循环直到条件变为false并退出而不更改显示。如何更正我的代码以在第二张图像上获得相同的效果?另外,如果有人知道如何重写淡入的淡出逻辑,请告诉我。

在顶部定义的变量:

int alpha = 0;
    bool backButtonClick = false;
    bool breakCheck = false;

Button的逻辑片段:

        private void storyChooser_Click(object sender, EventArgs e)
        {

            switch (userChoice)
            {
                case Choice.Son:

                    transitions();


                     if (alpha == 0)
                    {
                        pictureBox1.Image = Properties.Resources.test;
                        timer1.Start();

                    }
                break;
            }

计时器:

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (backButtonClick == true)
            {
                timer1.Stop();
                alpha = 0;
                backButtonClick = false;
            }

            if (alpha++ < 40)
            {
                Image image = pictureBox1.Image;
                using (Graphics g = Graphics.FromImage(image))
                {
                    Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width);
                    g.DrawRectangle(pen, -1, -1, image.Width, image.Height);
                    g.Save();

                }
                pictureBox1.Image = image;
            }
            else
            {
                timer1.Stop();
            }

            if (alpha == 40 && breakCheck == false)
            {
                pictureBox1.Image = Properties.Resources.transitionTest;

                timer1.Start();

                while (alpha-- > 0)
                {
                    Image image = pictureBox1.Image;
                    using (Graphics g = Graphics.FromImage(image))
                    {
                        Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width);
                        g.DrawRectangle(pen, -1, -1, image.Width, image.Height);
                        g.Save();

                    }
                    pictureBox1.Image = image;
                    label1.Text = alpha.ToString();
                }
                breakCheck = true;
            }
            label1.Text = alpha.ToString();
        }

我正在通过while循环,朝着计时器的底部运行,而不更新任何图形。

感谢。

4 个答案:

答案 0 :(得分:1)

我认为这可能是因为你在while循环中都是这样做的,ui在你改变它之前没有机会重新绘制它。

您可能也希望在计时器滴答中执行减法部分,而不是一次性。

答案 1 :(得分:1)

看起来你的第二个 fadein 条件中有一个while循环。

这将使你的控制在下一次计时器滴答事件之前从一侧转到另一侧。

我不得不重新编写代码,以便我能更好地感受它。

如果您使用PictureBox直接写入屏幕,为什么使用Graphic控件?

这是我的代码可怕的错误。我希望它不会冒犯。

我事先声明了所有变量,所以VS不会抱怨错误的定义。

我也没有transitionTest图片,因此我为此定义了Properties_Resources_transitionTest

int MAX = 40;
int alpha;
bool backButtonClick;
bool breakCheck;
Label label1;
Image Properties_Resources_transitionTest;
Image image;

在下面初始化的内容并将其踢掉。我不知道你的枚举类型意味着什么,或者transition()方法是你所谓的。

private void storyChooser_Click(object sender, EventArgs e) {
  alpha = 0;
  backButtonClick = false;
  breakCheck = false;
  image = Properties_Resources_transitionTest;
  timer1.Start();
}

对于backButtonClickbreakCheck值,我将它们放在表单的click事件处理程序中,如下所示:

private void backButton_Click(object sender, EventArgs e) {
  backButtonClick = !backButtonClick;
}

private void break_Click(object sender, EventArgs e) {
  breakCheck = true;
  // easier to just write
  // timer1.Stop();
}

此Timer Tick事件处理程序应该处理您要执行的操作。请注意,while循环也已被删除。

private void timer1_Tick(object sender, EventArgs e) {
  if (!breakCheck) {
    using (Pen p = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width)) {
      using (Graphics g = Graphics.FromImage(image)) {
        g.DrawRectangle(p, 0, 0, image.Width, image.Height);
      }
    }
    if (backButtonClick) {
      alpha--;
      if (alpha == 0) {
        timer1.Stop();
      }
    } else {
      alpha++;
      if (alpha == MAX) {
        timer1.Stop();
      }
    }
  } else {
    timer1.Stop();
  }
  label1.Text = alpha.ToString();
}

更新:评论中的每个问题:

如果backButtonClick为真,则alpha值会在每次计时器滴答时减少1,并在alpha变为零时停止。

如果backButtonClick为false,则alpha会增加,直到达到MAX,然后停止计时器。

由于alpha控制了Pen颜色的不透明度,因此您的图片会显示淡入淡出,具体取决于backButtonClick设置的值。

我相信这就是你所追求的,但我可能是错的。

答案 2 :(得分:0)

我假设你的意思是它跳过了以下部分:

 if (alpha == 40 && breakCheck == false)

我认为这不会执行,因为你因为这一行而停止增加值为39的alpha:

if (alpha++ < 40)

如果将其更改为不太相等,则应执行:

if (alpha++ <= 40)

答案 3 :(得分:-1)

为什么人们在winforms中坚持这么多?

看,你可以在WPF中使用20行XAML并且绝对没有C#代码

<Window x:Class="WpfApplication4.Window4"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window4" Height="300" Width="300">
    <Window.Resources>
        <Storyboard x:Key="FadeIn" TargetName="Red" Duration="00:00:05">
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1"/>
        </Storyboard>
        <Storyboard x:Key="FadeOut" TargetName="Blue" Duration="00:00:05">
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0"/>
        </Storyboard>
    </Window.Resources>
    <DockPanel>
        <Button DockPanel.Dock="Top"  HorizontalAlignment="Center" Content="Fade">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard Storyboard="{StaticResource FadeIn}"/>
                        <BeginStoryboard Storyboard="{StaticResource FadeOut}"/>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Button.Triggers>
        </Button>
        <Grid Margin="30">
            <Grid Background="Red" Opacity="0" x:Name="Red"/>
            <Grid Background="Blue" x:Name="Blue"/>
        </Grid>
    </DockPanel>
</Window>

代码背后:

using System.Windows;

namespace WpfApplication4
{
    public partial class Window4 : Window
    {
        public Window4()
        {
            InitializeComponent();
        }
    }
}

只需将我的代码复制并粘贴到文件中即可 - >新项目 - &gt; WPF应用程序并亲自查看结果。

这些是具有纯色背景的网格。您可以用<Grid/>或任何您想要的内容替换<Image/>