这篇文章是很早之前写的,基于某些人“告发”我说有抄袭嫌疑,csdn管理员敦促我修改为转载,那么只好修改下(我无意于争论,没意思!值钱吗?我觉得我的分享仅仅是让技术更全面,的确这边文章有参考其他文章的部分内容或技术--请问谁的知识不是从网络或书籍等媒介学过来的?但我的目的仅仅是贴上去供大家参考,至于这部分内容是谁写的,有必要计较吗?对于告发的人,我只能冷笑!)duilib我早已熟透,自己也有一个经过项目实践修改的duilib库,如果大伙有什么不懂得技术,可以给我邮件(lixiang6153@126.com),如果能帮到大家忙的,尽力而为!不要给我私信,csdn我仅仅是作为分享技术的平台,仅此而已!(微博空间太多了,我完全可以分享到其他微博上去)
Duilib是一个很强大的皮肤库,其中继承了标签Label、按钮Button、单选复选Option、下拉框ComBo以及列表控件List和树控件Tree、DataTime日期控件、Slider、Progress等等,基本上能满足所有需求;但是还是有很多控件没有,如时间控件,或者有特殊需求,在duilib中嵌入自己的窗口(比如视频模仿窗口),二这样的需求是duilib没法满足的,所以duilib中必须能嵌入MFC中得控件以便我们能方便使用!
这里示例将MFC按钮放到duilib滑块条控件的位置:
// 将带句柄HWND的控件显示到CControlUI上面 class CWndUI: public CControlUI { public: CWndUI(): m_hWnd(NULL){} virtual void SetInternVisible(bool bVisible = true) { __super::SetInternVisible(bVisible); ::ShowWindow(m_hWnd, bVisible); } virtual void SetPos(RECT rc) { __super::SetPos(rc); ::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE); } BOOL Attach(HWND hWndNew) { if (! ::IsWindow(hWndNew)) { return FALSE; } m_hWnd = hWndNew; return TRUE; } HWND Detach() { HWND hWnd = m_hWnd; m_hWnd = NULL; return hWnd; } protected: HWND m_hWnd; };
2、将XML中Slider节点换成Wnd,并且只保留位置信息,XML如下:
<Wnd float="true" pos="30,77,0,0" width="139" height="18" />
3、创建Wnd控件:由于Slider是duilib内置的控件,所以duilib会根据XML信息自动创建Slider控件,而CWndUI是我们自定义的控件,所以需要自己创建,只需要响应CreateControl函数(如果duilib发现自定义控件,会自动调用此函数来获取控件),在CDuiFrameWnd加上如下函数:
virtual CControlUI* CreateControl(LPCTSTR pstrClassName) { if (_tcsicmp(pstrClassName, _T("Wnd")) == 0) { CWndUI *pUI = new CWndUI; HWND hWnd = CreateWindow(_T("BUTTON"), _T("win32"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 0, 0, 0, 0, m_PaintManager.GetPaintWindow(), NULL, NULL, NULL); pUI->Attach(hWnd); //// 上面用的是win32的按钮,下面这段用MFC的按钮 //CButton *pBtn = new CButton; // 记得释放内存 //pBtn->Create(_T("MFC"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, CRect(0, 0, 0, 0), CWnd::FromHandle(m_PaintManager.GetPaintWindow()), 0); //pUI->Attach(*pBtn); return pUI; } return NULL; }
上面的代码用了win32的按钮,其中注释部分是MFC按钮,亲们可以都试下效果:
![](http://images.cnitblog.com/blog/570549/201310/05184034-1a9872738d594431a7ce0e4e8090e1e9.jpg)
回到win32就行了,我们只需截获WM_COMMAND,而duilib的WM_COMMAND等windows消息可以在HandleMessage函数里截获,代码如下:
LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_COMMAND: if (IDC_BUTTON_DUI_NEXT == wParam) { if (m_pDlgMain) { m_pDlgMain->OnBnClickedButtonPlayNext(); } } break; default: break; } return __super::HandleMessage(uMsg, wParam, lParam); }