自画菜单的WM_MEASUREITEM只会发送一次
最 近收到一个动态显示隐藏菜单项的需求。通常我们编程时,如果有不同场合需要使用不同的菜单,一般的做法是准备两个菜单资源,然后在需要的时候转载某一个菜单来替代先前的。这样的做法比较简单,但是如果变化很多,需要准备的菜单资源太多,对资源的消耗不能不考虑,所以也会有在代码中动态修改菜单的做法。这里用到的是插入和删除操作。
当然所谓显示和隐藏也可以用插入和删除来实现。但是我本来的想法如果能够可以实现显示和隐藏,也许比插入和删除更方便。因为是自画菜单,我就想当然的认为如果在WM_MEASUREITEM时设置菜单项的高度为0,就可以实现隐藏菜单的效果。于是用这个原理修改了代码。然而实际的效果却不是如预期的那样,经调试发现:WM_MEASUREITEM消息只发送一次,就是说,当菜单第二次显示的时候,使用的是第一次WM_MEASUREITEM消息返回的尺寸。这样,就没法动态修改了。
附带发现的问题是:自画菜单是动态计算文字所需要的宽度,以决定菜单所需要的宽度的。然而由于WM_MEASUREITEM消息只发送一次,那么如果动态修改菜单的文字,菜单宽度是不会改变的,这样很容易产生动态修改后的菜单文字被截断的问题。
发现了问题,却没有好的解决方案。看来当需要修改自画菜单时,最好的方式还是删除它,然后重新插入。
最后感慨一下,太多的想当然往往都是错的,某些解决方案看似不合理,往往是最合理的
当然所谓显示和隐藏也可以用插入和删除来实现。但是我本来的想法如果能够可以实现显示和隐藏,也许比插入和删除更方便。因为是自画菜单,我就想当然的认为如果在WM_MEASUREITEM时设置菜单项的高度为0,就可以实现隐藏菜单的效果。于是用这个原理修改了代码。然而实际的效果却不是如预期的那样,经调试发现:WM_MEASUREITEM消息只发送一次,就是说,当菜单第二次显示的时候,使用的是第一次WM_MEASUREITEM消息返回的尺寸。这样,就没法动态修改了。
附带发现的问题是:自画菜单是动态计算文字所需要的宽度,以决定菜单所需要的宽度的。然而由于WM_MEASUREITEM消息只发送一次,那么如果动态修改菜单的文字,菜单宽度是不会改变的,这样很容易产生动态修改后的菜单文字被截断的问题。
发现了问题,却没有好的解决方案。看来当需要修改自画菜单时,最好的方式还是删除它,然后重新插入。
最后感慨一下,太多的想当然往往都是错的,某些解决方案看似不合理,往往是最合理的
posted on 2004-11-22 11:38 vibration 阅读(2989) 评论(6) 编辑 收藏 举报