是一个关于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;
}   

解决方案 »

  1.   

    create部分
    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;