📄 logindlg.cpp
字号:
// LoginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Client.h"
#include "LoginDlg.h"
#include "ChipstBankApi.h"
#include "md5.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_ICON_NOTIFY WM_USER + 10
#define TIMER_ID 101
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_nTime = 0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Control(pDX, IDC_EDIT_PASSWORD, m_EditPassword);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
ON_EN_CHANGE(IDC_EDIT_PASSWORD, OnChangeEditPassword)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_MOUSEWHEEL()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_COMMAND(IDM_SHOW_KEYBOARD, OnShowKeyboard)
ON_UPDATE_COMMAND_UI(IDM_SHOW_KEYBOARD, OnUpdateShowKeyboard)
ON_COMMAND(IDM_HIDE_KEYBOARD, OnHideKeyboard)
ON_UPDATE_COMMAND_UI(IDM_HIDE_KEYBOARD, OnUpdateHideKeyboard)
ON_COMMAND(IDM_EXIT, OnExit)
ON_WM_SHOWWINDOW()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlers
#define TAB 0x02
#define CAPSLOCK 0x03
#define SHIFT 0x04
#define CTRL 0x05
#define BSPACE 0x06
#define ENTER 0x07
#define ALT 0x08
#define WINDOW 0x9
#define LEFT 0x0A
#define RIGHT 0x0B
#define UP 0x0C
#define DOWN 0x0D
#define ESC 0x0E
#define PUP 0x0F
#define PDN 0x10
#define HOME 0x11
#define END 0x12
#define INS 0x13
#define DEL 0x14
#define UNS 0x15
#define L 18
#define T 185
#define R 498
#define B 330
void CLoginDlg::OnLogin()
{
CString PWD;
unsigned char AuthorizeKey[32]={"uns"};
if ( m_usbHandle = OpenUsbDisk(AuthorizeKey) )
{
m_EditPassword.SetFocus();
m_EditPassword.GetWindowText(PWD);
char *md5 = MD5String(PWD.GetBuffer(0));
unsigned char * pFilePassword = new unsigned char[512];
if ( ReadPrivateUserSector(m_usbHandle,1,pFilePassword,1,0) )
{
if (pFilePassword[0]!=0)
{
if (memcmp((void*)md5,(void*)pFilePassword,32) == 0)
{
CloseUsbDisk(m_usbHandle);
CDialog::OnOK();
}
else
{
if (m_nTime==2)
{
CloseUsbDisk(m_usbHandle);
CDialog::OnCancel();
}
MessageBox("密码错误!");
m_nTime++;
m_EditPassword.SetWindowText("");
m_EditPassword.SetFocus();
}
}
else
{
if(WritePrivateUserSector(m_usbHandle,1,(unsigned char *)md5,1,0))
{
MessageBox("save password successful");
CloseUsbDisk(m_usbHandle);
CDialog::OnOK();
}
else
{
MessageBox("save password failed");
CloseUsbDisk(m_usbHandle);
CDialog::OnCancel();
}
}
}
}
else
{
MessageBox("cannot read usbkey");
CloseUsbDisk(m_usbHandle);
CDialog::OnCancel();
}
}
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// unsigned char AuthorizeKey[4]={"uns"};
// // TODO: Add extra initialization here
// if ( m_usbHandle = OpenUsbDisk(AuthorizeKey) )
// {
// return TRUE;
// m_EditPassword.SetFocus();
// CLoginDlg::OnOK();
// }
// else
// {
// MessageBox("password error");
// }
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//build the keyboard definition
//control row
AddKey(0x00,0x00,0); //signal row change
AddKey(0x00,ESC,10);
for(int fnkey = 0x70; fnkey < 0x7C; fnkey++)
{
AddKey(0x00,fnkey & 0xFF,10);
}
AddKey(0x00,INS,14);
AddKey(0x00,DEL,-10);
//first row
AddKey(0x00,0x00,1); //signal row change
AddKey('`','~',10);
AddKey('1','!',10);
AddKey('2','@',10);
AddKey('3','#',10);
AddKey('4','$',10);
AddKey('5','%',10);
AddKey('6','^',10);
AddKey('7','&',10);
AddKey('8','*',10);
AddKey('9','(',10);
AddKey('0',')',10);
AddKey('-','_',10);
AddKey('=','+',10);
AddKey(0x00,BSPACE,14); //backspace
AddKey(0x00,PUP,-10);
//second row
AddKey(0x00,0x00,2); //signal row change
AddKey(0x00,TAB,14); //tab
AddKey('q','Q',10);
AddKey('w','W',10);
AddKey('e','E',10);
AddKey('r','R',10);
AddKey('t','T',10);
AddKey('y','Y',10);
AddKey('u','U',10);
AddKey('i','I',10);
AddKey('o','O',10);
AddKey('p','P',10);
AddKey('[','{',10);
AddKey(']','}',10);
AddKey('\\','|',10);
AddKey(0x00,PDN,-10);
//third row
AddKey(0x00,0x00,3); //signal row change
AddKey(0x00,CAPSLOCK,18); //caps lock
AddKey('a','A',10);
AddKey('s','S',10);
AddKey('d','D',10);
AddKey('f','F',10);
AddKey('g','G',10);
AddKey('h','H',10);
AddKey('j','J',10);
AddKey('k','K',10);
AddKey('l','L',10);
AddKey(';',':',10);
AddKey('\'','\"',10);
AddKey(0x00,ENTER,16); //enter
AddKey(0x00,HOME,-10);
//fourth row
AddKey(0x00,0x00,4); //signal row change
AddKey(0x00,SHIFT,22); //shift
AddKey('z','Z',10);
AddKey('x','X',10);
AddKey('c','C',10);
AddKey('v','V',10);
AddKey('b','B',10);
AddKey('n','N',10);
AddKey('m','M',10);
AddKey(',','<',10);
AddKey('.','>',10);
AddKey('/','?',10);
AddKey(0x00,SHIFT,22); //shift
AddKey(0x00,END,-10);
//fifth row
AddKey(0x00,0x00,5); //signal row change
AddKey(0x00,CTRL,12); //ctrl
AddKey(0x00,WINDOW,12); //window
AddKey(0x00,ALT,12); //alt
AddKey(' ',' ',60);
AddKey(0x00,LEFT,12); //left
AddKey(0x00,UP,12); //up
AddKey(0x00,DOWN,12); //down
AddKey(0x00,RIGHT,12); //right
AddKey(0x00,UNS,-10); //http://WWW
CalcWidthHeight();
//put an icon for us in the system tray
//add us the the system tray
VERIFY(cSystray.Create(NULL, // Parent window
WM_ICON_NOTIFY, // Icon notify message to use
_T("Onscreen Keyboard"), // tooltip
m_hIcon, // Icon to use
IDR_TRAY_MENU)); // ID of tray icon
SetTimer(TIMER_ID,250,NULL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLoginDlg::OnCancel()
{
// TODO: Add extra cleanup here
// CloseUsbDisk(m_usbHandle);
CDialog::OnCancel();
ShowWindow(SW_HIDE);
}
void CLoginDlg::OnChangeEditPassword()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
void CLoginDlg::CalcWidthHeight()
{
pKeyWidth = 0;
pKeyHeight = 0;
KEYDEF * key;
POSITION pos = cKeys.GetHeadPosition();
long totalWidth = 0;
long longest = 0;
long rows = 0;
while(pos)
{
key = cKeys.GetNext(pos);
if((key->cNormal == 0x00) && (key->cShifted == 0x00))
{
rows++;
if(totalWidth > longest)
{
longest = totalWidth;
}
totalWidth = 0;
}
else
{
totalWidth += abs(key->cWidth);
}
}
// CRect rect;
// GetClientRect(rect);
CRect rect(L, T, R, B);
pKeyHeight = rect.Height()/ rows;
pKeyWidth = (int)(((double)rect.Width()) / ((((double)(longest)) / 10)));
}
void CLoginDlg::AddKey(
char pNormal,
char pShifted,
int pWidth)
{
KEYDEF * key = new KEYDEF;
key->cNormal = pNormal;
key->cShifted = pShifted;
key->cWidth = pWidth;
cKeys.AddTail(key);
}
void CLoginDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CLoginDlg::DrawKey(CDC * dc, CRect & rc, KEYDEF * key, BOOL cHilight)
{
if(!cHilight)
{
rc.DeflateRect(1,1);
dc->FillSolidRect(rc,GetSysColor(COLOR_3DFACE));
dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
rc.DeflateRect(1,1);
dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
}
else
{
rc.DeflateRect(1,1);
dc->FillSolidRect(rc,GetSysColor(COLOR_3DLIGHT));
dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
rc.DeflateRect(1,1);
dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
}
rc.DeflateRect(3,1);
if(key->cNormal == 0x00)
{
CString label = " ";
BOOL special = FALSE;
if(key->cShifted > 0x6F)
{
int fkeynum = key->cShifted - 0x6F;
label.Format("F%d",fkeynum);
}
else
{
switch(key->cShifted)
{
case TAB:
label = "Tab->|";
break;
case CAPSLOCK:
label = "Caps";
break;
case SHIFT:
label = "Shift";
break;
case CTRL:
label = "Ctrl";
break;
case BSPACE:
label = "<-";
break;
case ENTER:
label = "Enter";
break;
case ALT:
label = "Alt";
break;
case WINDOW:
label = "Wnd";
break;
case ESC:
label = "Esc";
break;
case LEFT:
special = TRUE;
{
int cx = (rc.left + rc.right)/2;
int cy = (rc.top + rc.bottom)/2;
int siz = rc.Width()/3;
dc->MoveTo(cx+siz, cy);
dc->LineTo(cx-siz, cy);
dc->LineTo(cx-siz + (siz*4)/5, cy - siz/2);
dc->MoveTo(cx-siz, cy);
dc->LineTo(cx-siz + (siz*4)/5, cy + siz/2);
}
break;
case RIGHT:
special = TRUE;
{
int cx = (rc.left + rc.right)/2;
int cy = (rc.top + rc.bottom)/2;
int siz = rc.Width()/3;
dc->MoveTo(cx-siz, cy);
dc->LineTo(cx+siz, cy);
dc->LineTo(cx+siz - (siz*4)/5, cy - siz/2);
dc->MoveTo(cx+siz, cy);
dc->LineTo(cx+siz - (siz*4)/5, cy + siz/2);
}
break;
case UP:
special = TRUE;
{
int cx = (rc.left + rc.right)/2;
int cy = (rc.top + rc.bottom)/2;
int siz = rc.Width()/3;
dc->MoveTo(cx, cy+siz);
dc->LineTo(cx, cy-siz);
dc->LineTo(cx - siz/2, cy-siz + (siz*4)/5);
dc->LineTo(cx, cy-siz);
dc->LineTo(cx + siz/2, cy-siz + (siz*4)/5);
}
break;
case DOWN:
special = TRUE;
{
int cx = (rc.left + rc.right)/2;
int cy = (rc.top + rc.bottom)/2;
int siz = rc.Width()/3;
dc->MoveTo(cx, cy-siz);
dc->LineTo(cx, cy+siz);
dc->LineTo(cx - siz/2, cy+siz - (siz*4)/5);
dc->LineTo(cx, cy+siz);
dc->LineTo(cx + siz/2, cy+siz - (siz*4)/5);
}
break;
case PUP:
label = "PgUp";
break;
case PDN:
label = "PgDn";
break;
case HOME:
label = "Home";
break;
case END:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -