zoukankan      html  css  js  c++  java
  • 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
    #endif
    
    class 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;SysBtnMinNormal.bmp&apos; " hotimage=" file=&apos;SysBtnMinFocus.bmp&apos; " pushedimage=" file=&apos;SysBtnMinFocus.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;SysBtnMaxNormal.bmp&apos; " hotimage=" file=&apos;SysBtnMaxFocus.bmp&apos; " pushedimage=" file=&apos;SysBtnMaxFocus.bmp&apos; " />
                    <Button name="restorebtn" tooltip="还原" visible="false" float="true" pos="22,5,0,0" width="23" height="19" align="center" normalimage=" file=&apos;SysBtnStoreNormal.bmp&apos; " hotimage=" file=&apos;SysBtnStoreFocus.bmp&apos; " pushedimage=" file=&apos;SysBtnStoreFocus.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;SysBtnCloseNormal.bmp&apos; " hotimage=" file=&apos;SysBtnCloseFocus.bmp&apos; " pushedimage=" file=&apos;SysBtnCloseFocus.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>

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

  • 相关阅读:
    Java学习之--List和ArrayList
    Linux
    Linux
    Docker 容器管理
    Docker 镜像管理
    如何理解 AWS VPC
    Linux 内核版本
    Windows 快速切换到当前目录下的dos环境
    Git 整理
    TCP/IP
  • 原文地址:https://www.cnblogs.com/wasss/p/4220022.html
Copyright © 2011-2022 走看看