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;