1

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

顶部定义的变量:

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

按钮的逻辑片段:

        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

4 回答 4

1

我认为这可能是因为您在 while 循环中执行所有这些操作,在您更改它之前,ui 没有机会重新绘制自己。

您可能也想在计时器滴答声中做减法部分,而不是一次性完成。

于 2013-02-05T22:01:16.027 回答
1

看起来您的第二个淡入淡出条件中有一个 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();
}

对于backButtonClickandbreakCheck值,我将它们放在表单的 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为假,alpha将增加直到达到MAX,然后停止计时器。

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

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

于 2013-02-05T22:53:44.503 回答
0

我假设你的意思是它跳过之后的部分:

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

我认为这不会执行,因为您停止增加 alpha 值 39 因为这条线:

if (alpha++ < 40)

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

if (alpha++ <= 40)
于 2013-02-05T21:53:04.800 回答
-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();
        }
    }
}

只需将我的代码复制并粘贴到文件 -> 新项目 -> WPF 应用程序中,然后自己查看结果。

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

于 2013-02-05T22:03:36.373 回答