是一個關于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;
}
uj5u.com熱心網友回復:
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;
uj5u.com熱心網友回復:
但是不知道怎么回事,關鍵的功能都在那個選單里,不能沒有呀uj5u.com熱心網友回復:
求求大神們,萌新第一次發帖求助
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/87048.html
標籤:Windows客戶端使用
