当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>Visual C++教程

一个简单的滑动控件CSlideTab类

     看到论坛上有人提出,需要一个通用的滑动控件,考虑了一下,从CWnd继承了一个CSlideTab类,实现一些演示功能。

    使用方法:

      1. #include "slidetab.h"   //在需要使用的窗口类的头文件中包含

      2.  CSlideTab m_SlideTab;    //声明一个CSlideTab的成员变量

      3.  m_SlideTab.CreateTab(CRect(-1, -1, 50, 50), ID_SLIDETAB, this);   //在窗口初始化过程中调用CSlideTab::CreateTab(CRect& rcTab, UINT nID, CWnd *pWndParent)方法,其中ID_SLIDETAB为控件ID,需要在资源文件中定义。

      4.  m_SlideTab.SetHeight(400);    //设置为向下展开,展开高度为400

      或者

         m_SlideTab.SetWidth(400);  //设置为向右展开,展开宽度为400

      以上两个只有最后调用的有效。

      5. 可以重载这个类的DrawTab(CDC *pDC)虚拟成员函数,实现需要的界面效果。已经在内部实现双缓冲,直接在pDC上绘制即可。

    slidetab.h

    slidetab.h
    #pragma once
    #include "atltypes.h"


    // CSlideTab
    typedef enum _SLIDE_TAB_ACTION
    {
    SLIDE_TAB_UP = -1, SLIDE_TAB_STOP, SLIDE_TAB_DOWN
    }SLIDE_TAB_ACTION;

    class CSlideTab : public CWnd
    {
    DECLARE_DYNAMIC(CSlideTab)

    public:
    CSlideTab();
    virtual ~CSlideTab();

    protected:
    DECLARE_MESSAGE_MAP()
    public:
    void CreateTab(CRect& rcTab, UINT nID, CWnd *pWndParent);
    afx_msg void OnPaint();
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    public:
    static void CALLBACK OpenTab(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    int SetHeight(int nHeight);
    int SetWidth(int nWidth);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    virtual void DrawTab(CDC* pDC);
    afx_msg void OnDestroy();
    afx_msg void OnMove(int x, int y);
    private:
    UINT m_nTimerID;
    int m_nHeight;
    SLIDE_TAB_ACTION m_nAction;
    CRect m_rcWnd;
    BOOL m_fVert;
    };

    slidetab.cpp

    // SlideTab.cpp : 实现文件
    //

    #include "stdafx.h"
    #include "SlideTab.h"
    #include <Mmsystem.h>
    #include ".\slidetab.h"
    #pragma comment(lib,"winmm.lib")

    // CSlideTab

    IMPLEMENT_DYNAMIC(CSlideTab, CWnd)
    CSlideTab::CSlideTab()
    : m_nTimerID(0)
    , m_nHeight(100)
    , m_nAction(SLIDE_TAB_STOP)
    , m_fVert(FALSE)
    {
    }

    CSlideTab::~CSlideTab()
    {
    }


    BEGIN_MESSAGE_MAP(CSlideTab, CWnd)
    ON_WM_PAINT()
    ON_WM_MOUSEMOVE()
    ON_WM_ERASEBKGND()
    ON_WM_DESTROY()
    ON_WM_MOVE()
    END_MESSAGE_MAP()

    // CSlideTab 消息处理程序


    void CSlideTab::CreateTab(CRect& rcTab, UINT nID, CWnd *pWndParent)
    {
    m_rcWnd.CopyRect(rcTab);
    Create(AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, NULL, NULL, NULL), NULL, WS_VISIBLE | WS_CHILD, rcTab, pWndParent, nID);
    }

    void CSlideTab::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CWnd::OnPaint()
    CRect ClientRect;
    GetClientRect(ClientRect);
    CBitmap MemBmp;
    MemBmp.CreateCompatibleBitmap(&dc, ClientRect.Width(), ClientRect.Height());
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    CBitmap *pBmpOld = MemDC.SelectObject(&MemBmp);

   

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接