我目前正在为我的课程项目制作一个Rythm游戏,我在实现BGM开/关按钮时遇到了麻烦。
下面是我的简化代码:
- 表格一**
public partial class Form1 : Form
{
public SplashScreen()
{
InitializeComponent();
string path= System.Reflection.Assembly.GetEntryAssembly().Location;
axWindowsMediaPlayer1.settings.volume = 0;
axWindowsMediaPlayer1.Ctlcontrols.stop();
axWindowsMediaPlayer1.URL = path.Remove(path.Length - 44) + "\\assets\\main.wav";
}
void BGMoff()
{
axWindowsMediaPlayer1.settings.mute = true;
}
void BGMon()
{
axWindowsMediaPlayer1.settings.mute = false;
}
private void Form1_Load(object sender, EventArgs e)
{
Form2 main = new Form2();
main.BGM_off += BGMoff;
main.BGM_on += BGMon;
}
}
- 表格二**
public partial class Form2 : Form
{
public delegate void ClickButton();
public event ClickButton BGM_off;
public event ClickButton BGM_on;
bool BGM = true
public void button4_Click_1(object sender, EventArgs e)
{
if (BGM)
{
button4.BackgroundImage = Properties.Resources.BGMoff;
BGM = false;
BGM_off?.Invoke();
}
else
{
button4.BackgroundImage = Properties.Resources.BGMon;
BGM = true;
BGM_on?.Invoke();
}
}
}
这是根据Darin对this thread的评论做出的。我相信我正确地按照步骤访问了axWindowsMediaPlayer
,但是我错了。
3条答案
按热度按时间tag5nh1u1#
通过创建第二个窗体并将其保存在变量中,然后从该变量调用函数,可以轻松地调用另一个窗体的函数。
s4n0splo2#
看起来您的问题是在
Form1_Load
的此行中:main
创建为局部变量。在分配它并注册到事件之后,它就超出了作用域。
您可以将其改为
Form1
的成员变量:这样,
main
的生存期将与您的Form1
的生存期相关。您在
Form1_Load
中的代码应为:ryoqjall3#
经过数小时令人沮丧的代码实验,我意识到我的错误。
这是我甚至没有包括的代码的一部分,因为它与事件处理本身有点无关。
main.Show(this);
是罪魁祸首。它是用来打开新表单的代码,也就是在菜单之间切换。我正在创建Form2的新对象form2
,并转到那里,而不是我们注册事件的地方,因此事件返回null。并且无法执行函数。