MFC的CStatic控件验证码例子

来源:互联网 发布:win8制作mac启动盘 编辑:程序博客网 时间:2024/06/15 02:58

SkinValidateCode.h

#ifndef SKIN_VALIDATE_CODE_HEAD_FILE#define SKIN_VALIDATE_CODE_HEAD_FILE#pragma once#include "HeadFile.h"using namespace Gdiplus;//////////////////////////////////////////////////////////////////////////////////#define VALIDATE_COUNT4//验证长度////////////////////////////////////////////////////////////////////////////////////验证控件class  CSkinValidateCode : public CStatic{//变量定义protected:boolm_bValidateCode;//验证标志TCHARm_szValidateCode[VALIDATE_COUNT];//验证字符//控件变量protected:CImagem_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);//创建 DCCImageDC 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));}}//设置 DCpBufferDC->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);//创建 DCCImageDC 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));}}//设置 DCpBufferDC->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){//创建 DCCImageDC 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;}//////////////////////////////////////////////////////////////////////////////////


 

CSkinValidateCodem_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-10m_WndValidateCode.RandValidateCode();m_WndValidateCode.SetValidateCode(TEXT("1234"));if (m_WndValidateCode.CheckValidateCode(TEXT("1234"))){OutputDebugString(TEXT("验证码正确"));}//case IDC_PASS://{//m_WndValidateCode.RandValidateCode();//}//break;


 

0 0