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

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到