duilib获取CSliderUI滑动事件 - 用自定义控件实现

转载自: http://www.duilibcn.com/source/217.html

用duilib也有一段时间了,但是想做个东西时发现duilib的文档如此之少,
想获取滑块的滑动事件,从而获取滑块的值都找不到一篇文章。
好吧,凭借着对Qt和MFC事件传递的理解,我想到在duilib里扩展CSliderUI,在控件里
监听控件的mouse move和mouse down事件应该也是可以办到的,来验证这个想法吧。
 
先定义一个扩展的CSliderUI
#ifndef MYSLIDER_H
#define MYSLIDER_H
 
#include
#include
#include
using namespace DuiLib;
 
 
class CMainWindow;
class MySlider : public CSliderUI
{
 
public:
    MySlider(CMainWindow* pMain);
    ~MySlider();
 
 
    CMainWindow* m_MainWnd;
    static const CDuiString m_className;
    static const CDuiString m_interFaceName;
 
    bool m_MouseDown;
public:
    virtual LPCTSTR GetClass() const;
    virtual LPVOID GetInterface(LPCTSTR pstrName);
    virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
 
    virtual void DoEvent(TEventUI& event);
    virtual void DoPaint(HDC hDC, const RECT& rcPaint);
 
};
 
#endif // MYSLIDER_H
其中CMainWindow是主窗体的类,它有一个方法是设置label1的值,方便我们查看,
稍后会提供下载,MySlider.cpp
它的类名是MySlider,这个很重要,一会会用到
 
#include "myslider.h"
 
#include "cmainwindow.h"
#include
using namespace std;
 
const CDuiString MySlider::m_className = L"MySlider";
const CDuiString MySlider::m_interFaceName = L"MySliderInterface";
 
MySlider::MySlider(CMainWindow* pMain) : CSliderUI(),m_MainWnd(pMain)
{
    m_MouseDown = false;
}
 
MySlider::~MySlider()
{
 
}
 
// 这个是类名
LPCTSTR MySlider::GetClass() const
{
    return m_className.GetData();
}
 
// 这个是xml控件的名称
LPVOID MySlider::GetInterface(LPCTSTR pstrName)
{
 
    //if (_tcscmp(pstrName,m_interFaceName.GetData()) == 0)
    //   return static_cast(this);
 
    return CControlUI::GetInterface(pstrName);
}
 
void MySlider::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
{
 
    CSliderUI::SetAttribute(pstrName, pstrValue);
}
 
 
void MySlider::DoEvent(TEventUI &event)
{
    if(event.Type == UIEVENT_MOUSEMOVE && m_MouseDown)
    {
        cout<<"--mouse over v:"<GetValue()<
 
        WCHAR s[50];
        memset(s,0,2*50);
        _itow(this->GetValue(),s,10);
        m_MainWnd->setLabel1Text(CDuiString(s));
    }
    else if(event.Type == UIEVENT_BUTTONDOWN)
    {
        m_MouseDown = true;
    }
    else if(event.Type == UIEVENT_BUTTONUP)
    {
        m_MouseDown = false;
    }
 
    return CSliderUI::DoEvent(event);
}
 
void MySlider::DoPaint(HDC hDC, const RECT &rcPaint)
{
 
    return CSliderUI::DoPaint(hDC,rcPaint);
}
接下来在cmainwindow.xml里自定义一个控件,它的名称是MySlider
   
       
           
               
           
           
               
               
               
               
           
       
       
           
           
           
       
   
 
CMainWindow集成自WindowImplBase,它有一个关键的创建自定义控件的成员函数
CControlUI* CMainWindow::CreateControl(LPCTSTR pstrClass)
{
    if(_tcsicmp(pstrClass,MySlider::m_className.GetData()) == 0)
    {
        return new MySlider(this);
    }
    return NULL;
}
通过return new MySlider(this);我们实现了XML界面的MySlider和MySlider类的绑定。
 
下面是实现自定义控件监听事件的关键代码
void MySlider::DoEvent(TEventUI &event)
{
    if(event.Type == UIEVENT_MOUSEMOVE && m_MouseDown)
    {
        cout<<"--mouse over v:"<GetValue()<
        WCHAR s[50];
        memset(s,0,2*50);
        _itow(this->GetValue(),s,10);
        m_MainWnd->setLabel1Text(CDuiString(s));
    }
    else if(event.Type == UIEVENT_BUTTONDOWN)
    {
        m_MouseDown = true;
    }
    else if(event.Type == UIEVENT_BUTTONUP)
    {
        m_MouseDown = false;
    }
 
    return CSliderUI::DoEvent(event);
}
通过扩展控件,我们监听了UIEVENT_MOUSEMOVE和UIEVENT_BUTTONDOWN事件,在控件按下鼠标键并
滑动鼠标的时候成功的获取了滑动事件。
 
源码和编译好的EXE例子下载
http://download.csdn.net/detail/hats8888/9347735

未经duilib中文网同意禁止转载!

你可能感兴趣的:(c/c++技术)