VC++のBCMenuクラス内でプログラムが落ちる
VC++のBCMenuを使っている。
BCMenu : http://www.rocscience.com/~corkum/BCMenu.html
http://www.codeproject.com/Articles/22/Cool-Owner-Drawn-Menus-with-Bitmaps-Version-3-03 (3.033がダウンロード可能)
しかし、BCMenuクラス内で落ちることがあった。
・プログラム内で、以下のようにセパレータを追加
BCMenu* pSubMenu;
...
CMenu* pMenu = (CMenu*)pSubMenu;
pMenu->InsertMenu(2, MF_BYPOSITION|MF_SEPARATOR);
・その後、追加したセパレータを削除
・削除したセパレータより下にセパレータがあった場合、このセパレータの表示がおかしくなるもしくは、プログラムが落ちる
プログラムをおったところ、BCMenuData であるはずのものが、CString になってたりした。なので、上記の部分を発見。修正した。
(なぜ、CMenu* にキャストしていたかは謎。)
ついでに、BCMenu の2点おかしなところを発見。
1. 無意味コード
1426行目付近
else if (nFlags&MF_STRING){
ASSERT(!(nFlags&MF_OWNERDRAW));
ModifyMenu(pos,nFlags,nID,mdata->GetString());
}
は、MF_STRING が 0 なので、絶対に if文の中は実行されない
2. 無意味指定
1990行目付近
if(!mdata)mdata=NewODMenu(j,
state|MF_BYPOSITION|MF_SEPARATOR|MF_OWNERDRAW,0,_T(""));//SK: modified for Unicode correctness
の MF_BYPOSITION の指定は意味なし。
ソースを読む限り、BCMenuData->nFlagsに MF_BYPOSITION は、指定しても無意味。