www.gusucode.com > VC++挂机锁屏系统源程序源码程序 > VC++挂机锁屏系统源程序源码程序\code\UNLOCKDlg.cpp

    // UNLOCKDlg.cpp : implementation file
//
/*----------------------------------------------------------------------------*/
//
//	文件:		UNLOCKDlg.cpp
//  版本:      1.0
//	作者:		蔡亦汤
//	创建时间:	2007 3 26
//  EMAIL:      caiyitang2003@163.com
/*----------------------------------------------------------------------------
/*
/* Copyright (C) 2007-2008 by  LeoSoftware
/* All Rights Reserved.
/* Download by http://www.NewXing.com
/*----------------------------------------------------------------------------*/

///////////////////////////////////////功能说明 ////////////////////////////////////////
//屏幕键盘输入密码和隐藏窗口(类似QQ)
//退出系统
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LOCK.h"
#include "UNLOCKDlg.h"
#include <math.h>
#include "PINGMUDlg.h"
#include "LOCKDlg.h"
#include <tlhelp32.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define HIGHLIGHTTEXTCOLOR  RGB(255,200,0)    //按下键键显示的颜色
#define WM_MYMOUSEMOVE			WM_USER+101   //定义鼠标移动消息
/////////////////////////////////////////////////////////////////////////////
//定义特殊系统键的键值
#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


// CUNLOCKDlg dialog
CUNLOCKDlg::CUNLOCKDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUNLOCKDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUNLOCKDlg)
	m_unlockpsw = _T("");    //解密密码
	//}}AFX_DATA_INIT
	m_ShowTitle = TRUE;

}


void CUNLOCKDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUNLOCKDlg)
	DDX_Text(pDX, IDC_UNLOCKPSW, m_unlockpsw);
	DDX_Control(pDX, IDC_UNLOCKPSW, m_unlockpsw_edit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUNLOCKDlg, CDialog)
	//{{AFX_MSG_MAP(CUNLOCKDlg)
	//ON_WM_NCLBUTTONDOWN()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEWHEEL()
	ON_WM_RBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_WM_DESTROY()
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_UNLOCKBUTTON, OnUnlockbutton)
	ON_BN_CLICKED(IDC_ABOUTBUTTON, OnAboutbutton)
	ON_MESSAGE(WM_MYMOUSEMOVE, OnMymouseMove)
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_WM_NCMOUSEMOVE()
	ON_WM_NCLBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_WM_NCHITTEST()
	ON_WM_ACTIVATE()
	ON_WM_SETFOCUS()
	ON_WM_NCACTIVATE()
	ON_WM_MOUSEACTIVATE()

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUNLOCKDlg message handlers
/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::CalcWidthHeight()
// 
// 描述:
//     
//		计算键的高度和宽度
//
// 返回:
//
//		[void]	
// 参数:
//
//		无
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::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);
	pKeyHeight = (rect.Height() - 60) / rows;    //每个键的高度
	pKeyWidth = (int)(((double)rect.Width()) / ((((double)(longest)) / 10)));    //键的平均长度

}

BOOL CUNLOCKDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	//设置窗口为前置
	::SetWindowPos(AfxGetMainWnd()->m_hWnd,HWND_TOPMOST,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE);
	//Download by http://www.NewXing.com
	GetWindowRect(&dlgrect);
	CRect rcWindowRect,rcRect,rcDeskTopWnd;
	::GetWindowRect(::GetDesktopWindow(),&rcDeskTopWnd);    //得到桌面的大小
	GetWindowRect(rcWindowRect);    //得到窗体的大小
	rcRect = GetTrayWndRect();    //得到任务栏的大小
	int nBorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
	rcWindowRect.top = rcDeskTopWnd.bottom -rcRect.Height()-rcWindowRect.Height();    //窗口顶部坐标
	rcWindowRect.bottom = rcDeskTopWnd.bottom-rcRect.Height();
	rcWindowRect.left = rcRect.right-(rcWindowRect.Width()+2*nBorderWidth);    //窗口左边坐标
   
	CRect dlgRect;
	GetWindowRect(dlgRect);
	
	MoveWindow(rcWindowRect.left,rcWindowRect.top,dlgRect.Width(),dlgRect.Height());   //显示窗口
    
	//MoveWindow((rcRect.right-dlgrect.Width()-10), dlgRect.top,      //显示本窗口
	//			dlgrect.Width(), dlgRect.Height(), true);
	
	m_hIcon1 = (HICON)::LoadImage(AfxFindResourceHandle(MAKEINTRESOURCE(IDI_TIP1), RT_GROUP_ICON), 
		                          MAKEINTRESOURCE(IDI_TIP1), IMAGE_ICON, 0, 0, 0);
	// 创建提示工具
	m_Tip.Create(this);

	// 加入到提示工具里
	m_Tip.AddTool(GetDlgItem(IDC_UNLOCKPSW), _T("请输入解锁密码!"), m_hIcon1);
    
	//解密按钮的设计
	m_UnLock.SubclassDlgItem (IDC_UNLOCKBUTTON, this);
	m_UnLock.SetIcon (IDI_UNLOCK);
	m_UnLock.SetColor (CButtonST::BTNST_COLOR_BK_IN, RGB(198, 211, 238));
	m_UnLock.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(231,239,245));
	m_UnLock.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(231,239,245));
	m_UnLock.OffsetColor(CButtonST::BTNST_COLOR_BK_IN,30);
	m_UnLock.SetTooltipText(_T("解除锁屏,退出系统!"));

	//关于按钮的设计
	m_About.SubclassDlgItem (IDC_ABOUTBUTTON, this);
	m_About.SetIcon (IDI_ABOUT);
	m_About.SetColor (CButtonST::BTNST_COLOR_BK_IN, RGB(198, 211, 238));
	m_About.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(231,239,245));
	m_About.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(231,239,245));
	m_About.OffsetColor(CButtonST::BTNST_COLOR_BK_IN,30);
	m_About.SetTooltipText(_T("关于作者!"));

	//静态文本控件的设计
	m_Static1.SubclassDlgItem(IDC_STATIC1,this);
	m_Static1.SetCaption(" 输入解锁密码:");
	m_Static1.SetBackColor(RGB(208,208,208));
	m_Static1.SetTextColor(RGB(255, 0, 0));

   	FillBkBrushColor();    //填充键的颜色

	gFocus = NULL;

	//将所有键加到链表中保存起来
	AddKey(0x00,0x00,0);   //改变键盘行的标志
	AddKey(0x00,ESC,10);
	for(int fnkey = 0x70; fnkey < 0x7C; fnkey++)
	{
		AddKey(0x00,fnkey & 0xFF,10);
	}
	AddKey(0x00,INS,14);
	AddKey(0x00,DEL,-10);

	//第一行的键
	AddKey(0x00,0x00,1); //改变键盘行的标志
	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,-12);

	//第二行的键
	AddKey(0x00,0x00,2); //改变键盘行的标志
	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,-12);

	//第三行的键
	AddKey(0x00,0x00,3); //改变键盘行的标志
	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);

	//第四行的键
	AddKey(0x00,0x00,4); //改变键盘行的标志
	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);

	AddKey(0x00,0x00,5); //改变键盘行的标志
	AddKey(0x00,CTRL,12); //ctrl
	AddKey(0x00,WINDOW,12); //window
	AddKey(0x00,ALT,12); //alt
	AddKey(' ',' ',76);
	AddKey(0x00,LEFT,12); //left
	AddKey(0x00,UP,12); //up
	AddKey(0x00,DOWN,12); //down
	AddKey(0x00,RIGHT,-12); //right

	CalcWidthHeight();  //计算窗口中按键大小
	CalKeyRect();      //保存每一个按键的位置

    SetTimer(1, 50, NULL);    //打开定时器
    
   	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::GetTrayWndRect()
// 
// 描述:
//     
//		计算任务栏的大小
//
// 返回:
//
//		[CRect]	      -返回任务栏的大小
// 参数:
//
//		无
//   
/////////////////////////////////////////////////////////////////////
CRect CUNLOCKDlg::GetTrayWndRect()
{
	CRect rect(0,0,0,0);
    CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);    //得到任务栏窗口指针
    if (pWnd)
    {
        pWnd->GetWindowRect(&rect);
	}
	return rect;

}

BOOL CUNLOCKDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	HWND wnd = ::GetForegroundWindow();    //得到当前窗口句柄
	if (IsWindow(wnd))
	{
		if (wnd != this->m_hWnd)    //如果当前激活窗口不是本程序的窗口
		{
			if (gFocus != wnd)
			{
				if (IsWindow(gFocus))
				{
					AttachThreadInput(
						GetCurrentThreadId(),
						GetWindowThreadProcessId(gFocus,NULL),
						FALSE);                                 //释放本进程和gFocus线程的联系
				}

				gFocus = wnd;
				//使本进程和激活窗口的进程联系起来,接收本进程的按键消息
				AttachThreadInput(
					GetCurrentThreadId(),
					GetWindowThreadProcessId(gFocus,NULL),
					TRUE);                                   
			}
		}
	}

	//按下ESC和回车键窗口不退出
	if ( pMsg->message == WM_KEYDOWN)   
    {  
		if(( pMsg->wParam == VK_RETURN)||(pMsg->wParam == VK_ESCAPE))   
        return   TRUE;   
     }   

    m_Tip.RelayEvent(pMsg);    ////响应工具提示消息

	return CDialog::PreTranslateMessage(pMsg);
}

void CUNLOCKDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent==1)
	{
		
		SendMessage(WM_MYMOUSEMOVE, NULL, NULL);    //发送鼠标移动消息
	}

   
	CDialog::OnTimer(nIDEvent);
}

void CUNLOCKDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnClose();
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::AddKey()
// 
// 描述:
//     
//		增加一个键,保存起来
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[pNormal]			- 键值
//      [pShifted]          - 系统键值
//      [pWidth]            - 键宽
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::AddKey(char pNormal, char pShifted, int pWidth)
{
	KEYDEF *key = new KEYDEF;
	key->cNormal = pNormal;
	key->cShifted = pShifted;
	key->bHighlight=false;    //不亮
	key->cWidth = pWidth;
	cKeys.AddTail(key);    //增加键到链表里

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::DrawKey()
// 
// 描述:
//     
//		画一个键
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[dc]			- 场景设备CDC的对象指针
//      [key]           - 键
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::DrawKey(CDC *dc, KEYDEF *key)
{
	CString label = " ";
	BOOL special = FALSE;
	CRect rc = key->rect;
    
	//换行返回
	if(key->cNormal==0x00 && key->cShifted==0x00)   
		return ;

	COLORREF OldColor = dc->GetTextColor() ;
	CPen Pen, TextPen;
	CPen *pOldPen = NULL ;
	if(!key->bHighlight)  //没有高亮显示
	{
		rc.DeflateRect(1,1);
		DoGradientFill(dc,&rc);
		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,RGB(0x20,0xff,0x99));  //鼠标在上面的时候填充颜色
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
		rc.DeflateRect(1,1);
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
		dc->SetTextColor(HIGHLIGHTTEXTCOLOR) ;
		Pen.CreatePen(PS_SOLID,1,HIGHLIGHTTEXTCOLOR) ;
		pOldPen = dc->SelectObject(&Pen) ;
	}

	rc.DeflateRect(3,1);

	CFont *pOldFont=dc->SelectObject(&m_TextFont);		//按键的字体颜色和大小
	dc->SetTextColor(RGB(0x88,0x22,0x11));
	TextPen.CreatePen(PS_SOLID,2,RGB(0x88,0x22,0x11)) ; //绘制方向键的颜色和大小
	pOldPen = dc->SelectObject(&TextPen) ;

	if(key->cNormal == 0x00)    //不是普通键
	{

		if(key->cShifted > 0x6F) //is a function
		{
			int fkeynum = key->cShifted - 0x6F;
			label.Format("F%d",fkeynum);     //获得键名字符串
		}
		else
		{
			switch(key->cShifted)
			{
			case TAB:    // 0x02
				label = "Tab->";
				break;
			case CAPSLOCK:    // 0x03
				label = "Caps";
				break;
			case SHIFT:    // 0x04
				label = "Shift";
				break;
			case CTRL:    // 0x05
				label = "Ctrl";
				break;
			case BSPACE:    // 0x06
				label = "<-Bspc";
				break;
			case ENTER:    // 0x07
				label = "Enter";
				break;
			case ALT:    // 0x08
				label = "Alt";
				break;
			case WINDOW:    // 0x9
				label = "Wnd";
				break;
			case ESC:
				label = "Esc";
				break;
			case LEFT:    // 0x0A
				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:    // 0x0B
				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:    // 0x0C
				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:    // 0x0D
				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: //0x0F
				label = "PgUp";
				break;
			case PDN: //0x10
				label = "PgDn";
				break;
			case HOME: //0x11
				label = "Home";
				break;
			case END: //0x12
				label = "End";
				break;
			case INS: //0x13
				label = "Ins";
				break;
			case DEL: //0x14
				label = "Del";
				break;
			default:
				ASSERT(FALSE);
				label = "#ERR#";
				break;
			}
		}
		if (!special)    //不是特殊键
		{
			CSize tsize;
			tsize = dc->GetTextExtent(label);
			dc->TextOut(
				((rc.left + rc.right)/2) - (tsize.cx/2), 
				((rc.top + rc.bottom)/2) - (tsize.cy/2), 
				label);
		}
	}
	else
	{
		if((key->cShifted >= 'A') && (key->cShifted <= 'Z'))
		{
			CSize tsize;
			label.Format("%c",key->cShifted);
			tsize = dc->GetTextExtent(label);
			dc->TextOut(
				((rc.left + rc.right)/2) - (tsize.cx/2), 
				((rc.top + rc.bottom)/2) - (tsize.cy/2), 
				label);
		}
		else
		{
			//画键
			CSize tsize;
			tsize = dc->GetTextExtent("M");
			label.Format("%c",key->cShifted);
			dc->TextOut(rc.left, rc.top, label);
			label.Format("%c",key->cNormal);
			dc->TextOut(
				rc.right - tsize.cx, 
				rc.bottom - tsize.cy,
				label);
		}
	}
	dc->SetTextColor(OldColor) ;
	dc->SelectObject(pOldFont);
	if(pOldPen)
		dc->SelectObject(pOldPen) ;

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::DrawKeyboard()
// 
// 描述:
//     
//		画整个键盘
//
// 返回:
//
//		[void]	
// 参数:
//
//		无
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::DrawKeyboard()
{
	//获得设备场景并设置模式
	CClientDC dc(this);
	CRect client;
	GetClientRect(client);
	CRgn clipRgn;
	clipRgn.CreateRectRgnIndirect(&client);
	dc.SelectClipRgn(&clipRgn);
	dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
	dc.SetBkMode(TRANSPARENT);

	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	cCurrentKeyState = DescribleKeyState();
	int state = cCurrentKeyState;
	while (pos)
	{
		key = cKeys.GetNext(pos);    //获得每一个键

		//检查系统键释放处于高亮度显示
		if (key->cNormal == 0x00)
		{
			switch (key->cShifted)
			{
			case CAPSLOCK:
				key->bHighlight = false;
				if(state & 0x01)
				{
					key->bHighlight = true;
				}
				break;
			case SHIFT:
				key->bHighlight = false;
				if(state & 0x02)
				{
					key->bHighlight = true;
				}
				break;
			case CTRL:
				key->bHighlight = false;
				if(state & 0x04)
				{
					key->bHighlight = true;
				}
				break;
			default:
				break;
			}
		}

		DrawKey(&dc,key);    //画键
	}

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::DescribleKeyState()
// 
// 描述:
//     
//		获得当时键"capital","shift","control"的状态
//
// 返回:
//
//		[int]	       -返回键的状态值
// 参数:
//
//		无
//
/////////////////////////////////////////////////////////////////////
int CUNLOCKDlg::DescribleKeyState()
{
	int state = 0;
	short ks;

    //capital
	ks = GetKeyState(VK_CAPITAL);
	if(ks & 0x000F) state += 0x01;
    
	//shift
	ks = GetKeyState(VK_SHIFT);
	if(ks & 0xF000) state += 0x02;

	//control
	ks = GetKeyState(VK_CONTROL);
	if(ks & 0xF000) state += 0x04;
	return state;

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::DoGradientFill()
// 
// 描述:
//     
//		绘制渐变的按钮形状
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[pDC]			- 场景设备CDC的对象指针
//      [rect]          - 键的大小
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::DoGradientFill(CDC *pDC, CRect *rect)
{
	CRect rct;
	int nWidth = rect->Width();	   //键宽
	int nHeight = rect->Height();  //键高

	for (int i = rect->top; i <= rect->bottom; i++) 
	{
		rct.SetRect(rect->left, i, rect->right, i + 1);
		pDC->FillRect(&rct, &m_BTBkColor[((i-rect->top)*63) / nHeight]);   //填充键的颜色
	}

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::FillBkBrushColor()
// 
// 描述:
//     
//		设置键的填充颜色
//
// 返回:
//
//		[void]	
// 参数:
//
//		无
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::FillBkBrushColor()
{
	for (int i = 0; i < 64; i ++)
	{
		m_BTBkColor[i].CreateSolidBrush(RGB(255 - (i / 4) , 255 - (i*2), 255-(i*3)));  //键的颜色
	}

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::FreeBkBrushColor()
// 
// 描述:
//     
//		释放键颜色的对象
//
// 返回:
//
//		[void]
// 参数:
//
//		无	
//
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::FreeBkBrushColor()
{
		for (int i = 0; i < 64; i ++)
		m_BTBkColor[i].DeleteObject();  //释放m_BTBkColor

}


void CUNLOCKDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	//重画键盘和键
/*	if(IsWindow(m_hWnd))
	{
		if(cKeys.GetCount())
		{
			CalcWidthHeight();
			Invalidate();
		}
	}*/

	
}

void CUNLOCKDlg::OnPaint() 
{
	//CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here

	CDialog::OnPaint();
	
	DrawKeyboard();    //画键盘
	
	// Do not call CDialog::OnPaint() for painting messages
}

void CUNLOCKDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(IsWindow(gFocus))
	{
		::SetActiveWindow(gFocus);   //激活
	}
	return;
	//CDialog::OnLButtonDown(nFlags, point);
}

void CUNLOCKDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ReleaseFocus();    //释放本程序的焦点状态,即使刚才处于活动的程序重新激活

	//找到哪个键被单击了
	CClientDC dc(this);
	dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
	dc.SetBkMode(TRANSPARENT);
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	while (pos)
	{
		key = cKeys.GetNext(pos);
		if (key->rect.PtInRect(point))
		{
			SendKey(key);    //发送按键消息
			DrawKey(&dc,key);    //画键
			return;
		}
	}
	//CDialog::OnLButtonUp(nFlags, point);
}

BOOL CUNLOCKDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
		return TRUE;
//	return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}

void CUNLOCKDlg::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	OnLButtonUp(nFlags, point);
	//CDialog::OnRButtonUp(nFlags, point);
}

void CUNLOCKDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	OnLButtonDown(nFlags, point);
	//CDialog::OnLButtonDblClk(nFlags, point);
}

void CUNLOCKDlg::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	OnLButtonDown(nFlags, point);
	//CDialog::OnRButtonDblClk(nFlags, point);
}

void CUNLOCKDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	OnLButtonDown(nFlags, point);
	//CDialog::OnRButtonDown(nFlags, point);
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::ReleaseFocus()
// 
// 描述:
//     
//		释放本程序的窗口激活状态
//
// 返回:
//
//		[void]	
// 
//参数:
//      无
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::ReleaseFocus()
{
	if (IsWindow(gFocus))
	{
		HWND wnd = ::GetForegroundWindow();   //得到当前窗口句柄
		if (IsWindow(wnd))
		{
			if (wnd == gFocus)
			{
				return;
			}
		}
		::SetForegroundWindow(gFocus);         //设置保存的焦点窗口处于激活状态
		::SetFocus(gFocus);
	}

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::CalKeyRect()
// 
// 描述:
//     
//		计算按键的矩形区域
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		无
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::CalKeyRect()
{
	CRect client;
	GetClientRect(client);
	int x = 0;
	int y = -pKeyHeight;
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	while (pos)
	{
		key = cKeys.GetNext(pos);
		if((key->cNormal == 0x00) && (key->cShifted == 0x00))
		{
			x = 5;
			y += pKeyHeight;
		}
		else
		{
			int width = ((abs(key->cWidth) * pKeyWidth) / 10);
			CRect rc(x,y,x + width, y + pKeyHeight);
			if(key->cWidth < 0)
			{
				rc.right = client.right;
			}
			x+= width;
			key->rect=rc;
		}
	}

}

void CUNLOCKDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	::DestroyIcon(m_hIcon1);

	FreeBkBrushColor();    //释放填充颜色的内存

	//清除所有键
	POSITION pos = cKeys.GetHeadPosition();
	while (pos)
	{
		delete cKeys.GetNext(pos);
	}
	int state = DescribleKeyState();
	if(state & 0x01) keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);
	if(state & 0x02) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
	if(state & 0x04) keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

}

void CUNLOCKDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ReleaseFocus();
	CClientDC dc(this);
	dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
	dc.SetBkMode(TRANSPARENT);
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	cCurrentKeyState = DescribleKeyState();
	int state = cCurrentKeyState;
	while(pos)
	{
		key = cKeys.GetNext(pos);
		if(key->rect.PtInRect(point))  //鼠标在按键上
		{
			if(key->bHighlight!=true)
			{
				key->bHighlight=true;	
				DrawKey(&dc,key);
			}
		}
		else if(key->bHighlight==true)  //不在你上面你也亮的话
		{
			if(key->cNormal == 0x00) //判断是不是shift,ctrl,caps
			{
				switch(key->cShifted)
				{
				case CAPSLOCK:
					if(!(state & 0x01))  //根据当前状态不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}
					break;
				case SHIFT:
					if(!(state & 0x02))  //不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}
					break;
				case CTRL:
					if(!(state & 0x04))  //不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}	
					break;
				default:
					key->bHighlight = false;  //其它功能键关掉
					DrawKey(&dc,key);
					break;
				}
			}
			else
			{
				key->bHighlight = false;  //不是功能键关掉
				DrawKey(&dc,key);
			}
		}
	}
	//CDialog::OnMouseMove(nFlags, point);
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::SendKey()
// 
// 描述:
//     
//		处理一个按键消息
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[keydef]			- 键结构
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::SendKey(KEYDEF *keydef)
{
	if(keydef->cNormal == 0x00)
	{
		int vk;
		BOOL uptoo = TRUE;
		if(keydef->cShifted > 0x6F) //is a function key
		{
			vk = keydef->cShifted;
		}
		else
		{
			switch(keydef->cShifted)  //判断功能键的类型
			{
			case TAB:    // 0x02
				vk = VkKeyScan(0x09) & 0xFF;
				break;
			case CAPSLOCK:    // 0x03
				vk = VK_CAPITAL;
				break;
			case SHIFT:    // 0x04
				vk = VK_SHIFT;
				if(GetKeyState(vk) & 0xF000) //shift 已经按下
				{
					
					return;
				}
				uptoo = FALSE;   //保存shift状态
				break;
			case CTRL:    // 0x05
				vk = VK_CONTROL;
				if(GetKeyState(vk) & 0xF000)   //ctrl已经按小
				{
					
					return;
				}
				uptoo = FALSE;   //保存ctrl状态
				break;
			case BSPACE:    // 0x06
				vk = VK_BACK;
				break;
			case ENTER:    // 0x07
				vk = VkKeyScan(0x0D) & 0xFF;
				break;
			case ALT:    // 0x08
				vk = VK_MENU;
				break;
			case WINDOW:    // 0x9
				vk = VK_LWIN;
				break;
			case LEFT:    // 0x0A
				vk = VK_LEFT;
				break;
			case RIGHT:    // 0x0B
				vk = VK_RIGHT;
				break;
			case UP:    // 0x0C
				vk = VK_UP;
				break;
			case DOWN:    // 0x0D
				vk = VK_DOWN;
				break;
			case PUP: //0x0F
				vk = VK_PRIOR;
				break;
			case PDN: //0x10
				vk = VK_NEXT;
				break;
			case HOME: //0x11
				vk = VK_HOME;
				break;
			case END: //0x12
				vk = VK_END;
				break;
			case INS: //0x13
				vk = VK_INSERT;
				break;
			case DEL: //0x14
				vk = VK_DELETE;
				break;
			case ESC:
				vk = VK_ESCAPE;
				break;
			default:
				ASSERT(FALSE);
				break;
			}
		}
		keybd_event(vk,0,0,0);
		if(uptoo)
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
	}
	else
	{
		char pChar = keydef->cNormal;
		SHORT ks = VkKeyScan(pChar);
		BYTE key = ks & 0xFF;

		keybd_event(key,0,0,0);
		keybd_event(key,0,KEYEVENTF_KEYUP,0);

		//turn off the control and shift if they were down
		unsigned char vk = VK_SHIFT;
		if(GetKeyState(vk) & 0xF000)
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
		vk = VK_CONTROL;
		if(GetKeyState(vk) & 0xF000) //allow toggle
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
	}

}

void CUNLOCKDlg::OnSetFocus(CWnd *pOldWnd)
{
	CDialog::OnSetFocus(pOldWnd);

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::OnActivate()
// 
// 描述:
//     
//		是本程序处于激活状态
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[nState]
//      [pWndOther]
//      [bMinimized]			
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
{
	if(nState==WA_CLICKACTIVE && pWndOther!=NULL)
	{
		::SetActiveWindow(pWndOther->GetSafeHwnd());
		return;
	}

	CDialog::OnActivate(nState, pWndOther, bMinimized);

}

BOOL CUNLOCKDlg::OnNcActivate(BOOL bActive)
{
	return CDialog::OnNcActivate(bActive);
	//return TRUE ;

}

int CUNLOCKDlg::OnMouseActivate(CWnd *pDesktopWnd, UINT nHitTest, UINT message)
{
	return MA_NOACTIVATE ;  //返回-1的时候,窗口不会闪烁

}

BOOL CUNLOCKDlg::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CDialog::PreCreateWindow(cs);
}

UINT CUNLOCKDlg::OnNcHitTest(CPoint point)
{
	
	return CDialog::OnNcHitTest(point);

}

void CUNLOCKDlg::OnUnlockbutton() 
{
	// TODO: Add your control notification handler code here
	CFile file;
	CString psw;
	if (file.Open("psw.DAT",CFile::modeRead))   //打开并读密码文件
	{
		DWORD dwRead = 1;
		while (dwRead)
		{
			char buffer[1024];
			dwRead = file.Read(buffer,1024);
			psw.Format("%s",buffer);            //得到密码
		}
		file.Close();
	}
 
   	UpdateData(TRUE);
    
	CWRONGDlg wrongdlg;
	if (m_unlockpsw == "")         //如果解密密码为空
	{
       	wrongdlg.m_strTitle.Format("欢迎使用小蔡软件!");
		wrongdlg.m_strText.Format("对不起!\r\n请输入解锁密码!");
		wrongdlg.DoModal();
		GetDlgItem(IDC_UNLOCKPSW)->SetFocus();
		UpdateData(FALSE);
	}
	else
	{
	    if (m_unlockpsw.Compare(psw)!=0)    //解密密码与登陆密码不相同
		{ 
	 	    wrongdlg.m_strTitle.Format("欢迎使用小蔡软件!");
		    wrongdlg.m_strText.Format("对不起!\r\n解锁密码不正确!\r\n请重新输入!");
		    wrongdlg.DoModal();		
      	    m_unlockpsw.Empty();
		    GetDlgItem(IDC_UNLOCKPSW)->SetFocus();
		    UpdateData(FALSE);
		}
	
	   else
	   {
	        CPINGMUDlg *pWnd = (CPINGMUDlg*)GetParent(); 
            OnCancel();           //关闭本窗口
		    pWnd->SendMessage(WM_CLOSE);     //关闭CPINGMUDlg窗口
		    AfxGetMainWnd()->SendMessage(WM_CLOSE);  //关闭主窗口
    		
	   }
	}

}

void CUNLOCKDlg::OnAboutbutton() 
{
	// TODO: Add your control notification handler code here
	CABOUTZZDlg aboutzzdlg;
	aboutzzdlg.DoModal();
	  
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::OnMymouseMove
// 
// 描述:
//     
//		隐藏本窗口,可以在左边,右边或上面
//
// 返回:
//
//		[LRESULT]	
//
// 参数:
//
//		[wParam]			
//      [lParam]
//     
/////////////////////////////////////////////////////////////////////
LRESULT CUNLOCKDlg::OnMymouseMove(WPARAM wParam, LPARAM lParam)
{
	LPPOINT pt=new CPoint;
	GetCursorPos(pt);
	CRect rect,rect1;
	GetWindowRect(rect);
	rect1 = GetTrayWndRect();    //得到任务栏的大小

	if (rect.PtInRect(*pt))      //如果鼠标在本窗口上
	{
		//还原本窗口
		
		if (rect.top<=2)
		{
			
			MoveWindow(rect.left, rect.top, 
				dlgrect.Width(), dlgrect.Height(), true);
		}
	   if (rect.left<=2)
		{
			MoveWindow(rect.left, rect.top, 
				dlgrect.Width(), dlgrect.Height(), true);
		}
	   if (rect.right >= (rect1.right+dlgrect.Width()-10))
		{
			MoveWindow((rect1.right-dlgrect.Width()), rect.top,dlgrect.Width(),dlgrect.Height(),true);

		}

	

	}
	else    //隐藏本窗口
	{
		if (rect.top<=2)
		{
			MoveWindow(rect.left, 0, rect.Width(), 5, true);
		}
		if (rect.left<=2)
		{
			MoveWindow(0, rect.top,5,rect.Height(),true);
				
		}
		if (rect.right >= (rect1.right-2))
		{
			MoveWindow((rect1.right-5), rect.top,(dlgrect.Width()-5),rect.Height(),true);

		}

   	}
	delete pt;    //释放鼠标指针
	return true;

}

int CUNLOCKDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	CRect rtWnd;
	GetWindowRect(&rtWnd);
	
	//创建圆形边框
	CRgn rgn;
	rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),10,10);
	SetWindowRgn((HRGN)rgn,true); 
	
	return 0;
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::OnEraseBkgnd()
// 
// 描述:
//     
//		填充窗口背景
//
// 返回:
//
//		[BOOL]	        -TRUE:填充窗口背景
//
// 参数:
//
//		[pDC]			- 设备场景CDC的指针对象
//     
/////////////////////////////////////////////////////////////////////
BOOL CUNLOCKDlg::OnEraseBkgnd(CDC *pDC)
{

	CRect rc;
	GetClientRect(&rc);    //得到客户窗口大小
	pDC->FillSolidRect(&rc,RGB(231,239,245));     //填充窗口背景
	
	return TRUE;

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::DrawTitleBar()
// 
// 描述:
//     
//		重画界面
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[pDC]			- 设备场景CDC的指针对象
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::DrawTitleBar(CDC *pDC)
{
	if (m_hWnd)
	{
		CBrush Brush(RGB(0,100,255));
		CBrush* pOldBrush = pDC->SelectObject(&Brush);

		CRect rtWnd, rtButtons;
		GetWindowRect(&rtWnd); 
		//取得标题栏的位置
		rtTitle.left = GetSystemMetrics(SM_CXFRAME);
		rtTitle.top = GetSystemMetrics(SM_CYFRAME);
		rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
		rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);

		//计算最小化按钮的位置,位图大小为15X15
		rtButtons.left = rtTitle.right-60;
		rtButtons.top= rtTitle.top+2;
		rtButtons.right = rtTitle.right-42;
		rtButtons.bottom = rtTitle.top+20;
		m_rtButtMin = rtButtons;
		//计算最大化按钮的位置,位图大小为15X15
		m_rtButtMax.left = m_rtButtMin.left + 18;
		m_rtButtMax.top = m_rtButtMin.top;
		m_rtButtMax.right = m_rtButtMin.right + 16;
		m_rtButtMax.bottom = m_rtButtMin.bottom;

		m_rtButtExit.left = m_rtButtMax.left + 18;
		m_rtButtExit.top =  m_rtButtMax.top;
		m_rtButtExit.right = m_rtButtMax.right + 16;
		m_rtButtExit.bottom = m_rtButtMax.bottom;


		//准备画图
		CBitmap* pBitmap = new CBitmap;
		BITMAP BmpInfo;
		CBitmap* pOldBitmap;
		CDC* pDisplayMemDC=new CDC;
		pDisplayMemDC->CreateCompatibleDC(pDC);

		//重画最Caption
		POINT  DrawPonit;
		DrawPonit.x =	rtTitle.left-4;
		DrawPonit.y =	rtTitle.top-4;
		pBitmap->LoadBitmap(IDB_TITLE_LEFT);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		pDC->BitBlt(rtTitle.left-4, rtTitle.top-4, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		pBitmap->LoadBitmap(IDB_TOP);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		while(DrawPonit.x<= m_rtButtMin.left-66) 
		{
			pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
			DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		pBitmap->LoadBitmap(IDB_TITLE_RIGHT);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);

		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();



		//重画最小化button
		rtButtons = m_rtButtMin;
		pBitmap->LoadBitmap(IDB_NORMAL);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButtons.left-6, rtButtons.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		int nOldMode = pDC->SetBkMode(TRANSPARENT);
		COLORREF clOldText=pDC->GetTextColor();		
		CFont titleFont;	
		titleFont.CreateFont( 12, // nHeight 
							8, // nWidth 
							0, // nEscapement文本行逆时针旋转角度 
							0, // nOrientation字体角度
							FW_BOLD, // nWeight字体粗细程度 
							FALSE, // bItalic 
							FALSE, // bUnderline 
							0, // cStrikeOut 删除线
							ANSI_CHARSET, // nCharSet 
							OUT_DEFAULT_PRECIS, // nOutPrecision 
							CLIP_DEFAULT_PRECIS, // nClipPrecision 
							DEFAULT_QUALITY, // nQuality 
							DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
							_T("隶书")); // lpszFac		pDC->SelectStockObject(SYSTEM_FIXED_FONT);		
		CFont *OldFont;
		OldFont = pDC->SelectObject(&titleFont);
		CString m_StrTitle;
		GetWindowText(m_StrTitle);
		pDC->SetTextColor(RGB(0,90,193));
		if(m_ShowTitle)
		{
			pDC->TextOut(65,10,m_StrTitle);	
		}
		else
		{   
			m_StrTitle = m_StrTitle.Left(6);
			m_StrTitle += "...";
			pDC->TextOut(30,10,m_StrTitle);	
		}
		pDC->SetBkMode(nOldMode);
		pDC->SetTextColor(clOldText);
		pDC->SelectObject(OldFont);
		//重画左边框
		pBitmap->LoadBitmap(IDB_LEFTDOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		int i ;
		for (i= 20;i<=rtWnd.bottom;i=i+BmpInfo.bmHeight-3)
		{
			pDC->BitBlt(0, rtButtons.top+i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//重画右边框
		pBitmap->LoadBitmap(IDB_RIGHTDOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		GetClientRect(&rtWnd);
		for (i= 25;i<=rtWnd.bottom+27;i=i+BmpInfo.bmHeight-3)
		{
			pDC->BitBlt(rtWnd.right, i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//重画底边框
		pBitmap->LoadBitmap(IDB_DOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		GetClientRect(&rtWnd);
		for (i= 9; i<=rtWnd.right; i=i+2)
		{
			GetClientRect(&rtWnd);
			pDC->BitBlt(i,rtWnd.bottom+26, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		ReleaseDC(pDisplayMemDC);
		delete pDisplayMemDC;
		delete pBitmap;
	}

}

LRESULT CUNLOCKDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
	
	if (!::IsWindow(m_hWnd))
		return lrst;
	
	if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
	{
		CDC* pWinDC = GetWindowDC();
		if (pWinDC)
		{
			DrawTitleBar(pWinDC);  //重画界面
		}
		ReleaseDC(pWinDC);         //释放场景设备
	}
	return lrst;
	//return CDialog::DefWindowProc(message, wParam, lParam);
}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::OnNcMouseMove
// 
// 描述:
//     
//		响应非客户区鼠标的移动消息
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[nHitTest]			
//      [point]         -鼠标指针
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
	CDC* pDC = GetWindowDC();
	CDC* pDisplayMemDC=new CDC;
	pDisplayMemDC->CreateCompatibleDC(pDC);
	CBitmap* pBitmap = new CBitmap;
	CBitmap* pOldBitmap;
	CRect rtWnd, rtButton;

	if (pDC)
	{
	
		GetWindowRect(&rtWnd);
		//mouse坐标转化为本窗口坐标 重要
		point.x = point.x - rtWnd.left;
		point.y = point.y - rtWnd.top;
		//判断mouse是否移到系统按钮上
		if (m_rtButtExit.PtInRect(point))
		{
			pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
		
		}
		else
		{
			if(m_rtButtMin.PtInRect(point))
			{
				pBitmap->LoadBitmap(IDB_MIN_FOCUS);
				
			}
			
				else
				{
					pBitmap->LoadBitmap(IDB_NORMAL);
				}
			
		}

		rtButton = m_rtButtMin;
		BITMAP BmpInfo;
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left-6, rtButton.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();
	
	}
	ReleaseDC(pDisplayMemDC);
	ReleaseDC(pDC);
	delete pDisplayMemDC;
	delete pBitmap;

	CDialog::OnNcMouseMove(nHitTest, point);

}

/////////////////////////////////////////////////////////////////////
// 函数:
//      CUNLOCKDlg::OnNcLButtonDown
// 
// 描述:
//     
//		响应非客户区鼠标的左单击
//
// 返回:
//
//		[void]	
//
// 参数:
//
//		[nHitTest]			
//      [point]         -鼠标指针
//     
/////////////////////////////////////////////////////////////////////
void CUNLOCKDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
	CRect rtWnd,rect1;
	GetWindowRect(&rtWnd);
	rect1 = GetTrayWndRect();

	//mouse坐标转化为本窗口坐标 重要
	point.x = point.x - rtWnd.left;
	point.y = point.y - rtWnd.top;
	//检测各按钮是否按到
	if (m_rtButtExit.PtInRect(point)||m_rtButtMin.PtInRect(point))   //如果按下最小化键或关闭键
	{
		MoveWindow((rect1.right-dlgrect.Width()-10), 0,      //隐藏本窗口
				dlgrect.Width(), 5, true);
	}

	CDialog::OnNcLButtonDown(nHitTest, point);

}