是一个关于midi的程序,我照抄《Windows程序设计(第四版)》的。
代码对照无误,编译也可以通过,但是运行窗口加载不出来,电脑会卡住。
通过排查发现是创建菜单函数里面的问题,把那句创建菜单的注释掉窗口就出来了。但是这部分我又对照了一下书本,还是没发现有什么错,求大神帮忙看一下。HMENU CreateTheMenu(int iNumDevs)
{
TCHAR szBuffer[32];
HMENU hMenu,hMenuPopup,hMenuSubPopup;
int i,iFam,iIns;
MIDIOUTCAPS moc;
hMenu=CreateMenu();
hMenuPopup=CreateMenu();
AppendMenu(hMenuPopup,MF_STRING,IDM_OPEN,TEXT("&Open"));
AppendMenu(hMenuPopup,MF_STRING|MF_CHECKED,IDM_CLOSE,TEXT("&Closed"));
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Status"));
hMenuPopup=CreateMenu();
if(!midiOutGetDevCaps(MIDIMAPPER,&moc,sizeof(moc)))
AppendMenu(hMenuPopup,MF_STRING,IDM_DEVICE+(int) MIDIMAPPER,moc.szPname);
else
iDevice=0;
for(i=0;i<iNumDevs;i++)
{
midiOutGetDevCaps(i,&moc,sizeof(moc));
AppendMenu(hMenuPopup,MF_STRING,IDM_DEVICE+i,moc.szPname);
}
CheckMenuItem(hMenuPopup,0,MF_BYPOSITION|MF_CHECKED);
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Device"));
hMenuPopup=CreateMenu();
for(i=0;i<16;i++)
{
wsprintf(szBuffer,TEXT("%d"),i+1);
AppendMenu(hMenuPopup,MF_STRING|(i?MF_UNCHECKED:MF_CHECKED),IDM_CHANNEL+i,szBuffer);
}
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Channel"));
hMenuPopup=CreateMenu();
for(iFam=0;iFam<16;i++)
{
hMenuSubPopup=CreateMenu();
for(iIns=0;iIns<8;iIns++)
{
wsprintf(szBuffer,TEXT("&%d.\t%s"),iIns+1,fam[iFam].inst[iIns].szInst );
AppendMenu(hMenuSubPopup,MF_STRING|(fam[iFam].inst[iIns].iVoice?MF_UNCHECKED:MF_CHECKED),fam[iFam].inst[iIns].iVoice+IDM_VOICE,szBuffer);
}
wsprintf(szBuffer,TEXT("&%c.\t%s"),'A'+iFam,fam[iFam].szFam);
AppendMenu(hMenuPopup,MF_STRING|MF_POPUP , (UINT) hMenuSubPopup,szBuffer);
}
AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT) hMenuPopup,TEXT("&Voice")) ;
return hMenu;
}
代码对照无误,编译也可以通过,但是运行窗口加载不出来,电脑会卡住。
通过排查发现是创建菜单函数里面的问题,把那句创建菜单的注释掉窗口就出来了。但是这部分我又对照了一下书本,还是没发现有什么错,求大神帮忙看一下。HMENU CreateTheMenu(int iNumDevs)
{
TCHAR szBuffer[32];
HMENU hMenu,hMenuPopup,hMenuSubPopup;
int i,iFam,iIns;
MIDIOUTCAPS moc;
hMenu=CreateMenu();
hMenuPopup=CreateMenu();
AppendMenu(hMenuPopup,MF_STRING,IDM_OPEN,TEXT("&Open"));
AppendMenu(hMenuPopup,MF_STRING|MF_CHECKED,IDM_CLOSE,TEXT("&Closed"));
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Status"));
hMenuPopup=CreateMenu();
if(!midiOutGetDevCaps(MIDIMAPPER,&moc,sizeof(moc)))
AppendMenu(hMenuPopup,MF_STRING,IDM_DEVICE+(int) MIDIMAPPER,moc.szPname);
else
iDevice=0;
for(i=0;i<iNumDevs;i++)
{
midiOutGetDevCaps(i,&moc,sizeof(moc));
AppendMenu(hMenuPopup,MF_STRING,IDM_DEVICE+i,moc.szPname);
}
CheckMenuItem(hMenuPopup,0,MF_BYPOSITION|MF_CHECKED);
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Device"));
hMenuPopup=CreateMenu();
for(i=0;i<16;i++)
{
wsprintf(szBuffer,TEXT("%d"),i+1);
AppendMenu(hMenuPopup,MF_STRING|(i?MF_UNCHECKED:MF_CHECKED),IDM_CHANNEL+i,szBuffer);
}
AppendMenu(hMenu,MF_STRING|MF_POPUP, (UINT) hMenuPopup,TEXT("&Channel"));
hMenuPopup=CreateMenu();
for(iFam=0;iFam<16;i++)
{
hMenuSubPopup=CreateMenu();
for(iIns=0;iIns<8;iIns++)
{
wsprintf(szBuffer,TEXT("&%d.\t%s"),iIns+1,fam[iFam].inst[iIns].szInst );
AppendMenu(hMenuSubPopup,MF_STRING|(fam[iFam].inst[iIns].iVoice?MF_UNCHECKED:MF_CHECKED),fam[iFam].inst[iIns].iVoice+IDM_VOICE,szBuffer);
}
wsprintf(szBuffer,TEXT("&%c.\t%s"),'A'+iFam,fam[iFam].szFam);
AppendMenu(hMenuPopup,MF_STRING|MF_POPUP , (UINT) hMenuSubPopup,szBuffer);
}
AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT) hMenuPopup,TEXT("&Voice")) ;
return hMenu;
}
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextExtentPoint(hdc,TEXT("M"),1,&size);
cxCaps=size.cx;
cyChar=size.cy;
ReleaseDC(hwnd,hdc);
SetScrollRange(hwnd,SB_HORZ,1,127,FALSE);
SetScrollPos(hwnd,SB_HORZ,iVelocity,TRUE);
SetScrollRange(hwnd,SB_VERT,0,16383,FALSE);
SetScrollPos(hwnd,SB_VERT,8192,TRUE);
if(0==(iNumDevs=midiOutGetNumDevs()))
{
MessageBeep(MB_ICONSTOP);
MessageBox(hwnd,TEXT("No MIDI output devices!"),szAppName,MB_OK|MB_ICONSTOP);
return -1;
}
//SetMenu(hwnd,CreateTheMenu(iNumDevs)); 把这个屏蔽掉就可以运行了
return 0;