实现效果看过了,下面我们来看源码:
头文件:
#pragma once /************************************************************************/ /* 吴建华所写 */ /* 2016.03.10 */ /* 564154394@qq.com */ /* 页码控件类 */ /* 写的不好请多多指教 */ /************************************************************************/ // CStaticPage enum{ PAGE_CICK = 0, //点击 JUMP_NEXT_PAGE = 1, //跳转下一页 JUMP_UP_PAGE = 2, //跳转上一页 JUMP_SELECT_PAGE = 3, //跳转选中页码 DRAW_PAGE_WIDTH = 50 //页码绘制宽度 当前这个宽度可以之车99999 }; //页码操作回调函数 /* * PFNPAGEOPERATION 回调函数参数解释 * nPage:当前页码 * nOperation:操作类型JUMP_NEXT_PAGE = 1, //跳转下一页 JUMP_UP_PAGE = 2, //跳转上一页 JUMP_SELECT_PAGE = 3,//跳转选中页码 * hWnd:当前页码窗口句柄 方便区分 * pUserData:用户自定义数据 */ typedef void(__stdcall *PFNPAGEOPERATION)(unsigned int nPage, unsigned int nOperation, HWND hWnd, void *pUserData ); class CStaticPage : public CStatic { DECLARE_DYNAMIC(CStaticPage) DECLARE_MESSAGE_MAP() public: CStaticPage(); virtual ~CStaticPage(); public: //初始化 void InitPage(__in unsigned int nSize=1, __in unsigned nCurPage=1, __in unsigned int nCurPageSize=6 ); //设置/获取页码 void SetPageSize(__in unsigned int nSize); unsigned int GetPageSize(); //设置/获取当前页 void SetCurrentPage(__in unsigned int nPage); unsigned int GetCurrentPage(); //设置/获取page颜色 void SetPageColorref(COLORREF clr); COLORREF GetPageColorref(); void SetDefaultPageColorref(); //设置操作页码回调函数 如果设置了回调函数 又不需要了 可以继续调用次接口pfnPageOperation参数传NULL void SetCallBackPageOperation(__in PFNPAGEOPERATION pfnPageOperation, __in void *pUserData); protected: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); private: unsigned int m_nPageSize; //页码总数 unsigned int m_nCurrentPage; //当前页 unsigned int m_nCurrentPageSize; //当前页显示总数 unsigned int m_nCurrentEndPage; //当前页码起始页 unsigned int m_nCurrentStartPage; //当前页码起始页 unsigned int m_nJumpPageFlog; //跳转页码标记 COLORREF m_clrPage; //页码颜色 PFNPAGEOPERATION m_pfnPageOperation; //操作回调函数指针 void *m_pUserData; //用户自定义数据 private: unsigned int ClickPage(__in CPoint pt); //单击造成选中的页码 void DrawPage(__in CDC *pDC ); void JumpPage( __in unsigned int nJumpFlog ); COLORREF AdjustBrightness(CONST COLORREF clrSrcPixel, CONST INT nPercent); //调整颜色亮度 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); };
源文件:
// StaticPage.cpp : 实现文件 // #include "stdafx.h" #include "StaticPage.h" #include <math.h> // CStaticPage IMPLEMENT_DYNAMIC(CStaticPage, CStatic) CStaticPage::CStaticPage() { m_nCurrentPage = 1; m_nPageSize = 1; m_nCurrentStartPage = 1; m_nJumpPageFlog = JUMP_SELECT_PAGE; m_pfnPageOperation = NULL; m_pUserData = NULL; m_clrPage = RGB(116, 184, 184); } CStaticPage::~CStaticPage() { } BEGIN_MESSAGE_MAP(CStaticPage, CStatic) END_MESSAGE_MAP() // CStaticPage 消息处理程序 void CStaticPage::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); pDC->FillSolidRect(&lpDrawItemStruct->rcItem,GetBkColor(pDC->m_hDC)); DrawPage(pDC); } void CStaticPage::DrawPage(__in CDC *pDC ) { ASSERT(AfxIsValidAddress(pDC, sizeof(CDC))); pDC->SetBkMode(TRANSPARENT); CRect rc; GetClientRect(rc); int nWidth = rc.Width(); int nHeight = rc.Height(); //高度做为页码的绘制高宽 //计算当前页的起始页和结束页 const int nDrawPageSize = nWidth / DRAW_PAGE_WIDTH - 2; //可以绘制的正方形区域总数 m_nCurrentPageSize = nDrawPageSize; if ( nDrawPageSize > m_nPageSize ){ m_nCurrentPageSize = m_nPageSize; } m_nCurrentEndPage = m_nCurrentStartPage + m_nCurrentPageSize; //绘制页码 CString strPage; if( m_nCurrentEndPage > m_nPageSize+1 ){ m_nCurrentEndPage = m_nPageSize+1; } int nItem = 0; for (int nRow = m_nCurrentStartPage-1; nRow <= m_nCurrentEndPage; nRow++, nItem++){ int nLeft = nItem * DRAW_PAGE_WIDTH; int nRight = nLeft + DRAW_PAGE_WIDTH; CRect rcPage(nLeft, 0, nRight, nHeight); CRect rcFillSolid(rcPage.left + 2, rcPage.top, rcPage.right - 2, rcPage.bottom); if (m_nCurrentPage == (nRow) && m_nCurrentPage != m_nCurrentEndPage){ pDC->FillSolidRect(rcFillSolid, AdjustBrightness(m_clrPage, 120)); } else{ pDC->FillSolidRect(rcFillSolid, AdjustBrightness(m_clrPage, 100)); } if( nRow == m_nCurrentStartPage-1){ strPage.Format("%s", "<上一页"); } else if( nRow == m_nCurrentEndPage ){ strPage.Format("%s", "下一页>"); } else{ strPage.Format("%d", nRow ); } pDC->DrawText(strPage, rcPage, DT_VCENTER | DT_SINGLELINE | DT_CENTER); } JumpPage(m_nJumpPageFlog); } void CStaticPage::JumpPage( __in unsigned int nJumpFlog ) { switch(nJumpFlog ) { case JUMP_NEXT_PAGE: { if( m_nCurrentEndPage-1 != m_nPageSize ){ m_nCurrentStartPage = m_nCurrentEndPage; } m_nCurrentPage = -1; Invalidate(); break; } case JUMP_UP_PAGE: { int nStartPage = m_nCurrentStartPage - m_nCurrentPageSize; if( nStartPage <= 0 ){ m_nCurrentStartPage = 1; } else{ m_nCurrentStartPage = nStartPage; } m_nCurrentPage = -1; Invalidate(); break; } } m_nJumpPageFlog = JUMP_SELECT_PAGE; } COLORREF CStaticPage::AdjustBrightness(CONST COLORREF clrSrcPixel, CONST INT nPercent) { return RGB(min(255, (GetRValue(clrSrcPixel) * nPercent) / 100), min(255, (GetGValue(clrSrcPixel) * nPercent) / 100), min(255, (GetBValue(clrSrcPixel) * nPercent) / 100)); } void CStaticPage::InitPage(__in unsigned int nSize/* =1 */, __in unsigned nCurPage/* =1 */, __in unsigned int nCurPageSize/* =6 */ ) { m_nPageSize = nSize; m_nCurrentPage = nCurPage; m_nCurrentPageSize = nCurPageSize; //重绘需要把风格修改成SS_OWNERDRAW DWORD dwStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE); dwStyle |= SS_OWNERDRAW | SS_NOTIFY; ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle); } void CStaticPage::SetPageSize(__in unsigned int nSize) { if ( nSize < 0){ return; } m_nPageSize = nSize; m_nCurrentStartPage = 1; m_nCurrentPage = 1; Invalidate(); } unsigned int CStaticPage::GetPageSize() { return m_nPageSize; } void CStaticPage::SetCurrentPage(__in unsigned int nPage) { m_nCurrentPage = nPage; Invalidate(); } unsigned int CStaticPage::GetCurrentPage() { return m_nCurrentPage; } void CStaticPage::SetCallBackPageOperation(__in PFNPAGEOPERATION pfnPageOperation, __in void *pUserData) { m_pfnPageOperation = pfnPageOperation; m_pUserData = pUserData; } LRESULT CStaticPage::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 switch (message) { case WM_LBUTTONDOWN: //单击 { CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); ClickPage(pt); break; } case WM_SIZE: { Invalidate(); break; } default: break; } return CStatic::WindowProc(message, wParam, lParam); } unsigned int CStaticPage::ClickPage(__in CPoint pt) { m_nJumpPageFlog = JUMP_SELECT_PAGE; int nItem = floor((float)pt.x / (DRAW_PAGE_WIDTH)); if( nItem == 0 ){ m_nJumpPageFlog = JUMP_UP_PAGE; TRACE("Click up page\n" ); } else if( nItem == m_nCurrentPageSize+1 ){ m_nJumpPageFlog = JUMP_NEXT_PAGE; TRACE("Click next page\n"); } int nPage = m_nCurrentStartPage + nItem - 1; //单击的页码可能会大于当前最大页码数 所以需要做以下判断 if (nPage > m_nPageSize || nPage < 0){ return m_nCurrentPage; } m_nCurrentPage = nPage; TRACE("Click %d\n", m_nCurrentPage); Invalidate(); if (m_nJumpPageFlog == JUMP_SELECT_PAGE){ if ( m_pfnPageOperation != NULL ){ m_pfnPageOperation(m_nCurrentPage, JUMP_SELECT_PAGE, GetSafeHwnd(), m_pUserData); } } return m_nCurrentPage; } void CStaticPage::SetPageColorref(COLORREF clr) { m_clrPage = clr; Invalidate(); } COLORREF CStaticPage::GetPageColorref() { return m_clrPage; } void CStaticPage::SetDefaultPageColorref() { m_clrPage = RGB(116, 184, 184); Invalidate(); } demo源码下载地址:http://download.csdn.net/detail/wu110112/9686421