重写了CMenu,设置了MF_OWNERDRAW,自己绘制按钮颜色,然后hook了WM_Print绘制按钮边框,弹出一级菜单边框重绘没有问题,但是弹出二级菜单时,系统没有发送WM_PRINT消息,我也就没有重绘边框。下面是hook函数中的几个信息,供参考。现在想知道二级菜单弹出时发送的消息,然后hook之,并重绘边框。
附特殊情况:如果主窗口很小,弹出二级菜单移动了,即发了WM_WINDOWPOSCHANGING消息,后重发了WM_PRINT绘制边框,则可以显示正确。这是没有重绘边框的情况
WM_WINDOWPOSCHANGING.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGED.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGING.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :
Draw Item.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :一级菜单
Draw Item.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :一级菜单
WM_PRINT.....17 H-59 mm-18 ss,The Rect is 494,85,821,210,button name :
WM_WINDOWPOSCHANGED.....17 H-59 mm-18 ss,The Rect is 0,0,0,0,button name :
Draw Item.....17 H-59 mm-21 ss,The Rect is 0,19,321,35,button name :选中某一级
Draw Item.....17 H-59 mm-22 ss,The Rect is 0,0,0,0,button name :二级菜单
Draw Item.....17 H-59 mm-23 ss,The Rect is 0,19,321,35,button name :反选一级
WM_WINDOWPOSCHANGING.....17 H-59 mm-23 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGED.....17 H-59 mm-23 ss,The Rect is 0,0,0,0,button name :重绘了边框的调试信息:WM_WINDOWPOSCHANGING.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGING.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :
Draw Item.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :一级菜单
Draw Item.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :一级菜单
WM_PRINT.....18 H-4 mm-3 ss,The Rect is 579,132,906,257,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-3 ss,The Rect is 0,0,0,0,button name :
Draw Item.....18 H-4 mm-6 ss,The Rect is 0,19,321,35,button name :选中某一级
WM_WINDOWPOSCHANGING.....18 H-4 mm-6 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-6 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGING.....18 H-4 mm-6 ss,The Rect is 0,0,0,0,button name :
Draw Item.....18 H-4 mm-6 ss,The Rect is 0,0,0,0,button name :二级菜单
WM_PRINT.....18 H-4 mm-6 ss,The Rect is 0,0,97,44,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-6 ss,The Rect is 0,0,0,0,button name :
Draw Item.....18 H-4 mm-8 ss,The Rect is 0,19,321,35,button name :反选一级
WM_WINDOWPOSCHANGING.....18 H-4 mm-8 ss,The Rect is 0,0,0,0,button name :
WM_NCPAINT.....18 H-4 mm-8 ss,The Rect is 579,132,906,257,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-8 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGING.....18 H-4 mm-8 ss,The Rect is 0,0,0,0,button name :
WM_WINDOWPOSCHANGED.....18 H-4 mm-8 ss,The Rect is 0,0,0,0,button name :

解决方案 »

  1.   

    大概总结出:无论一级二级菜单,下面的消息模式是正确的,在WM_PRINT中绘制自己的边框
    WM_WINDOWPOSCHANGING
    Draw Item
    Draw Item
    WM_PRINT.
    WM_WINDOWPOSCHANGED
    但是,弹出二级菜单的时候,菜单可能没有WM_WINDOWPOSCHANGING,
    于是就没有发送 WM_PRINT,则没有绘制自己的边框
    相应的,如果主界面比较小,二级菜单会WM_WINDOWPOSCHANGING,WM_PRINT,于是绘制边框正确。
    现在的想法是,hook二级菜单弹出时发送的消息,然后把WM_PRINT里面的画边框的代码复制过去,就解决问题了,求教应该相应哪个消息。
      

  2.   

    好像不用这么复杂的,直接重载DrawItem函数就可以了。这个函数能够传递一个CDC指针和当前的菜单选定状态的。
    至于边框的色彩,你可以在菜单的CRect内部绘制,不要绘制在CRect的外部,就容易多了
      

  3.   

    是说假设有5个按钮,就在每次drawItem的时候绘制,绘制5次边框?而不是正常的绘一次将五个都框起来?
      

  4.   


    在DrawItem里面,根据itemState进行判断,客户区使用itemRect。
      

  5.   

    后来发现是menu进行load后,又load了另一个menu,将第二个menu的load推迟到第一个menu的trackpopup后就好了,但是为啥还是没搞明白暂时结贴吧。。