読者です 読者をやめる 読者になる 読者になる

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 は、指定しても無意味。