duilib 界面库 实现timer定时器

2024-05-31 05:08

本文主要是介绍duilib 界面库 实现timer定时器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 看了大神介绍的duilib感觉已被同龄人狠狠地甩在背后。所以痛下决心,之后要多花时间写代码。

    大神教程传送门:

    http://www.cnblogs.com/Alberl/p/3341956.html

    现在的问题是想基于duilib实现一个timer定时器。工程基础大概是在

    http://www.cnblogs.com/Alberl/p/3343763.html

    因为自己的东西是基于大神的东西写的,所以要把大神的教程看得差不多才知道我在说什么。O(∩_∩)O~~

    前台大概长这个样子:

     

    稍微修改了一下就是这样了,很简陋,只是为了说明问题。(很佩服自己装作很多人会看的样子n(*≧▽≦*)n)

    这里引用大神的后台代码:

    复制代码
    class CDuiFrameWnd : public WindowImplBase
    {
    public:virtual LPCTSTR    GetWindowClassName() const   {   return _T("DUIMainFrame");  }virtual CDuiString GetSkinFile()                {   return _T("duilib.xml");  }virtual CDuiString GetSkinFolder()              {   return _T("");  }
    };int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {CPaintManagerUI::SetInstance(hInstance);CDuiFrameWnd duiFrame;duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);duiFrame.CenterWindow();duiFrame.ShowModal();return 0;
    }
    复制代码

     

    任务是,点击开始按钮,注册一个timer,然后里面的事件每5秒被调用一次。

    1.为开始按钮添加响应事件

    只需要在CDuiFrameWnd类中重写OnClick方法就可以啦(1.我怎么知道这个方法可以重写?看基类的源代码后发现的。2.我是学java的,所以我不知道这里的“重写”在c++上说的恰不恰当)。

    复制代码
     1   virtual void OnClick(TNotifyUI& msg)
     2     {
     3         CDuiString sCtrlName = msg.pSender->GetName();
     4         if (sCtrlName == _T("closebtn"))
     5         {
     6             Close();
     7             return;
     8         }
     9         else if (sCtrlName == _T("minbtn"))
    10         {
    11             SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
    12             return;
    13         }
    14         else if (sCtrlName == _T("maxbtn"))
    15         {
    16             SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    17             return;
    18         }
    19         else if (sCtrlName == _T("restorebtn"))
    20         {
    21             SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
    22             return;
    23         }
    24         else if (sCtrlName == _T("btnHello"))
    25         {
    26             HWND hwnd = m_PaintManager.GetPaintWindow();
    27             SetTimer(hwnd, 1, 5000,    NULL);
    28         }
    29 
    30         return;
    31     }
    复制代码


    这里注意到,如果草率地只为开始按钮添加事件的话,最小化等三个按钮会失效,所以重写的时候把基类的方法拷来修改,不晓得有没有更方便的做法。

    settimer函数的四个参数分别表示:1.我也不知道。2.timer的id。3.间隔。4.时间到了要执行的函数。

    4被设为空是MFC的常用做法。因为设为空它也会默认调用类的onTimer方法。

    2.添加onTimer方法

    发现基类并无此方法(也可能是我找的不仔细,没找见),所以现在不是重写,就是添加一个方法。

    这里就是出个对话框。

        virtual LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){::MessageBox(NULL, _T("AC"), _T("随便啥"), NULL);bHandled = TRUE;return 0;}

    为毛ontimer长这个样子?而onclick长另一幅样子?onclick长那副样子是因为基类里面就长那样,我们要重写就拿过来了。ontimer的话,一会儿解释。

    为毛不是重写,还加virtual?刚开始时觉得大家都有它也就有吧,显得整齐一些。然后也没报错。不加应该也可以,没有试验。(区别是,别人再继承这个类的时候就不能重写这个方法了,显然没人要继承这个类)

    运行一下,发现还是不能运行啊!

    原因是基类根本没有捕捉timer事件。

    (总之原因都在基类WindowImplBase的源代码里)

    3.捕捉timer事件

    只需要重写下面的HandleCustomMessage方法即可

    复制代码
        virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){LRESULT lRes = 0;switch (uMsg){case WM_TIMER: lRes = OnTimer(uMsg, wParam, lParam, bHandled); break;}//bHandled = FALSE;return 0;}
    复制代码

    现在也搞清楚为什么我们的OnTimer长那个鸟样了。

    运行成功!

    附上我的整个cpp,

    复制代码
    #pragma once
    #include <UIlib.h>using namespace DuiLib;#ifdef _DEBUG
    #   ifdef _UNICODE
    #       pragma comment(lib, "DuiLib_ud.lib")
    #   else
    #       pragma comment(lib, "DuiLib_d.lib")
    #   endif
    #else
    #   ifdef _UNICODE
    #       pragma comment(lib, "DuiLib_u.lib")
    #   else
    #       pragma comment(lib, "DuiLib.lib")
    #   endif
    #endifclass CDuiFrameWnd : public WindowImplBase
    {
    public:virtual LPCTSTR    GetWindowClassName() const   { return _T("DUIMainFrame"); }virtual CDuiString GetSkinFile()                { return _T("playerui.xml"); }virtual CDuiString GetSkinFolder()              { return _T(""); }virtual void OnClick(TNotifyUI& msg){CDuiString sCtrlName = msg.pSender->GetName();if (sCtrlName == _T("closebtn")){Close();return;}else if (sCtrlName == _T("minbtn")){SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);return;}else if (sCtrlName == _T("maxbtn")){SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);return;}else if (sCtrlName == _T("restorebtn")){SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);return;}else if (sCtrlName == _T("btnHello")){HWND hwnd = m_PaintManager.GetPaintWindow();SetTimer(hwnd, 1, 5000,    NULL);}return;}virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){LRESULT lRes = 0;switch (uMsg){case WM_TIMER: lRes = OnTimer(uMsg, wParam, lParam, bHandled); break;}bHandled = FALSE;return 0;}virtual LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){::MessageBox(NULL, _T("AC"), _T("随便"), NULL);bHandled = TRUE;return 0;}virtual void       InitWindow(){}
    };int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {CPaintManagerUI::SetInstance(hInstance);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 设置资源的默认路径(此处设置为和exe在同一目录)
        CDuiFrameWnd duiFrame;duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);duiFrame.CenterWindow();duiFrame.ShowModal();return 0;
    }
    复制代码

    xml(我的xml叫playerui.xml,跟大神的不一样):

    复制代码
    <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
    <Window size="875,651" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="600,400"><VerticalLayout bkcolor="#FFF0F0F0" bkcolor2="#FFAAAAA0"><HorizontalLayout height="32" bkcolor="#FFE6E6DC" bkcolor2="#FFAAAAA0"><VerticalLayout /><VerticalLayout width="77"><Button name="minbtn" tooltip="最小化" float="true" pos="0,5,0,0" width="23" height="19" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage=" file=&apos;SysBtn\MinNormal.bmp&apos; " hotimage=" file=&apos;SysBtn\MinFocus.bmp&apos; " pushedimage=" file=&apos;SysBtn\MinFocus.bmp&apos; " /><Button name="maxbtn" tooltip="最大化" float="true" pos="22,5,0,0" width="23" height="19" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage=" file=&apos;SysBtn\MaxNormal.bmp&apos; " hotimage=" file=&apos;SysBtn\MaxFocus.bmp&apos; " pushedimage=" file=&apos;SysBtn\MaxFocus.bmp&apos; " /><Button name="restorebtn" tooltip="还原" visible="false" float="true" pos="22,5,0,0" width="23" height="19" align="center" normalimage=" file=&apos;SysBtn\StoreNormal.bmp&apos; " hotimage=" file=&apos;SysBtn\StoreFocus.bmp&apos; " pushedimage=" file=&apos;SysBtn\StoreFocus.bmp&apos; " /><Button name="closebtn" tooltip="关闭" float="true" pos="44,5,0,0" width="28" height="19" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage=" file=&apos;SysBtn\CloseNormal.bmp&apos; " hotimage=" file=&apos;SysBtn\CloseFocus.bmp&apos; " pushedimage=" file=&apos;SysBtn\CloseFocus.bmp&apos; " /></VerticalLayout></HorizontalLayout><HorizontalLayout width="875" height="550"><Control name="Playcon_1" bordersize="3" float="true" pos="85,24,0,0" width="311" height="239" bordercolor="#00C0C0C0" /><Control bordersize="3" float="true" pos="477,24,0,0" width="311" height="239" bordercolor="#00C0C0C0" /><Control bordersize="3" float="true" pos="85,290,0,0" width="311" height="239" bordercolor="#00C0C0C0" /><Control bordersize="3" float="true" pos="477,290,0,0" width="311" height="239" bordercolor="#00C0C0C0" /></HorizontalLayout><HorizontalLayout><VerticalLayout /><VerticalLayout width="115" height="39"><Button name="btnHello" text="开始播放" bordersize="2" width="114" height="39" bkcolor="#FFFFFBF0" bkcolor2="#0000FFFF" bordercolor="#00000080" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" /></VerticalLayout><VerticalLayout /></HorizontalLayout></VerticalLayout>
    </Window>
    复制代码

    更多精彩,都在基类的源代码里面!

这篇关于duilib 界面库 实现timer定时器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017420

相关文章

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配