如题。用InsertMenuItem增加菜单项。其MENUITEMINFO结构中的fMask成员设为MIIM_TYPE,fType成员设为MFT_BITMAP | MFT_OWNERDRAW,dwTypeData成员设为要显示的位图句柄后,涉及到自绘的两个消息:WM_MEASUREITEM和WM_DRAWITEM,我遇到的问题是Windows只发送后者。这样导致无法自定义菜单项尺寸。
不知道大家是不是也遇到过这种情况。是的话,怎样解决?

解决方案 »

  1.   

    补充一下。Windows在新版本的MSDN中,MENUITEMINFO结构有所改变,就是最后多了成员hbmpItem
    这样这个问题可以直接把fMask设为新的常数MIIM_BITMAP解决。不过对于自画菜单,必须把hbmpItem设置为HBMMENU_CALLBACK,这样Windows才会传回上述的两个消息。
    这样,就又产生了一个新问题:自画菜单用的位图句柄往哪儿保存?
    一种想法是另建一个模块级的结构数组,保存每个条目的各个参数。不过这样一是增加了开销,另外也失去了MENUITEMINFO结构本来的意义。
    另一种想法是保存在MENUITEMINFO结构的dwItemData成员中,这倒是一个不错的想法。不过,不知大家注意了没有,在WM_MEASUREITEM消息中,Windows给我们的信息有限,从wParam和lParam中无法获得条目所在菜单句柄,这样就不能调用GetMenuItemInfo函数取回条目参数(这些条目对于设置自绘菜单的尺寸是绝对必要的)。
    所以,只要不用自定义的模块级的结构数组,菜单句柄就要保存在dwItemData中,以便在WM_MEASUREITEM消息取回菜单句柄,进而获取菜单种类(字符串、分割条、图片等),从而分别设置宽、高。
    这样就产生了矛盾。请问大家怎样解决?