MFC的CStatic控件验证码例子

SkinValidateCode.h

#ifndef SKIN_VALIDATE_CODE_HEAD_FILE
#define SKIN_VALIDATE_CODE_HEAD_FILE

#pragma once
#include "HeadFile.h"
using namespace Gdiplus;

//

#define VALIDATE_COUNT				4									//验证长度


//

//验证控件
class  CSkinValidateCode : public CStatic
{
	//变量定义
protected:
	bool							m_bValidateCode;					//验证标志
	TCHAR							m_szValidateCode[VALIDATE_COUNT];	//验证字符

	//控件变量
protected:
	CImage							m_ImageValidateCode;				//验证图片
	CFont*							m_font;								//字体

	//函数定义
public:
	//构造函数
	CSkinValidateCode();
	//析构函数
	virtual ~CSkinValidateCode();

	//功能函数
public:
	//创建验证
	VOID RandValidateCode();
	//设置验证码
	VOID SetValidateCode(TCHAR szEncryptCode[VALIDATE_COUNT]);
	//效验验证
	bool CheckValidateCode(LPCTSTR pszValidateCode);
	//构造图片
	VOID CreateValidateCode(CImage & ImageValidateCode, INT nWidth, INT nHeight);

	//消息函数
protected:
	//重画函数	
	VOID OnPaint();
	//位置消息
	VOID OnSize(UINT nType, INT cx, INT cy);


	DECLARE_MESSAGE_MAP()
};

//

#endif


SkinValidateCode.cpp

#include "SkinValidateCode.h"


//

BEGIN_MESSAGE_MAP(CSkinValidateCode, CStatic)
	ON_WM_SIZE()
	ON_WM_PAINT()
END_MESSAGE_MAP()

//

//构造函数
CSkinValidateCode::CSkinValidateCode()
{
	//设置变量
	m_bValidateCode=false;
	ZeroMemory(m_szValidateCode,sizeof(m_szValidateCode));
	m_font=new CFont;
	m_font->CreateFont(-18,0,0,0,FW_DEMIBOLD,1,0,0,134,3,2,ANTIALIASED_QUALITY,2,TEXT("微软雅黑"));

	return;
}

//析构函数
CSkinValidateCode::~CSkinValidateCode()
{
	if (m_font)
	{
		delete m_font;
	}
}

//创建验证
VOID CSkinValidateCode::RandValidateCode()
{
	//获取位置
	CRect rcClient;
	GetClientRect(&rcClient);

	srand(GetTickCount());

	//创建验证
	for (INT i=0;i<VALIDATE_COUNT;i++)
	{
		m_szValidateCode[i]=TEXT('0')+rand()%10;
	}

	//创建图片
	CreateValidateCode(m_ImageValidateCode,rcClient.Width(),rcClient.Height());

	//更新界面
	RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW);

	return;
}

//创建验证
VOID CSkinValidateCode::SetValidateCode(TCHAR szEncryptCode[VALIDATE_COUNT])
{

	//获取位置
	CRect rcClient;
	GetClientRect(&rcClient);
	INT nWidth=rcClient.Width();
	INT nHeight=rcClient.Height();

	解密
	//TCHAR szDecryptCode[VALIDATE_COUNT+1]={0};
	//bool bAuthenOK = XorVerificationcodeCrevasse(szEncryptCode,szDecryptCode,ARRAYSIZE(szDecryptCode));
	//if (false==bAuthenOK)
	//{
	//	return;
	//}

	//销毁图片
	if (m_ImageValidateCode.IsNull()==false)
	{
		m_ImageValidateCode.Destroy();
	}

	//构造图片
	ASSERT((nWidth>0)&&((nHeight>0)));
	m_ImageValidateCode.Create(nWidth,nHeight,32);

	//创建 DC
	CImageDC BufferDC(m_ImageValidateCode);
	CDC * pBufferDC=CDC::FromHandle(BufferDC);

	//背景色
	COLORREF crBack = RGB(210,210,150);

	//填充背景
	pBufferDC->FillSolidRect(1,1,nWidth-2,nHeight-2,crBack);
	pBufferDC->Draw3dRect(0,0,nWidth,nHeight,crBack,crBack);

	//随机背景
	for (INT nXPos=1;nXPos<nWidth-1;nXPos+=2)
	{
		for (INT nYPos=1;nYPos<nHeight-1;nYPos+=2)
		{
			pBufferDC->SetPixel(nXPos,nYPos,RGB(rand()%255,rand()%255,rand()%255));
		}
	}

	//设置 DC
	pBufferDC->SetBkMode(TRANSPARENT);
	COLORREF crOldVal = pBufferDC->SetTextColor(RGB(0,127,160));

	//变量定义
	INT nXSpace=nWidth/VALIDATE_COUNT;


	CFont *DrawFont2=NULL;
	DrawFont2=pBufferDC->SelectObject(m_font);

	//显示内容
	for (BYTE i=0;i<VALIDATE_COUNT;i++)
	{
		//位置定义
		CRect rcDraw;
		rcDraw.SetRect(i*nXSpace,0,(i+1)*nXSpace,nHeight);

		//显示内容
		//pBufferDC->DrawText(&szDecryptCode[i],1,&rcDraw,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
		pBufferDC->DrawText(&szEncryptCode[i],1,&rcDraw,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
		m_szValidateCode[i]=szEncryptCode[i];
		
	}

	//清理资源
	pBufferDC->SelectObject(DrawFont2);
	pBufferDC->SetTextColor(crOldVal);

	//更新界面
	RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW);



	return;
}


//效验验证
bool CSkinValidateCode::CheckValidateCode(LPCTSTR pszValidateCode)
{
	//长度验证
	if (pszValidateCode==NULL) return false;
	if (lstrlen(pszValidateCode)!=VALIDATE_COUNT) return false;

	//字符对比
	for (BYTE i=0;i<VALIDATE_COUNT;i++)
	{
		if (pszValidateCode[i]!=m_szValidateCode[i])
		{
			return false;
		}
	}

	return true;
}

//构造图片
VOID CSkinValidateCode::CreateValidateCode(CImage & ImageValidateCode, INT nWidth, INT nHeight)
{
	//销毁图片
	if (ImageValidateCode.IsNull()==false)
	{
		ImageValidateCode.Destroy();
	}

	//构造图片
	ASSERT((nWidth>0)&&((nHeight>0)));
	ImageValidateCode.Create(nWidth,nHeight,32);

	//创建 DC
	CImageDC BufferDC(ImageValidateCode);
	CDC * pBufferDC=CDC::FromHandle(BufferDC);

	//背景色
	COLORREF crBack = RGB(210,210,150);

	//填充背景
	pBufferDC->FillSolidRect(1,1,nWidth-2,nHeight-2,crBack);
	pBufferDC->Draw3dRect(0,0,nWidth,nHeight,crBack,crBack);

	//随机背景
	for (INT nXPos=1;nXPos<nWidth-1;nXPos+=2)
	{
		for (INT nYPos=1;nYPos<nHeight-1;nYPos+=2)
		{
			pBufferDC->SetPixel(nXPos,nYPos,RGB(rand()%255,rand()%255,rand()%255));
		}
	}

	//设置 DC
	pBufferDC->SetBkMode(TRANSPARENT);
	COLORREF crOldVal = pBufferDC->SetTextColor(RGB(0,127,160));

	//变量定义
	INT nXSpace=nWidth/ARRAYSIZE(m_szValidateCode);


	//设置字体
	CFont *DrawFont2=NULL;
	DrawFont2=pBufferDC->SelectObject(m_font);

	//显示内容
	for (BYTE i=0;i<VALIDATE_COUNT;i++)
	{
		//位置定义
		CRect rcDraw;
		rcDraw.SetRect(i*nXSpace,0,(i+1)*nXSpace,nHeight);

		//显示内容
		pBufferDC->DrawText(&m_szValidateCode[i],1,&rcDraw,DT_SINGLELINE|DT_VCENTER|DT_CENTER);

	}

	//清理资源
	pBufferDC->SelectObject(DrawFont2);
	pBufferDC->SetTextColor(crOldVal);

	return;
}

//重画消息
VOID CSkinValidateCode::OnPaint()
{
	//__super::OnPaint();

	//变量定义
	CPaintDC dc(this);

	//获取位置
	CRect rcClient;
	GetClientRect(&rcClient);

	//绘画界面
	if (m_ImageValidateCode.IsNull()==false)
	{
		//创建 DC
		CImageDC BufferDC(m_ImageValidateCode);
		CDC * pBufferDC=CDC::FromHandle(BufferDC);

		//绘画界面
		m_ImageValidateCode.BitBlt(dc,0,0,rcClient.Width(),rcClient.Height(),0,0,SRCCOPY);
	}
	else
	{
		//默认背景
		//dc.FillSolidRect(&rcClient,RGB(255,255,255));
	}

	return;
}

//位置消息
VOID CSkinValidateCode::OnSize(UINT nType, INT cx, INT cy) 
{
	__super::OnSize(nType, cx, cy);

	//调整控件
	if (m_bValidateCode==true)
	{
		//获取位置
		CRect rcClient;
		GetClientRect(&rcClient);

		//创建图片
		CreateValidateCode(m_ImageValidateCode,rcClient.Width(),rcClient.Height());

		//更新界面
		RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW);
	}

	return;
}



//


 

	CSkinValidateCode				m_WndValidateCode;					//验证控件

	//验证控件
	m_WndValidateCode.Create(TEXT("9876"),WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY,CRect(10,10,150,50),this,IDC_PASS);//宽150-10   高50-10
	m_WndValidateCode.RandValidateCode();

	m_WndValidateCode.SetValidateCode(TEXT("1234"));

	if (m_WndValidateCode.CheckValidateCode(TEXT("1234")))
	{
		OutputDebugString(TEXT("验证码正确"));
	}

	//case IDC_PASS:
	//	{
	//		m_WndValidateCode.RandValidateCode();
	//	}
	//	break;


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值