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); }