由于最近换工作的原因,也没啥事,就简单学习了一下cef3和duilib,楼主之前是做MFC框架下的windows开发的,对界面库和新的客户端开发模式也有所了解,现在的大部分客户端都是基本的客户端框架下组合一个web 容器,web容器当然要看google的开源引擎cef3了,像Qt最近的版本好像也集成了,钉钉,微信、这些桌面应用都是基于web的客户端来开发的。

  所以楼主就也想学习一下,学习东西最快的方式就是做项目!!!所以我选择了duilib做界面,因为这个库是基于win32的,也是开源的,我也比较熟悉,然后web引擎当然是cef3了,开源的。花了一个星期吧话不多说,先放图

  主界面:

    

  动态图演示:

程序实现简单介绍:

  软件包括部分:界面绘图+容器填充。

  一开始我是先在Github上面下载了开源的duilib,然后看了看,模仿了里面的几个Demo例子,就开始动手。

Duilib界面设计,一部分是手写xml,这个我相信大家看了几个Demo之后就可以上手写了,然后再看一下网上的几篇布局的教程,Redrain写的,就可以了,界面控件与XML文件控件的对应关系要理解,实现的时候我是使用了 WindowImplBase这个类,所有与界面相关的操作只需要继承这个即可完成,实现简单的功能无非就是按钮的响应,按钮的选择等等,这些只需要到Notify(TNotifyUI& msg);函数中去处理,细节不多说,Duilib是可以根据xml中的控件名字去映射到控件类,

 CTabLayoutUI*pTabTest=static_cast<CTabLayoutUI*>(m_PaintManager.FindControl(_T("tabTest")));

  以上语句就是通过xml中的tabTest去定位到pTabTest,所有的控件都可以这样定位,定位到控件就简单了,剩下的控件操作看duilib提供的API文档即可。

  下面是界面的主界面类,包含web容器窗口的调整,主界面控件响应的操作实现,相信看过两次duilib的人都能看懂,这下面的WindowImplBase的虚函数接口是自己要实现的,

 class CMainFrame : public WindowImplBase
{
public:
CMainFrame();
virtual ~CMainFrame();
public:
LPCTSTR GetWindowClassName() const;
virtual void OnFinalMessage(HWND hWnd);
virtual void InitWindow();
virtual LRESULT ResponseDefaultKeyEvent(WPARAM wParam);
virtual UILIB_RESOURCETYPE GetResourceType() const;
virtual CDuiString GetSkinFile();
virtual CDuiString GetSkinFolder();
virtual CControlUI* CreateControl(LPCTSTR pstrClass);
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
void FirstLoadCef();
void HideCefWindow();
HWND GetMainWnd(){ return this->m_hWnd; }
protected:
void Notify(TNotifyUI& msg);
void OnPrepare(TNotifyUI& msg);
void OnExit(TNotifyUI& msg);
void OnTimer(TNotifyUI& msg);
//
void OnSelChanged(CControlUI* pSender);
void OnClick(CControlUI * pSender);
//cef
void AdjustCefWindow();
void UpdateTransString(int nNum);
//create wnd
void ShowTransSelectFrame();
void ShowWordClassifyFrame();
void ShowWordSortFrame();
void ShowWordManagerFrame();
void HideLayoutFrame();
void ShowMiniModeFrame();
private:
BOOL m_bIsInit;
CTransSelectWnd *m_pTransSelectFrame;
CWordClassifyWnd *m_pWordClassifyFrame;
CWordSortWnd *m_pWordSortFrame;
CWordManagerWnd *m_pWordManagerFrame;
CMiniModeWnd *m_pMiniModeFrame;
};

  界面实现就不写了,源码会分享给大家的。

  容器填充,就是通过cef3内核加载web界面了,这个也不难,复杂的功能我没用到,只是简单启动了一个cef3的浏览器渲染进程,

  这里只实现了两个类,就满足了要求:cef进程实例类和和维护具体浏览器句柄类,

 class SimpleApp
: public CefApp
, public CefBrowserProcessHandler
{
public:
SimpleApp();
virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
OVERRIDE{ return this; }
virtual void OnContextInitialized() OVERRIDE;
private:
IMPLEMENT_REFCOUNTING(SimpleApp);
}; class SimpleHandler
: public CefClient
, public CefDisplayHandler
, public CefLifeSpanHandler
{
public:
SimpleHandler();
virtual ~SimpleHandler();
virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE
{
return this;
}
virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE
{
return this;
} virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,const CefString& title) OVERRIDE;
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
CefRefPtr<CefBrowser> GetCurrentBrowser();
private:
typedef std::list<CefRefPtr<CefBrowser> > BrowserList;
BrowserList browser_list_; private:
IMPLEMENT_REFCOUNTING(SimpleHandler);
};

  两个类足够了,主函数启动的代码,

 CPaintManagerUI::SetInstance(hInstance);
#if defined(WIN32) && !defined(UNDER_CE)
HRESULT Hr = ::CoInitialize(NULL);
#else
HRESULT Hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
#endif
if( FAILED(Hr) ) return ;
CefMainArgs args(hInstance);
//创建CefApp实例
CefRefPtr<SimpleApp> app(new SimpleApp);
int exitCode = CefExecuteProcess(args, app, NULL);
if (exitCode >= )
{
return exitCode;
}
//填充这个结构体,定制CEF的行为。
CefSettings settings;
//初始化CEF
CefInitialize(args, settings, app, NULL);
CMainFrame* pFrame = new CMainFrame();
if( pFrame == NULL ) return ;
#if defined(WIN32) && !defined(UNDER_CE)
pFrame->Create(NULL, _T("PLApp"), UI_WNDSTYLE_FRAME, WS_EX_STATICEDGE | WS_EX_APPWINDOW, , , , );
#else
pFrame->Create(NULL, _T("PLApp"), UI_WNDSTYLE_DIALOG, WS_EX_TOPMOST, , , GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
#endif
HICON hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
::SendMessage(*pFrame, STM_SETICON, IMAGE_ICON, (LPARAM)(UINT)hIcon); pFrame->CenterWindow();
::ShowWindow(*pFrame, SW_SHOW);
//执行消息循环,此时会堵塞,直到CefQuitMessageLoop()函数被调用。
CefRunMessageLoop();
// 关闭CEF,释放资源
CefShutdown();

  加载浏览器的关键实现,使用g_handler句柄来操作,

 CefRefPtr<SimpleHandler> g_handler(new SimpleHandler());
CefBrowserSettings browser_settings;
CefWindowInfo window_info;
window_info.SetAsChild(m_hWnd, rt);
BOOL bSucced = CefBrowserHost::CreateBrowser(window_info
, g_handler
, _T("http://dict.youdao.com/?keyfrom=cidian")
, browser_settings
, NULL);

  关于以上代码的具体的功能解释我也不多说了,最近工作太累,博客也是刚更新的,希望这个我自己学习的代码对大家有点帮助,开放给大家,对cef3和duilib学习起到参考入门的作用,代码放在这里了,github : https://github.com/karllen/cef3-duilib-YDDemo  。

好了,博客完事,睡觉,明天看勇士和骑士的第四场比赛。

  对了:有道词典的一切资源文件归有道所有,禁止大家使用于商业用途,这个项目,仅供新手学习参考,如有侵权,联系我删除吧。

                                                                               邮箱 :1160113606@qq.com

cef3和duilib简单仿有道词典学习的更多相关文章

  1. 仿有道词典App开发

    最近在学习HCoder提供的仿有道词典App项目,该项目采用MUI为前端框架,服务端采用PHP,底层采用了H5+.

  2. python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序

    1.有道的翻译 网页:www.youdao.com Fig1 Fig2 Fig3 Fig4 再次点击"自动翻译"->选中'Network'->选中'第一项',如下: F ...

  3. python "爬虫+有道词典"实现一个简单翻译程序

    抓包软件使用的是Fiddler4 新版的查询接口 比较负责,引入了salt和sign http://fanyi.youdao.com/translate?smartresult=dict&sm ...

  4. 基于pygtk的linux有道词典

    基于pygtk的linux有道词典 一.桌面词典设计 想把Linux用作桌面系统,其中一部分障碍就是Linux上没有像有道一样简单易用的词典.其实我们完全可以自己开发一款桌面词典, 而且开发一款桌面词 ...

  5. Mac上的欧路词典单词本迁移到有道词典 #node.js

    摘要 有道词典提供了柯林斯和朗文辞典,加上最近在背单词且Mac版的屏幕取词也够用了,为了云单词本的同步,决定抛弃Mac上的欧路词典.单词欧路上的单词本也存了一百多个单词.怎样迁移到有道呢? 关键词:n ...

  6. bing词典vs有道词典对比测试报告——功能篇之细节与用户体验

    之所以将细节与用户体验放在一起讨论,是因为两者是那么的密不可分.所谓“细节决定成败”,在细节上让用户感受方便.舒适.不费心而且温馨,多一些人文理念,多一些情怀,做出来的产品自然比其他呆板的产品更受欢迎 ...

  7. Bing词典vs有道词典比对测试报告——功能篇之核心功能

    必应词典vs有道词典 核心功能对比 从应用的UI布局来看,这两款软件的功能如下: 相同 不同 必应词典 词典.例句.翻译 百科 有道词典 词典.例句.翻译 应用 就词典类软件来说,词典是最核心的功能. ...

  8. 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】

    1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...

  9. 有道词典for mac不能取词解决方案

    在mac上装了有道词典,发现在Chrome上不能取词,网上也没有搜到合适的解决方案,后来发现解决这个问题很简单,打开有道词典,点击设置, 再点击软件更新,就会发现有chrome取词插件,安装就OK了. ...

随机推荐

  1. 打印星号(*)三角形(C# Linq实现)的小例子

    以前看面试宝典(C#)的时候,记得有一道题是打印三角形的.比如下图: 记得那时候刚学C#花了我好长时间才做出来,那是用的方法没有使用到linq,现在使用Linq重新做一次.以下是代码: ; ; i & ...

  2. UITableView grouped样式使用探索

    UITableView的style有plain和grouped两种样式,两种样式各有不同的风格和功能,plain样式已经封装好了悬停功能,gouped样式则为我们在区头和区尾在实际项目开发中需要我们选 ...

  3. CF #edu 11 C. Hard Process

    题目链接:http://codeforces.com/problemset/problem/660/C 大意是给一个01数组,至多可以将k个0变为1,问最后数组中最长能有多少个连续的1,并输出. 问题 ...

  4. 关于使用mybatis的几点总结

    mybatis的几点总结 1.关于resultType和resultMap的使用 查询结果集统一采用resultType,不要采用resultMap,因为resultMap需要写许多的表字段和实体类的 ...

  5. JS面向对象,创建,继承

    很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...

  6. <java>枚举的简单介绍

    1.枚举,enum关键字,相当于public final static. 2.举例: 首先定义了一个名为spiciness的枚举类型. public enum Spiciness { NOT, MIL ...

  7. 微信小程序(兼容性问题)

    兼容 小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容. 文档会在组件,API等页面描述中带上各个功能所支持的版本号. 可以通过 wx.getSyst ...

  8. 阿里云主机试用之自建站点和ftp上传所遇的2个问题

    1.Access to the requested object is only available from the local network 其实我并没有自建站点,只是使用了XAMPP来建了ap ...

  9. Maven的简单搭建

    Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.接下来将从下面几个方向介绍maven: (1)Maven简单介绍 (2)Maven安装与配置 (3)Maven ...

  10. Android中EditText设置输入条件

    一.应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数字,禁止输入其他字符. (3)用户 ...