动态图制作软件设计(二)
我们在配置好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;
}
动态图制作软件设计(二)相关推荐
- 动态图制作软件设计(三)
前面我们已经完成了.xml文档与代码的结合.接下来我们对.xml文档进行操作. 我们在这里使用的是DuiDesigner工具进行操作. 以下内容,基本上都是在界面布局中学到的,详细操作请查阅该博客. ...
- 哪个软件可以制作GIF表情包 动态图制作方法
GIF 在聊天中使用居多,调节氛围的同时也可以增加情感,给我们带来了很多的乐趣,一般使用的 GIF 都是社交工具中自带的,虽然也很有趣,但是缺乏了自己动手的乐趣,其实自己制作 GIF 也是很简单的,需 ...
- GIF动态图制作工具(免费),附教程
GIF动态图制作工具(免费) 这里推荐一款动态图制作工具(还可以视频剪辑等等功能非常强大且占内存较小),完全免费非常好用! 软件:格式工厂-网上直接搜就行(下载链接在下方) 动态图制作教程如下动态图: ...
- 分享一个动图制作软件,简单实用易操作,迅速得到你想要的GIF效果图
有好东西应该和大家一起分享,发现一个简单实用的gif图制作软件:GifCam 大致讲下它的基本操作: 首先看下功能图: 点击录制按钮即可开始录制属于你 ...
- ProcessOn - 高大上的免费中文在线作图工具/思维导图制作软件
点此进入:https://www.processon.com/i/5518b08ae4b0a52a9843e123 ProcessOn 网页版在线作图工具!你只需要有一个浏览器即可制作思维导图.流程图 ...
- 免装版_无缝贴图制作软件 PixPlant2中文免装版
点击上方蓝字关注我们 如您喜欢我们的公众号,不妨推荐给身边的朋友 资源介绍: 资源来源于网络,很多时候我们从网上找的贴图并不是无缝的,而且一般都没有高光/法线 贴图这些,在材质的模拟上就要差了很多,在 ...
- 电脑动态图制作的方法技巧
我们在电脑上可以看到很多动态图,有趣的.搞笑的.可爱的等等,只要我们要用哪种类型的,网上应有尽有,但是想不想自己制作图片呢?今天我们就来学习一下动态图制作的方法技巧. 使用工具: 电脑 操作方法: 1 ...
- 推荐一款GIF动图制作软件--ScreenToGif
推荐一款GIF动图制作软件--ScreenToGif 下载 安装使用 保存gif 效果如下 下载 已经上传到git: https://gitee.com/dada4545/gif_make.git 直 ...
- 视频转GIF图2.0动图制作软件,提供三种GIF尺寸选择
视频转GIF图 「由于这里发不了动图,只好不发了,想看看效果如何的,赶紧动手整一个叭」 [资源名称]:视频转GIF [资源版本]:图不知 [资源大小]:0 MB [测试机型]:Windows/手机 [ ...
最新文章
- 我的一天:时间都去哪了?
- .NET简谈组件程序设计之(AppDomain应用程序域)
- Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
- 离散化+unique()+二分查找
- 程序员养生之道——坚持泡脚(十五分钟以上)
- MySQL连接查询—笛卡尔乘积
- figma下载_迁移至Figma
- Last_Errno: 1755 Last_Error: Cannot execute the current event group in the parallel mode错误解决
- 编写 if 时尽量不要带 else
- 图见-未来 | 创邻科技 Galaxybase免费版发布会回顾
- DHCP DHCPv6
- 三星30pin引脚_USB3.0针脚定义、引脚定义(精校版本)
- 微信小程序TabBar的使用
- 冰雪经济下,全民滑雪进入国际化的“黄金时代”
- 微软 bing 壁纸 每日一图 bing api
- 中文关键词提取tfidf算法改进bsaeline
- fNIRS功能近红外数据处理服务
- 日有所思(6)——直流电机注意点
- 解决谷歌浏览器打开后是毒霸浏览器的问题
- uniapp 开发微信小程序,通过高德SDK获取当位置详细信息
热门文章
- Python基础(10) Python创建list
- Ubuntu如何定时清理内存
- Disruptor 创建过程
- 冰点文库下载V2绿色版,无需积分自由下载百度,mbalib,豆丁,畅享,hp009,max.book118 文档...
- PropertyGrid 绑定动态的属性与值的集合
- RSA China 2011女嘉宾:用更好的武器应对带枪的敌人!
- “SQL对象名无效”的解决过程
- jsf2.0---jsf的新特性
- 从卓越工程的角度看微软中国开发团队的成长 (一)
- 数据结构与算法之四希尔排序法