MFC 分页bar

bar的头文件


#ifndef __PAGERCTRLEXBAR_H__
#define __PAGERCTRLEXBAR_H__

#include "Sbartool.h"
#include "CPagerCtrlEx.h"


class CPagerCtrlExBar : public CToolBar
{
public:
    static void SendGoto(CPagerCtrlEx* pCtrl, CWnd* pWnd);
public:
    CPagerCtrlExBar();
    virtual ~CPagerCtrlExBar();
    BOOL Init( CWnd* pParentWnd, FuncGotoIndex func, UINT nId );

public:

public:

public:
    virtual CSize CalcFixedLayout( BOOL bStretch, BOOL bHorz );
    virtual CSize CalcDynamicLayout( int nLength, DWORD dwMode );
public:
    CPagerCtrlEx m_pagerCtrl;
protected:
    FuncGotoIndex m_funcGoto;
    CWnd* m_pParent;
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnWindowPosChanged( WINDOWPOS* lpwndpos );
};





#endif //__PAGERCTRLEXBAR_H__

bar的实现文件


#include "StdAfx.h"
#include "CPagerCtrlExBar.h"

BEGIN_MESSAGE_MAP( CPagerCtrlExBar, CToolBar )
    ON_WM_WINDOWPOSCHANGED()
END_MESSAGE_MAP()


void CPagerCtrlExBar::SendGoto( CPagerCtrlEx* pCtrl, CWnd* pWnd )
{
    CPagerCtrlExBar* pBar = static_cast<CPagerCtrlExBar*>(pWnd);
    pBar->m_funcGoto( pCtrl, pBar->m_pParent );
}

CPagerCtrlExBar::CPagerCtrlExBar()
{

}

CPagerCtrlExBar::~CPagerCtrlExBar()
{

}

BOOL CPagerCtrlExBar::Init( CWnd* pParentWnd, FuncGotoIndex func, UINT nId )
{
    if ( pParentWnd == NULL || func == NULL )
    {
        assert( 0 );
        return FALSE;
    }


    if ( CreateEx( pParentWnd,
                   TBSTYLE_FLAT | TBSTYLE_TRANSPARENT,
                   WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_FLYBY,
                   CRect( 0, 0, 0, 0 ),
                   nId ) == FALSE )
        return FALSE;

    m_pParent = pParentWnd;

    m_funcGoto = func;

    if ( m_pagerCtrl.Create( CPoint( 0, 0 ), this, 1000, CPagerCtrlExBar::SendGoto ) == FALSE )
        return FALSE;

    return TRUE;
}

CSize CPagerCtrlExBar::CalcFixedLayout( BOOL bStretch, BOOL bHorz )
{
    CRect rc;
    m_pagerCtrl.GetWindowRect( rc );
    return CSize( rc.Width() + 15, rc.Height() + 5 );
}

CSize CPagerCtrlExBar::CalcDynamicLayout( int nLength, DWORD dwMode )
{
    return CalcFixedLayout( dwMode & LM_STRETCH, dwMode & LM_HORZDOCK );
}

void CPagerCtrlExBar::OnWindowPosChanged( WINDOWPOS* lpwndpos )
{
    CToolBar::OnWindowPosChanged( lpwndpos );

    if ( IsFloating() )
    {
        if ( m_pDockBar )
        {
            CWnd* pParent = m_pDockBar->GetParent();

            if ( pParent == NULL )
                return;

            if ( pParent->IsKindOf( RUNTIME_CLASS( CMiniFrameWnd ) ) )
            {
                pParent->ModifyStyle( WS_SYSMENU, 0, 0 );
            }
        }
    }
}

分页控件的头文件


#ifndef __PAGERCTRLEX_H__
#define __PAGERCTRLEX_H__
#include "stdafx.h"

class CPagerCtrlEx;
typedef void( *FuncGotoIndex )(CPagerCtrlEx* pCtrl, CWnd* pParent);


class CPagerCtrlEx : public CWnd
{
    DECLARE_DYNCREATE( CPagerCtrlEx )
public:
    enum PagerButtonItem
    {
        ITEM_PREV,
        ITEM_NEXT,
    };
    CPagerCtrlEx(void);
    ~CPagerCtrlEx(void);
    virtual BOOL Create( const CPoint& pt, CWnd* pParentWnd, UINT nId, FuncGotoIndex func );
    void SetProperty(int nPageTotal,int nCurrentIndex);
    void SetBorderColor(COLORREF col);
    UINT GetCurrentIndex();
private:
    void SetPageText();
    void GotoPager(int nPage);
protected:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
private:
    CWnd*           m_pParentWnd;
    CButton         m_btnFirst;
    CButton         m_btnPrev;
    CButton         m_btnNext;
    CButton         m_btnLast;
    CEdit           m_editGoto;
    CStatic         m_staticText;
    int             m_nPageTotal;       
    int             m_nCurrentIndex;    
    COLORREF        m_BorderColor; 
    FuncGotoIndex   m_func;
};

#endif //__PAGERCTRLEX_H__

分页控件的实现文件

#include "CPagerCtrlEx.h"

#define PAGER_WIDTH         150
#define PAGER_HEIGHT        20
#define BUTTON_WIDTH        20




#define PAGER_ID_BUTTON_PREV  (1001)
#define PAGER_ID_BUTTON_NEXT  (1002)
#define PAGER_ID_STATIC_PANEL (1004)
#define PAGER_ID_EDIT_GOTO    (1005)
#define PAGER_ID_STATIC_TEXT  (1006)

CPagerCtrlEx::CPagerCtrlEx( )
{
    m_pParentWnd = NULL;
    m_nPageTotal = 0;
    m_nCurrentIndex = 0;
    m_BorderColor = RGB( 41, 101, 153 );
}

CPagerCtrlEx::~CPagerCtrlEx( )
{
}

IMPLEMENT_DYNCREATE( CPagerCtrlEx, CWnd )
BEGIN_MESSAGE_MAP( CPagerCtrlEx, CWnd )
    //{{AFX_MSG_MAP(COutlookMenu)
    //}}AFX_MSG_MAP
    ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CPagerCtrlEx::Create( const CPoint& pt, CWnd* pParentWnd, UINT nId, FuncGotoIndex func )
{
    VERIFY( m_pParentWnd = pParentWnd );
    VERIFY( m_func = func );

    LPCTSTR lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, AfxGetApp()->LoadStandardCursor( IDC_ARROW ), (HBRUSH)GetStockObject( WHITE_BRUSH ), NULL );
    BOOL ret = CWnd::Create( lpszClassName, NULL, WS_CHILDWINDOW | WS_VISIBLE, CRect( pt.x, pt.y, pt.x + PAGER_WIDTH, pt.y + PAGER_HEIGHT ), pParentWnd, nId );

    if ( ret == FALSE)
    {
        return FALSE;
    }

    CRect rcPrev( 0, 0, BUTTON_WIDTH, PAGER_HEIGHT );
    CRect rcNext( PAGER_WIDTH - BUTTON_WIDTH, 0, PAGER_WIDTH, PAGER_HEIGHT );

    CRect rcGoto( rcPrev.right + 1, 0, rcPrev.right + 50, PAGER_HEIGHT );
    CRect rcText( rcGoto.right + 1, rcGoto.top, rcNext.left, PAGER_HEIGHT );


    m_btnPrev.Create( _T( "←" ), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, rcPrev, this, PAGER_ID_BUTTON_PREV );
    m_btnNext.Create( _T( "→" ), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, rcNext, this, PAGER_ID_BUTTON_NEXT );

    m_editGoto.Create( WS_CHILD | WS_VISIBLE | ES_NUMBER | ES_CENTER, rcGoto, this, PAGER_ID_EDIT_GOTO );
    m_staticText.Create( NULL, WS_CHILDWINDOW | WS_VISIBLE | SS_CENTER, rcText, this, PAGER_ID_STATIC_TEXT );

    if ( m_pParentWnd )
    {
        SetFont( m_pParentWnd->GetFont() );
        m_editGoto.SetFont( m_pParentWnd->GetFont() );
        m_staticText.SetFont( m_pParentWnd->GetFont() );
    }

    MoveWindow( 0, 0, PAGER_WIDTH, PAGER_HEIGHT );

    return ret;
}

void CPagerCtrlEx::SetProperty( int nPageTotal, int nCurrentIndex )
{
    if ( nPageTotal <= 0 || nCurrentIndex <= 0 )
    {
        nPageTotal = 1;
        nCurrentIndex = 1;
    }

    m_nPageTotal = nPageTotal - 1;
    m_nCurrentIndex = nCurrentIndex - 1;

    SetPageText();
}

void CPagerCtrlEx::SetBorderColor( COLORREF col )
{
    m_BorderColor = col;
}

UINT CPagerCtrlEx::GetCurrentIndex()
{
    return m_nCurrentIndex;
}

void CPagerCtrlEx::SetPageText()
{
    TCHAR szText[32];
    _stprintf( szText, _T( "%d/%d" ), m_nCurrentIndex + 1, m_nPageTotal + 1 );
    m_staticText.SetWindowText( szText );
    _stprintf( szText, _T( "%d" ), m_nCurrentIndex + 1 );
    m_editGoto.SetWindowText( szText );
}
void CPagerCtrlEx::GotoPager( int nPage )
{
    --nPage;

    if ( m_nCurrentIndex == nPage )
        return;

    if ( nPage < 0 )
        m_nCurrentIndex = 0;
    else if ( nPage > m_nPageTotal )
        m_nCurrentIndex = m_nPageTotal;
    else
        m_nCurrentIndex = nPage;

    m_func( this, m_pParentWnd );
    SetPageText();
}
BOOL CPagerCtrlEx::OnCommand( WPARAM wParam, LPARAM lParam )
{
    int nCtrlID = LOWORD( wParam );

    switch ( nCtrlID )
    {

        case PAGER_ID_BUTTON_PREV:
            if ( m_nCurrentIndex > 0 )
            {
                --m_nCurrentIndex;
                m_func( this, m_pParentWnd );
                SetPageText();
            }
            break;
        case PAGER_ID_BUTTON_NEXT:
            if ( m_nCurrentIndex < m_nPageTotal )
            {
                ++m_nCurrentIndex;
                m_func( this, m_pParentWnd );
                SetPageText();
            }
            break;
    }

    return CWnd::OnCommand( wParam, lParam );
}
void CPagerCtrlEx::OnPaint()
{
    CPaintDC dc( this );
    if ( !m_pParentWnd )
    {
        return;
    }
}
BOOL CPagerCtrlEx::PreTranslateMessage( MSG* pMsg )
{
    if ( pMsg->message == WM_KEYDOWN )
    {
        if ( pMsg->wParam == VK_RETURN )
        {
            if ( !(GetKeyState( VK_CONTROL ) & 0x8000) )
            {
                if ( m_editGoto.GetSafeHwnd() == pMsg->hwnd )
                {
                    CString strText = "";
                    m_editGoto.GetWindowText( strText );

                    if ( !strText.IsEmpty() )
                    {
                        GotoPager( _tcstoul( strText, NULL, 0 ) );
                    }
                    return TRUE;
                }
            }
        }
        if ( pMsg->wParam == 0x56 )
        {
            if ( GetKeyState( VK_CONTROL ) & 0x8000 )
            {
                if ( m_editGoto.GetSafeHwnd() == pMsg->hwnd )
                {
                    return TRUE;
                }
            }
        }
    }
    return CWnd::PreTranslateMessage( pMsg );
}

效果这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值