仿酷狗音乐播放器开发日志二十五 duilib右键事件的不足的bug修复

转载请说明原出处,谢谢~~

       虽然仿酷狗的各个菜单早就写好了,但是一直没有附加到程序里。今天把菜单和播放列表控件关联时发现了问题。

       和播放列表相关的菜单有三个,分别是每个音乐项目控件相关的菜单、分组的菜单、音乐电台的菜单。应该的效果如下:


       原本我想着只要给对应的控件设置menu属性,然后在代码里响应消息弹出菜单就可以了。但是实际测试发现,控件根本无法响应到menu消息,原因在于:音乐项目、电台项目这些控件都是靠许多子控件组合而成的,换句话就是他们上面覆盖了很多其他子控件,子控件挡住了音乐项目和电台项目控件的界面,让他无法响应menu消息。

      如果把音乐项目、电台项目控件的所以子控件都加上menu消息并且处理,是可以正常弹出菜单的。但是这不是一个优雅的解决办法。

      在duilib中,右键菜单的消息事件是UIEVENT_CONTEXTMENU,对应的系统消息是WM_CONTEXTMENU。他在CControlUI类的DoEvent函数中被处理,但是函数处理完成后直接return;返回,并没有把消息传递给父控件,所以导致了这个bug。源码如下:

		if( event.Type == UIEVENT_CONTEXTMENU )
		{
			if( IsContextMenuUsed() ) {
				m_pManager->SendNotify(this, DUI_MSGTYPE_MENU, event.wParam, event.lParam);
				return;
			}
		}

      在这里直接把return;语句注释掉就可以了。然后我在音乐和电台控件中增加了UIEVENT_CONTEXTMENU消息的处理代码。这样就可以正常使用右键菜单了。

        剩下的就是在主窗体的Notify函数里正常处理menu消息了。


  Redrain  2014.8.27

原文地址:https://www.cnblogs.com/redrainblog/p/3946585.html