看了大神介绍的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='SysBtnMinNormal.bmp' " hotimage=" file='SysBtnMinFocus.bmp' " pushedimage=" file='SysBtnMinFocus.bmp' " /> <Button name="maxbtn" tooltip="最大化" float="true" pos="22,5,0,0" width="23" height="19" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage=" file='SysBtnMaxNormal.bmp' " hotimage=" file='SysBtnMaxFocus.bmp' " pushedimage=" file='SysBtnMaxFocus.bmp' " /> <Button name="restorebtn" tooltip="还原" visible="false" float="true" pos="22,5,0,0" width="23" height="19" align="center" normalimage=" file='SysBtnStoreNormal.bmp' " hotimage=" file='SysBtnStoreFocus.bmp' " pushedimage=" file='SysBtnStoreFocus.bmp' " /> <Button name="closebtn" tooltip="关闭" float="true" pos="44,5,0,0" width="28" height="19" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage=" file='SysBtnCloseNormal.bmp' " hotimage=" file='SysBtnCloseFocus.bmp' " pushedimage=" file='SysBtnCloseFocus.bmp' " /> </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>
更多精彩,都在基类的源代码里面!