我们在配置好Duilib库之后。开始下一步操作。

  • 首先我们需要创建一个Win32工程。
    #include"UIlib.h"引入头文件。
  • 链接lib静态库。
    #pragma comment(lib,"DuiLib_ud.lib")
  • 包含命名空间
    using namespace DuiLib;

在写代码之前我们先要了解一下,CWindowWnd类,CWindowWnd是Duilib封装的一个窗口类,主要功能为窗口创建操作。在使用该类的时候,我们需要对其GetWindowClassName函数进行重写,在该函数中必须返回用户所定义窗口的类名称,注册窗口时需要用到。

class CDuiFramWnd : public CWindowWnd
{public:// 在该函数中必须返回用户所定义窗口的类名称,注册窗口时需要用到virtual LPCTSTR GetWindowClassName() const{return _T("DuiFramWnd");}
};

增加按钮控件,按钮控件的显示应该是在创建窗口的时候显示出来,所以我们需要将Duilib库中的HandleMessage(消息处理函数进行重写)。
HandleMessage

class CDuiFramWnd : public CWindowWnd
{public:// 在该函数中必须返回用户所定义窗口的类名称,注册窗口时需要用到virtual LPCTSTR GetWindowClassName() const{return _T("DuiFramWnd");}virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){if (uMsg == WM_CREATE){//创建一个按钮CControlUI *pWnd = new CButtonUI;// 设置按钮内容pWnd->SetText(_T("Make Gif software"));  //_T字符串类型转换   }//处理不了的信息交给父类处理return __super::HandleMessage(uMsg, wParam, lParam);}
};

但是这样创建出来的按钮是没有办法显示出来的,因为这样创建的按钮没有相应处理的消息。
消息

  • 系统消息
  • 用户自定义消息

我们自定义的消息编译器是不认识,所以我们需要对其进行自定义处理。
解决办法:增加一个回话管理器,主要处理我们自定义的消息。
CPaintManagerUI m_PaitManager;
因此,我们只需要在HandleMessage消息处理函数中,显示调用即可。

virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{if (uMsg == WM_CREATE){//创建一个按钮CControlUI *pWnd = new CButtonUI;// 设置按钮内容pWnd->SetText(_T("Make Gif software"));  //_T字符串类型转换pWnd->SetBkColor(0xAAFF00FF);//设置背景色//初始化m_PaintManager对象的窗口句柄,发送消息时需要用到m_Pait.Init(m_hWnd);//将按钮控件链接到回话管理器上m_Pait.AttachDialog(pWnd);}LRESULT lRes = 0;//使用绘画管理器处理自定义信息,lRes是返回值,通常设置为0if (m_Pait.MessageHandler(uMsg, wParam, lParam, lRes)){return lRes;}//处理不了的信息交给父类处理return __super::HandleMessage(uMsg, wParam, lParam);
}

运行截图:

上面的整个界面都是我们创建的按钮,但是我们点击这个按钮发现没有任何反应,这是由于没有将按钮的信息响应出来。
解决办法:让我们创建的CDuiFramWnd继承INotifyUI。


作用:当检测到按钮按下的信号,做出相应的动作。

我们发现INotifyUI中只有一个Notify函数,该函数的作用是用于用户捕获自定义信息,进行自定义操作。同样的我们需要将该Notify连接到绘画器中。m_Pait.AddNotifier(this);

#include"UIlib.h"
#pragma comment(lib,"DuiLib_ud.lib")
using namespace DuiLib;class CDuiFramWnd : public CWindowWnd,public INotifyUI
{public:// 在该函数中必须返回用户所定义窗口的类名称,注册窗口时需要用到virtual LPCTSTR GetWindowClassName() const{return _T("DuiFramWnd");}virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){if (uMsg == WM_CREATE){//创建一个按钮CControlUI *pWnd = new CButtonUI;// 设置按钮内容pWnd->SetText(_T("Make Gif software"));  //_T字符串类型转换pWnd->SetBkColor(0xAAFF00FF);//初始化m_PaintManager对象的窗口句柄,发送消息时需要用到m_Pait.Init(m_hWnd);//将按钮控件链接到回话管理器上m_Pait.AttachDialog(pWnd);//链接自定义处理消息m_Pait.AddNotifier(this);}LRESULT lRes = 0;//使用绘画管理器处理自定义信息,lRes是返回值,通常设置为0if (m_Pait.MessageHandler(uMsg, wParam, lParam, lRes)){return lRes;}//处理不了的信息交给父类处理return __super::HandleMessage(uMsg, wParam, lParam);}//捕获自定义消息,用于自定义处理virtual void Notify(TNotifyUI& msg){if (msg.sType == _T("click")) //.sType为消息类型{MessageBox(NULL, _T("Test_click"), _T("Test"), IDOK); //弹窗测试}}
private:CPaintManagerUI m_Pait;
};int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, intnCmdShow)
{CDuiFramWnd framWnd;// Cashier即在窗口右上角显式的名字// UI_WNDSTYLE_FRAME: 窗口可视的宏,具有标题栏,最大化最小化,关闭功能等// WS_EX_WINDOWEDGE: Win32的窗口风格,带有边框framWnd.Create(NULL, _T("Test"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);//显示窗口,激活消息循环framWnd.ShowModal();return 0;
}

在Duilib库中是没有明显区分客户区与标题栏的,所以我们需要自己设置标题栏,但是Win32程序自带标题栏,我们需要将其屏蔽掉,用客户区来模拟标题栏,
所以想怎么画就怎么画,非常方便。

在HandleMessage函数中只需要屏蔽WM_NCACTIVATE、 WM_NCCALCSIZE、WM_NCPAINT三个消息即可。

virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{if (uMsg == WM_CREATE)...else if( uMsg == WM_NCACTIVATE ){if( !::IsIconic(m_hWnd) ){return (wParam == 0) ? TRUE : FALSE;}}else if( uMsg == WM_NCCALCSIZE ){return 0;}else if( uMsg == WM_NCPAINT ){return 0;}...if (m_Pait.MessageHandler(uMsg, wParam, lParam, lRes))...
}

这下我们运行程序,我们会发现上面的标题栏没有了,这就导致一个很尴尬的问题,怎么关闭呢?

我们在.exe目录下创建一个.xml文档。

使用记事本打开,我们将下面的代码拷贝到.xml文档中。

<?xml version="1.0" encoding="UTF-8"?>
<Window size="800,600"> <!-- 窗口的初始尺寸 -->
<HorizontalLayout bkcolor="#AAFF00FF"> <!-- 整个窗口的背景 -->
</HorizontalLayout>
</Window>

将该文档的编码格式改成UTF-8。

我们将.xml文档引入到代码中。
我们只需要将.xml文档导入到HandleMessage函数中。

运行报错:由于编译器不知道.xml文档的路径,所以我门还需要在主函数中,获取其路径。

完整代码

#include"UIlib.h"#pragma comment(lib,"DuiLib_ud.lib")using namespace DuiLib;class CDuiFramWnd : public CWindowWnd,public INotifyUI
{public:// 在该函数中必须返回用户所定义窗口的类名称,注册窗口时需要用到virtual LPCTSTR GetWindowClassName() const{return _T("DuiFramWnd");}virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){if (uMsg == WM_CREATE){m_Pait.Init(m_hWnd);CDialogBuilder builder;CControlUI* pRoot = builder.Create(_T("makeGif.xml"), (UINT)0, NULL, &m_Pait);m_Pait.AttachDialog(pRoot);m_Pait.AddNotifier(this);}else if (uMsg == WM_NCACTIVATE){if (!::IsIconic(m_hWnd)){return (wParam == 0) ? TRUE : FALSE;}}else if (uMsg == WM_NCCALCSIZE){return 0;}else if (uMsg == WM_NCPAINT){return 0;}LRESULT lRes = 0;//使用绘画管理器处理自定义信息,lRes是返回值,通常设置为0if (m_Pait.MessageHandler(uMsg, wParam, lParam, lRes)){return lRes;}//处理不了的信息交给父类处理return __super::HandleMessage(uMsg, wParam, lParam);}//捕获自定义消息,用于自定义处理virtual void Notify(TNotifyUI& msg){if (msg.sType == _T("click")) //.sType为消息类型{MessageBox(NULL, _T("Test_click"), _T("Test"), IDOK); //弹窗测试}}
private:CPaintManagerUI m_Pait;
};int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, intnCmdShow)
{CPaintManagerUI::SetInstance(hInstance);// 设置资源的默认路径(此处设置为和exe在同一目录)CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());CDuiFramWnd framWnd;framWnd.Create(NULL, _T("Test"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);//显示窗口,激活消息循环framWnd.ShowModal();return 0;
}

运行截图

现在我们已经完成基本的函数,我们只需要在.xml文档中进行编译,即可对软件的界面进行修改。
.xml文件,我们可以通过DuiDesigner_d.exe工具进行绘画。

或许上面的代码有点过程有点复杂。这时,我们只需要将我们创建的类继承WindowImplBase

我们先看一下WindoImplBase类中有什么:

原来在底层,WindowImplBase对CWindowWnd与INotifyUI都继承,所以我们直接继承WindowImplBase比较简单。

class CDuiFramWnd : public WindowImplBase
{protected:virtual CDuiString GetSkinFolder() //获取路径,由于我们已经在WinMain主函数中进行路径获取,所以返回NULL{return _T(""); }virtual CDuiString GetSkinFile() //获取皮肤文件.xml名称{return _T("makeGif.xml");}virtual LPCTSTR GetWindowClassName(void) const//获取窗口类名{return _T("DuiWnd");}virtual void Notify(TNotifyUI& msg){if (msg.sType == _T("click")){MessageBox(m_hWnd, _T("Hello World"), _T("DuiFramWnd"), IDOK);}}
};int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, intnCmdShow)
{CPaintManagerUI::SetInstance(hInstance);// 设置资源的默认路径(此处设置为和exe在同一目录)CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());CDuiFramWnd framWnd;framWnd.Create(NULL, _T("Test"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);framWnd.CenterWindow(); //窗口居中显示//显示窗口,激活消息循环framWnd.ShowModal();return 0;
}

动态图制作软件设计(二)相关推荐

  1. 动态图制作软件设计(三)

    前面我们已经完成了.xml文档与代码的结合.接下来我们对.xml文档进行操作. 我们在这里使用的是DuiDesigner工具进行操作. 以下内容,基本上都是在界面布局中学到的,详细操作请查阅该博客. ...

  2. 哪个软件可以制作GIF表情包 动态图制作方法

    GIF 在聊天中使用居多,调节氛围的同时也可以增加情感,给我们带来了很多的乐趣,一般使用的 GIF 都是社交工具中自带的,虽然也很有趣,但是缺乏了自己动手的乐趣,其实自己制作 GIF 也是很简单的,需 ...

  3. GIF动态图制作工具(免费),附教程

    GIF动态图制作工具(免费) 这里推荐一款动态图制作工具(还可以视频剪辑等等功能非常强大且占内存较小),完全免费非常好用! 软件:格式工厂-网上直接搜就行(下载链接在下方) 动态图制作教程如下动态图: ...

  4. 分享一个动图制作软件,简单实用易操作,迅速得到你想要的GIF效果图

    有好东西应该和大家一起分享,发现一个简单实用的gif图制作软件:GifCam 大致讲下它的基本操作: 首先看下功能图:                          点击录制按钮即可开始录制属于你 ...

  5. ProcessOn - 高大上的免费中文在线作图工具/思维导图制作软件

    点此进入:https://www.processon.com/i/5518b08ae4b0a52a9843e123 ProcessOn 网页版在线作图工具!你只需要有一个浏览器即可制作思维导图.流程图 ...

  6. 免装版_无缝贴图制作软件 PixPlant2中文免装版

    点击上方蓝字关注我们 如您喜欢我们的公众号,不妨推荐给身边的朋友 资源介绍: 资源来源于网络,很多时候我们从网上找的贴图并不是无缝的,而且一般都没有高光/法线 贴图这些,在材质的模拟上就要差了很多,在 ...

  7. 电脑动态图制作的方法技巧

    我们在电脑上可以看到很多动态图,有趣的.搞笑的.可爱的等等,只要我们要用哪种类型的,网上应有尽有,但是想不想自己制作图片呢?今天我们就来学习一下动态图制作的方法技巧. 使用工具: 电脑 操作方法: 1 ...

  8. 推荐一款GIF动图制作软件--ScreenToGif

    推荐一款GIF动图制作软件--ScreenToGif 下载 安装使用 保存gif 效果如下 下载 已经上传到git: https://gitee.com/dada4545/gif_make.git 直 ...

  9. 视频转GIF图2.0动图制作软件,提供三种GIF尺寸选择

    视频转GIF图 「由于这里发不了动图,只好不发了,想看看效果如何的,赶紧动手整一个叭」 [资源名称]:视频转GIF [资源版本]:图不知 [资源大小]:0 MB [测试机型]:Windows/手机 [ ...

最新文章

  1. 我的一天:时间都去哪了?
  2. .NET简谈组件程序设计之(AppDomain应用程序域)
  3. Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
  4. 离散化+unique()+二分查找
  5. 程序员养生之道——坚持泡脚(十五分钟以上)
  6. MySQL连接查询—笛卡尔乘积
  7. figma下载_迁移至Figma
  8. Last_Errno: 1755 Last_Error: Cannot execute the current event group in the parallel mode错误解决
  9. 编写 if 时尽量不要带 else
  10. 图见-未来 | 创邻科技 Galaxybase免费版发布会回顾
  11. DHCP DHCPv6
  12. 三星30pin引脚_USB3.0针脚定义、引脚定义(精校版本)
  13. 微信小程序TabBar的使用
  14. 冰雪经济下,全民滑雪进入国际化的“黄金时代”
  15. 微软 bing 壁纸 每日一图 bing api
  16. 中文关键词提取tfidf算法改进bsaeline
  17. fNIRS功能近红外数据处理服务
  18. 日有所思(6)——直流电机注意点
  19. 解决谷歌浏览器打开后是毒霸浏览器的问题
  20. uniapp 开发微信小程序,通过高德SDK获取当位置详细信息

热门文章

  1. Python基础(10) Python创建list
  2. Ubuntu如何定时清理内存
  3. Disruptor 创建过程
  4. 冰点文库下载V2绿色版,无需积分自由下载百度,mbalib,豆丁,畅享,hp009,max.book118 文档...
  5. PropertyGrid 绑定动态的属性与值的集合
  6. RSA China 2011女嘉宾:用更好的武器应对带枪的敌人!
  7. “SQL对象名无效”的解决过程
  8. jsf2.0---jsf的新特性
  9. 从卓越工程的角度看微软中国开发团队的成长 (一)
  10. 数据结构与算法之四希尔排序法