最近由于公司要换界面 库所以想起了我之前用过的DUIlib 虽然之前也没有多深入但是能趁着这个机会把这个库用好。这个库由于网上版本较多,所以选择了旗舰版的一个分支,到目前还不错。功能其实比较简单,就是窗口有一排按钮要将按钮拖放到一块区域内然后根据按钮名创建对应得节点,这个功能在MFC 上其实很好实现,我这里有现成的例子,但是DUILIB虽然消息跟MFC 一样但是毕竟两个界面库肯定不能像MFC 那样做。好在这个库比较成熟了提供不少机制。这个问题其实也困扰了我好几天,首先按钮类要实现拖拽的效果并且加移动的阴影,原生的类肯定不行所以只能重写自定义,具体怎么自定义的就不说了。其实最重要的就是要处理,鼠标按下,弹起,和移动的事件然后绘制就可以了。而要实现在布局上获取控件的名字就比较难了。所以在网上找了一下发现只有鼠标悬停获取布局名字的代码,并没有获取当前控件名字的解决方案。于是我想了一下,我们拖拽的步骤是:鼠标按下->鼠标移动到制定位置->鼠标弹起--这样我们获取的控件名字才是我们想要的。于是我想如果能够在当前的窗口中响应鼠标弹起不就行了吗。但是自定义的控件事件理论上是由控件自己响应的所有只能想别的办法:控件->onevent+=MakeDelegate()这样其实可以截获按钮本身的控件,然后我们自己来处理,这个函数有2个重载 一个是MakeDelegate(&OnbtnEvent); 一个MakeDelegate(this, &CScpEditUI::OnbtnEvent);大家可以根据需要重载其中一个,然后在OnbtnEvent 里面((TEventUI*)event)->pSender->GetName()就是当前控件的名称,那么如何获得当前鼠标悬停的布局的名称呢。其实这个挺简单的
CControlUI* pHover = GetManager()->FindControl(((TEventUI*)event)->ptMouse);//获取当前放开按钮的位置是在哪个布局中
CVerticalLayoutUI*pVer = (CVerticalLayoutUI*)pHover;
pVer-getname就是当前布局的名字。如果布局有名字的话。
GetManager()是一个CPaintManagerUI的一个指针 其他版本可能是一个对象。((TEventUI*)event)->ptMouse这个就比较好理解了当前鼠标的位置。获取到了当前的布局和当前按钮名其实就比较好做了。