向各位高手请教:同一个消息在两个窗体上都作了映射,是否会了问题?

rockhard 2002-09-03 05:00:11
首先大致说一下我的程序思路:

我要在程序主窗体启动时循环播放一段MIDI音乐,当打开另一个窗体时循环播放另一段MIDI音乐,由于要循环播放,因此对MM_MCINOTIFY进行了消息映射。

class TMainForm : public TForm
{
__published: // IDE-managed Components

......

private: // User declarations

MCIDEVICEID m_wDeviceID;
MCI_PLAY_PARMS PlayParms;
void __fastcall CycleRelay(TMessage Message);
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_MCINOTIFY,TMessage,CycleRelay);//进行了消息映射
END_MESSAGE_MAP(TForm);
};

//在另一窗体Question也有同样的代码

class TQuestion : public TForm
{
__published: // IDE-managed Components

......

private: // User declarations

MCIDEVICEID m_wDeviceID;
MCI_PLAY_PARMS PlayParms;
void __fastcall CycleRelay(TMessage Message);
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_MCINOTIFY,TMessage,CycleRelay);//进行了消息映射
END_MESSAGE_MAP(TForm);
};

问题是当我刚进了程序时,可以播放主窗体的背景音乐,进入Question窗体时也可以正常播放背景音乐。但当我退出Question窗体时无论如何都不能再播放主窗体的背景音乐了。因此怀疑是我对同一个消息进行了两次映射造成的。

提出如下:
1、如果对同一个消息在两个窗体里都作了映射,如何做到在不同的窗体对同一个消息做不同的处理

2、如果不能解决上面的问题,如何做到我开启第二个窗体进播放另一段MIDI音乐。
...全文
29 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockhard 2002-09-11
  • 打赏
  • 举报
回复
给分了
hx 2002-09-09
  • 打赏
  • 举报
回复
算了,我帮你解决问题吧。。
笨。。你就不会,把句柄,改过来吗?
hx 2002-09-09
  • 打赏
  • 举报
回复
发了,给分吧。。
hx 2002-09-09
  • 打赏
  • 举报
回复
我来提供GG。
我不懂电脑 2002-09-04
  • 打赏
  • 举报
回复
不会,两个窗体是不同的。
rockhard 2002-09-04
  • 打赏
  • 举报
回复
OnShow事件里的代码肯定执行了,我都调试过好多次了。
耙子 2002-09-03
  • 打赏
  • 举报
回复
你把你的OnFormShow的事件写在OnActive 里面看看,变成当前焦点的都会触发这个事件,失去焦点的会触发OnDeactive事件。
rockhard 2002-09-03
  • 打赏
  • 举报
回复
这是显示QuestionForm的代码
void __fastcall TMainForm::Label4Click(TObject *Sender)
{
TQuestionForm *QuestionForm=new TQuestionForm(NULL);
QuestionForm->Show();
Hide();
}

根本没有关闭MainForm ,只是将它隐藏了一下。程序退出时才关闭的,但那已跟问题没有关系了
耙子 2002-09-03
  • 打赏
  • 举报
回复
你的MainForm的OnClose里面写了
Action=caFree;

那么你close的时候他就关闭了。
rockhard 2002-09-03
  • 打赏
  • 举报
回复
去掉那一句也不行。其实那一句只在退出程序时才执行,我打开Question窗体时根本不有关闭MainForm,只是将它Hide(),然后在需要的时候再Show()出来。
rockhard 2002-09-03
  • 打赏
  • 举报
回复
我试试注释掉那一行
RedProgramer 2002-09-03
  • 打赏
  • 举报
回复
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
//mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
}
你这样修改试试
rockhard 2002-09-03
  • 打赏
  • 举报
回复
与播放MIDI音乐有关的所有代码:

//////// 主窗体中的 /////////////////////////////////

//上面的映射函数体,使MIDI音乐循环播放
void __fastcall TMainForm::CycleRelay(TMessage Message)
{
if(Message.WParam==1)
{
mciSendCommand(m_wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);
mciSendCommand (m_wDeviceID, MCI_PLAY, MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);
}
}
//-----------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
}
//-----------------------------------------------------------------


//问题就在此,第一次运行程序可以放,但当启动Question窗体后再显示这个窗体就不播放音乐了。
void __fastcall TMainForm::FormShow(TObject *Sender)
{
MCI_OPEN_PARMS OpenParms;

OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER;//MIDI类型
OpenParms.lpstrElementName = "BckGrd.mid";//"BckGrd.mid";
OpenParms.wDeviceID = 0;

mciSendCommand(NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &OpenParms);

m_wDeviceID=OpenParms.wDeviceID;
PlayParms.dwCallback =(DWORD) this->Handle;

mciSendCommand(m_wDeviceID, MCI_PLAY, MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);
//-----------------------------------------------------------------
void __fastcall TMainForm::FormHide(TObject *Sender)
{
mciSendCommand (m_wDeviceID, MCI_PAUSE, NULL, NULL);
}


Question窗体播放音乐的代码与上几乎一样

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧