duilib中使用MFC控件

          这篇文章是很早之前写的,基于某些人“告发”我说有抄袭嫌疑,csdn管理员敦促我修改为转载,那么只好修改下(我无意于争论,没意思!值钱吗?我觉得我的分享仅仅是让技术更全面,的确这边文章有参考其他文章的部分内容或技术--请问谁的知识不是从网络或书籍等媒介学过来的?但我的目的仅仅是贴上去供大家参考,至于这部分内容是谁写的,有必要计较吗?对于告发的人,我只能冷笑!)duilib我早已熟透,自己也有一个经过项目实践修改的duilib库,如果大伙有什么不懂得技术,可以给我邮件(lixiang6153@126.com),如果能帮到大家忙的,尽力而为!不要给我私信,csdn我仅仅是作为分享技术的平台,仅此而已!(微博空间太多了,我完全可以分享到其他微博上去)

         Duilib是一个很强大的皮肤库,其中继承了标签Label、按钮Button、单选复选Option、下拉框ComBo以及列表控件List和树控件Tree、DataTime日期控件、Slider、Progress等等,基本上能满足所有需求;但是还是有很多控件没有,如时间控件,或者有特殊需求,在duilib中嵌入自己的窗口(比如视频模仿窗口),二这样的需求是duilib没法满足的,所以duilib中必须能嵌入MFC中得控件以便我们能方便使用!

这里示例将MFC按钮放到duilib滑块条控件的位置:

    1、准备好一个duilib控件来容纳MFC控件,代码如下:
// 将带句柄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按钮,亲们可以都试下效果:

    
    到现在为止,我们既可以在duilib中添加MFC控件,也可以在原有的MFC项目中添加duilib控件,就不用再担心不能使用以前的控件啦~O(∩_∩)O~
 
duilib中MFC控件的响应

回到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);
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
duilib 是一个基于C++的GUI库,用于构建Windows平台上的桌面应用程序。CEF(Chromium Embedded Framework)是一个开源项目,用于将Chromium引擎集成到其他应用程序,实现浏览器功能。在duilib使用CEF件可以实现在应用程序嵌入一个内置的浏览器。 要在duilib使用CEF件,首先需要下载CEF的二进制文件,并将相应的头文件和库文件链接到duilib项目。然后在duilib的UI布局文件添加一个容器件用来承载CEF件,比如一个<Control>标签定义一个名为"browser"的件。接着在C++代码通过CreateControl()方法创建CEF件并将其添加到布局的容器。 在CEF加载网页可以通过调用LoadURL()方法来实现,比如在初始化时可以加载一个初始的网页。同时也可以通过CEF提供的接口来处理网页加载完成、前进后退等事件。另外,也可以在CEF的执行JavaScript代码,比如修改网页内容或者与网页交互等。 当应用程序退出时,需要通过调用CEF件的Close()方法来释放资源并关闭CEF的相关进程。另外,需要确保在适当的时候调用CEF的资源释放方法,比如在窗口销毁前调用Shutdown()方法来释放资源。 在duilib使用CEF件可以帮助开发者实现嵌入式浏览器功能,比如在应用程序展示在线内容或者实现基于web的功能。同时也能够与duilib的其他件进行交互,实现更加丰富的用户体验。通过合理的使用和管理,可以让应用程序在集成CEF件的同时保持稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值