static自绘页码控件类

实现效果看过了,下面我们来看源码:

头文件:

#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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值