PasswordControl.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. #include "StdAfx.h"
  2. #include "Resource.h"
  3. #include "PasswordControl.h"
  4. //////////////////////////////////////////////////////////////////////////////////
  5. //位置定义
  6. #define ITEM_POS_S 3 //按钮间距
  7. #define ITEM_POS_X 8 //按钮位置
  8. #define ITEM_POS_Y 8 //按钮位置
  9. //关闭按钮
  10. #define POS_BUTTON_X 5 //按钮位置
  11. #define POS_BUTTON_Y 8 //按钮位置
  12. //常量定义
  13. #define ROW_BACK 0 //退格按钮
  14. #define ROW_SHIFT 1 //切换按钮
  15. #define ROW_CAPITAL 2 //大写按钮
  16. #define ROW_CLOSE_KEY 3 //关闭按钮
  17. #define LINE_FUNCTION 4 //功能按钮
  18. //控件标识
  19. #define IDC_BT_KEYBOARD 100 //键盘按钮
  20. #define IDC_ED_PASSWORD 200 //密码控件
  21. //////////////////////////////////////////////////////////////////////////////////
  22. BEGIN_MESSAGE_MAP(CPasswordKeyboard, CDialog)
  23. ON_WM_NCPAINT()
  24. ON_WM_KILLFOCUS()
  25. ON_WM_SETCURSOR()
  26. ON_WM_LBUTTONUP()
  27. ON_WM_ERASEBKGND()
  28. ON_WM_LBUTTONDOWN()
  29. END_MESSAGE_MAP()
  30. //////////////////////////////////////////////////////////////////////////////////
  31. //构造函数
  32. CPasswordKeyboard::CPasswordKeyboard() : CDialog(IDD_PASSWORD_KEYBOARD)
  33. {
  34. //设置变量
  35. m_nRandLine[0]=rand()%11;
  36. m_nRandLine[1]=rand()%10;
  37. m_nRandLine[2]=rand()%13;
  38. m_nRandLine[3]=rand()%13;
  39. //键盘状态
  40. m_bShiftStatus=false;
  41. m_bCapsLockStatus=false;
  42. //状态变量
  43. m_bMouseDown=false;
  44. m_wHoverRow=INVALID_WORD;
  45. m_wHoverLine=INVALID_WORD;
  46. //键盘字符
  47. m_nItemCount[0]=11;
  48. lstrcpyn(m_szKeyboradChar[0][0],TEXT("`1234567890"),CountArray(m_szKeyboradChar[0][0]));
  49. lstrcpyn(m_szKeyboradChar[0][1],TEXT("~!@#$%^&*()"),CountArray(m_szKeyboradChar[0][1]));
  50. //键盘字符
  51. m_nItemCount[1]=10;
  52. lstrcpyn(m_szKeyboradChar[1][0],TEXT("-=[]\\;',./"),CountArray(m_szKeyboradChar[1][0]));
  53. lstrcpyn(m_szKeyboradChar[1][1],TEXT("_+{}|:\"<>?"),CountArray(m_szKeyboradChar[1][1]));
  54. //键盘字符
  55. m_nItemCount[2]=13;
  56. lstrcpyn(m_szKeyboradChar[2][0],TEXT("abcdefghijklm"),CountArray(m_szKeyboradChar[2][0]));
  57. lstrcpyn(m_szKeyboradChar[2][1],TEXT("ABCDEFGHIJKLM"),CountArray(m_szKeyboradChar[2][1]));
  58. //键盘字符
  59. m_nItemCount[3]=13;
  60. lstrcpyn(m_szKeyboradChar[3][0],TEXT("nopqrstuvwxyz"),CountArray(m_szKeyboradChar[3][0]));
  61. lstrcpyn(m_szKeyboradChar[3][1],TEXT("NOPQRSTUVWXYZ"),CountArray(m_szKeyboradChar[3][1]));
  62. //加载资源
  63. m_pImageItem1 = m_pImageItem2 = m_pImageItem3 = NULL;
  64. m_pImageItem1 = RenderEngine->GetImage(TEXT("QQ\\PassWnd\\KEYBOARD_ITEM1.bmp"));
  65. m_pImageItem2 = RenderEngine->GetImage(TEXT("QQ\\PassWnd\\KEYBOARD_ITEM2.bmp"));
  66. m_pImageItem3 = RenderEngine->GetImage(TEXT("QQ\\PassWnd\\KEYBOARD_ITEM3.bmp"));
  67. //设置大小
  68. m_SizeImageItem1.SetSize(m_pImageItem1->GetWidth()/3,m_pImageItem1->GetHeight());
  69. m_SizeImageItem2.SetSize(m_pImageItem2->GetWidth()/3,m_pImageItem2->GetHeight());
  70. m_SizeImageItem3.SetSize(m_pImageItem3->GetWidth()/3,m_pImageItem3->GetHeight());
  71. //关闭按钮
  72. m_pImageButton = NULL;
  73. m_pImageButton = RenderEngine->GetImage(TEXT("QQ\\PassWnd\\BT_KEYBOARD_CLOSE.bmp"));
  74. m_SizeImageButton.SetSize(m_pImageButton->GetWidth()/3,m_pImageButton->GetHeight());
  75. //背景大小
  76. m_pImageBackGround = NULL;
  77. m_pImageBackGround = RenderEngine->GetImage(TEXT("QQ\\PassWnd\\PASSWORD_KEYBORAD_BK.bmp"));
  78. m_SizeBackGround.SetSize(m_pImageBackGround->GetWidth(),m_pImageBackGround->GetHeight());
  79. return;
  80. }
  81. //析构函数
  82. CPasswordKeyboard::~CPasswordKeyboard()
  83. {
  84. RenderEngine->RemoveImage(m_pImageItem1);
  85. RenderEngine->RemoveImage(m_pImageItem2);
  86. RenderEngine->RemoveImage(m_pImageItem3);
  87. RenderEngine->RemoveImage(m_pImageButton);
  88. RenderEngine->RemoveImage(m_pImageBackGround);
  89. }
  90. //消息解释
  91. BOOL CPasswordKeyboard::PreTranslateMessage(MSG * pMsg)
  92. {
  93. //大写锁键
  94. if ((pMsg->message==WM_KEYDOWN)&&(pMsg->wParam==VK_CAPITAL))
  95. {
  96. //设置变量
  97. bool bCapsLockStatus=m_bCapsLockStatus;
  98. m_bCapsLockStatus=(GetKeyState(VK_CAPITAL)&0x0F)>0;
  99. //更新界面
  100. if (bCapsLockStatus!=m_bCapsLockStatus)
  101. {
  102. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW);
  103. }
  104. return TRUE;
  105. }
  106. //切换按钮
  107. if ((pMsg->wParam==VK_SHIFT)&&(pMsg->message==WM_KEYUP)||(pMsg->message==WM_KEYDOWN))
  108. {
  109. //设置变量
  110. bool bShiftStatus=m_bShiftStatus;
  111. m_bShiftStatus=(GetKeyState(VK_SHIFT)&0xF0)>0;
  112. //更新界面
  113. if (bShiftStatus!=m_bShiftStatus)
  114. {
  115. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW);
  116. }
  117. return TRUE;
  118. }
  119. return __super::PreTranslateMessage(pMsg);
  120. }
  121. //创建函数
  122. BOOL CPasswordKeyboard::OnInitDialog()
  123. {
  124. __super::OnInitDialog();
  125. //设置变量
  126. m_bMouseDown=false;
  127. m_wHoverRow=INVALID_WORD;
  128. m_wHoverLine=INVALID_WORD;
  129. //获取状态
  130. m_bShiftStatus=(GetKeyState(VK_SHIFT)&0xF0)>0;
  131. m_bCapsLockStatus=(GetKeyState(VK_CAPITAL)&0x0F)>0;
  132. //构造位置
  133. CRect rcWindow;
  134. rcWindow.SetRect(0,0,m_SizeBackGround.cx,m_SizeBackGround.cy);
  135. //移动窗口
  136. CalcWindowRect(&rcWindow,CWnd::adjustBorder);
  137. SetWindowPos(NULL,0,0,rcWindow.Width(),rcWindow.Height(),SWP_NOMOVE|SWP_NOZORDER);
  138. return FALSE;
  139. }
  140. //更新位置
  141. VOID CPasswordKeyboard::SetCurrentStation(CPoint MousePoint)
  142. {
  143. //变量定义
  144. WORD wHoverRow=INVALID_WORD;
  145. WORD wHoverLine=INVALID_WORD;
  146. //字符按钮
  147. if ((MousePoint.x>=ITEM_POS_X)&&(MousePoint.y>=ITEM_POS_Y))
  148. {
  149. //列数计算
  150. if (((MousePoint.x-ITEM_POS_X)%(m_SizeImageItem1.cx+ITEM_POS_S))<=m_SizeImageItem1.cx)
  151. {
  152. wHoverRow=(WORD)((MousePoint.x-ITEM_POS_X)/(m_SizeImageItem1.cx+ITEM_POS_S));
  153. }
  154. //行数计算
  155. if (((MousePoint.y-ITEM_POS_Y)%(m_SizeImageItem1.cy+ITEM_POS_S))<=m_SizeImageItem1.cy)
  156. {
  157. wHoverLine=(WORD)((MousePoint.y-ITEM_POS_Y)/(m_SizeImageItem1.cy+ITEM_POS_S));
  158. }
  159. //参数调整
  160. if (wHoverLine>=CountArray(m_nItemCount)) wHoverLine=INVALID_WORD;
  161. if ((wHoverLine==INVALID_WORD)||(wHoverRow>=m_nItemCount[wHoverLine])) wHoverRow=INVALID_WORD;
  162. }
  163. //功能按钮
  164. if ((wHoverLine<2)&&(wHoverRow==INVALID_WORD))
  165. {
  166. //变量定义
  167. INT nEndLine1=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*m_nItemCount[0];
  168. INT nEndLine2=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*m_nItemCount[1];
  169. //原点位置
  170. CPoint ButtonPoint[4];
  171. ButtonPoint[0].SetPoint(nEndLine1,ITEM_POS_Y);
  172. ButtonPoint[1].SetPoint(nEndLine2,ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem3.cy);
  173. ButtonPoint[2].SetPoint(nEndLine2+ITEM_POS_S+m_SizeImageItem2.cx,ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem3.cy);
  174. ButtonPoint[3].SetPoint(m_SizeBackGround.cx-m_SizeImageButton.cx-POS_BUTTON_X,POS_BUTTON_Y);
  175. //按钮区域
  176. CRect rcBack(ButtonPoint[0],m_SizeImageItem3);
  177. CRect rcShift(ButtonPoint[1],m_SizeImageItem2);
  178. CRect rcCapital(ButtonPoint[2],m_SizeImageItem2);
  179. CRect rcCloseKey(ButtonPoint[3],m_SizeImageButton);
  180. //退格按钮
  181. if (rcBack.PtInRect(MousePoint))
  182. {
  183. wHoverRow=ROW_BACK;
  184. wHoverLine=LINE_FUNCTION;
  185. }
  186. //切换按钮
  187. if (rcShift.PtInRect(MousePoint))
  188. {
  189. wHoverRow=ROW_SHIFT;
  190. wHoverLine=LINE_FUNCTION;
  191. }
  192. //大写按钮
  193. if (rcCapital.PtInRect(MousePoint))
  194. {
  195. wHoverRow=ROW_CAPITAL;
  196. wHoverLine=LINE_FUNCTION;
  197. }
  198. //关闭按钮
  199. if (rcCloseKey.PtInRect(MousePoint))
  200. {
  201. wHoverRow=ROW_CLOSE_KEY;
  202. wHoverLine=LINE_FUNCTION;
  203. }
  204. }
  205. //设置变量
  206. m_wHoverRow=wHoverRow;
  207. m_wHoverLine=wHoverLine;
  208. return;
  209. }
  210. //虚拟编码
  211. WORD CPasswordKeyboard::GetVirualKeyCode(WORD wHoverLine, WORD wHoverRow)
  212. {
  213. //功能建区
  214. if (wHoverLine==LINE_FUNCTION)
  215. {
  216. switch (wHoverRow)
  217. {
  218. case ROW_BACK: { return VK_BACK; }
  219. case ROW_SHIFT: { return VK_SHIFT; }
  220. case ROW_CAPITAL: { return VK_CAPITAL; }
  221. }
  222. }
  223. //字符建区
  224. if ((wHoverLine<CountArray(m_nItemCount))&&(wHoverRow<m_nItemCount[wHoverLine]))
  225. {
  226. //计算索引
  227. bool bLowerChar=true;
  228. if (m_bShiftStatus==true) bLowerChar=!bLowerChar;
  229. if ((wHoverLine>=2)&&(m_bCapsLockStatus==true)) bLowerChar=!bLowerChar;
  230. //获取字符
  231. INT nItemCount=m_nItemCount[wHoverLine];
  232. INT nCharRowIndex=(wHoverRow+m_nRandLine[wHoverLine])%nItemCount;
  233. TCHAR chChar=m_szKeyboradChar[wHoverLine][(bLowerChar==true)?0:1][nCharRowIndex];
  234. return chChar;
  235. }
  236. return 0;
  237. }
  238. //界面绘画
  239. VOID CPasswordKeyboard::OnNcPaint()
  240. {
  241. __super::OnNcPaint();
  242. //获取位置
  243. CRect rcWindow;
  244. GetWindowRect(&rcWindow);
  245. //绘画边框
  246. CWindowDC WindowDC(this);
  247. COLORREF crBoradFrame=m_colFrameNormal;
  248. WindowDC.Draw3dRect(0,0,rcWindow.Width(),rcWindow.Height(),crBoradFrame,crBoradFrame);
  249. return;
  250. }
  251. //绘画背景
  252. BOOL CPasswordKeyboard::OnEraseBkgnd(CDC * pDC)
  253. {
  254. //获取位置
  255. CRect rcClient;
  256. GetClientRect(&rcClient);
  257. //创建缓冲
  258. CMemoryDC BufferDC(pDC,rcClient);
  259. //设置环境
  260. BufferDC.SetBkMode(TRANSPARENT);
  261. BufferDC.SelectObject(GetCtrlFont());
  262. //绘画背景
  263. m_pImageBackGround->DrawImage(&BufferDC,0,0);
  264. //字符按钮
  265. for (INT nLine=0;nLine<CountArray(m_nItemCount);nLine++)
  266. {
  267. //绘画子项
  268. for (INT nRow=0;nRow<m_nItemCount[nLine];nRow++)
  269. {
  270. //计算位置
  271. INT nXImageIndex=0;
  272. INT nCharItemIndex=(nRow+m_nRandLine[nLine])%m_nItemCount[nLine];
  273. if ((m_wHoverLine==nLine)&&(m_wHoverRow==nRow)) nXImageIndex=(m_bMouseDown==false)?1:2;
  274. //绘画子项
  275. INT nXDrawPos=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*nRow;
  276. INT nYDrawPos=ITEM_POS_Y+(m_SizeImageItem1.cy+ITEM_POS_S)*nLine;
  277. m_pImageItem1->DrawImage(&BufferDC,nXDrawPos,nYDrawPos,m_SizeImageItem1.cx,m_SizeImageItem1.cy,nXImageIndex*m_SizeImageItem1.cx,0);
  278. //构造颜色
  279. INT nColorIndex=0;
  280. COLORREF crTextColor[2]={RGB(0,0,0),RGB(125,125,125)};
  281. //颜色计算
  282. if (m_bShiftStatus==true) nColorIndex=(nColorIndex+1)%CountArray(crTextColor);
  283. if ((m_bCapsLockStatus==true)&&(nLine>=2)) nColorIndex=(nColorIndex+1)%CountArray(crTextColor);
  284. //绘画字符
  285. BufferDC.SetTextColor(crTextColor[nColorIndex]);
  286. BufferDC.TextOut(nXDrawPos+5,nYDrawPos+9,&m_szKeyboradChar[nLine][0][nCharItemIndex],1);
  287. //绘画字符
  288. BufferDC.SetTextColor(crTextColor[(nColorIndex+1)%CountArray(crTextColor)]);
  289. BufferDC.TextOut(nXDrawPos+15,nYDrawPos+3,&m_szKeyboradChar[nLine][1][nCharItemIndex],1);
  290. }
  291. }
  292. //退格按钮
  293. {
  294. //资源位置
  295. INT nXImageIndex=0;
  296. if ((m_wHoverLine==LINE_FUNCTION)&&(m_wHoverRow==ROW_BACK)) nXImageIndex=(m_bMouseDown==false)?1:2;
  297. //绘画背景
  298. INT nYDrawPos=ITEM_POS_Y;
  299. INT nXDrawPos=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*m_nItemCount[0];
  300. m_pImageItem3->DrawImage(&BufferDC,nXDrawPos,nYDrawPos,m_SizeImageItem3.cx,m_SizeImageItem3.cy,nXImageIndex*m_SizeImageItem3.cx,0);
  301. //绘画字符
  302. BufferDC.SetTextColor(RGB(0,0,0));
  303. BufferDC.TextOut(nXDrawPos+20,ITEM_POS_Y+7,TEXT("←"),2);
  304. }
  305. //切换按钮
  306. {
  307. //资源位置
  308. INT nXImageIndex=(m_bShiftStatus==true)?1:0;
  309. if ((m_wHoverLine==LINE_FUNCTION)&&(m_wHoverRow==ROW_SHIFT)) nXImageIndex=(m_bMouseDown==false)?1:2;
  310. //绘画背景
  311. INT nYDrawPos=ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem1.cx;
  312. INT nXDrawPos=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*m_nItemCount[1];
  313. m_pImageItem2->DrawImage(&BufferDC,nXDrawPos,nYDrawPos,m_SizeImageItem2.cx,m_SizeImageItem2.cy,nXImageIndex*m_SizeImageItem2.cx,0);
  314. //切换按钮
  315. BufferDC.SetTextColor(RGB(0,0,0));
  316. BufferDC.TextOut(nXDrawPos+5,ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem1.cx+6,TEXT("Shift"),5);
  317. }
  318. //大写按钮
  319. {
  320. //资源位置
  321. INT nXImageIndex=(m_bCapsLockStatus==true)?1:0;
  322. if ((m_wHoverLine==LINE_FUNCTION)&&(m_wHoverRow==ROW_CAPITAL)) nXImageIndex=(m_bMouseDown==false)?1:2;
  323. //绘画背景
  324. INT nYDrawPos=ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem1.cx;
  325. INT nXDrawPos=ITEM_POS_X+(m_SizeImageItem1.cx+ITEM_POS_S)*m_nItemCount[1]+m_SizeImageItem2.cx+ITEM_POS_S;
  326. m_pImageItem2->DrawImage(&BufferDC,nXDrawPos,nYDrawPos,m_SizeImageItem2.cx,m_SizeImageItem2.cy,nXImageIndex*m_SizeImageItem2.cx,0);
  327. //大写按钮
  328. BufferDC.SetTextColor(RGB(0,0,0));
  329. BufferDC.TextOut(nXDrawPos+8,ITEM_POS_Y+ITEM_POS_S+m_SizeImageItem1.cx+6,TEXT("Caps"),4);
  330. }
  331. //关闭按钮
  332. {
  333. //资源位置
  334. INT nXImageIndex=0;
  335. if ((m_wHoverLine==LINE_FUNCTION)&&(m_wHoverRow==ROW_CLOSE_KEY)) nXImageIndex=(m_bMouseDown==false)?1:2;
  336. //绘画背景
  337. INT nXDrawPos=rcClient.Width()-m_SizeImageButton.cx-POS_BUTTON_X;
  338. m_pImageButton->DrawImage(&BufferDC,nXDrawPos,POS_BUTTON_Y,m_SizeImageButton.cx,m_SizeImageButton.cy,nXImageIndex*m_SizeImageButton.cx,0);
  339. }
  340. //绘画界面
  341. pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&BufferDC,0,0,SRCCOPY);
  342. return TRUE;
  343. }
  344. //失去焦点
  345. VOID CPasswordKeyboard::OnKillFocus(CWnd * pNewWnd)
  346. {
  347. __super::OnKillFocus(pNewWnd);
  348. //销毁窗口
  349. DestroyWindow();
  350. return;
  351. }
  352. //鼠标消息
  353. VOID CPasswordKeyboard::OnLButtonUp(UINT nFlags, CPoint Point)
  354. {
  355. __super::OnLButtonUp(nFlags,Point);
  356. //取消捕获
  357. if (m_bMouseDown==true)
  358. {
  359. //取消捕获
  360. ReleaseCapture();
  361. //设置变量
  362. m_bMouseDown=false;
  363. //获取光标
  364. CPoint MousePoint;
  365. GetCursorPos(&MousePoint);
  366. ScreenToClient(&MousePoint);
  367. //更新位置
  368. WORD wHoverRow=m_wHoverRow;
  369. WORD wHoverLine=m_wHoverLine;
  370. SetCurrentStation(MousePoint);
  371. //点击处理
  372. if ((m_wHoverRow==wHoverRow)&&(m_wHoverLine==wHoverLine))
  373. {
  374. //关闭按钮
  375. if ((m_wHoverLine==LINE_FUNCTION)&&(m_wHoverRow==ROW_CLOSE_KEY))
  376. {
  377. //设置焦点
  378. if ( m_pEdit != NULL && m_pEdit->GetSafeHwnd() != NULL )
  379. {
  380. m_pEdit->SetFocus();
  381. }
  382. //销毁窗口
  383. DestroyWindow();
  384. return;
  385. }
  386. //虚拟编码
  387. WORD wViraulCode=GetVirualKeyCode(m_wHoverLine,m_wHoverRow);
  388. //按钮处理
  389. switch (wViraulCode)
  390. {
  391. case VK_SHIFT: //切换按钮
  392. {
  393. //设置变量
  394. m_bShiftStatus=!m_bShiftStatus;
  395. break;
  396. }
  397. case VK_CAPITAL: //大写按钮
  398. {
  399. //变量定义
  400. INPUT Input[2];
  401. ZeroMemory(Input,sizeof(Input));
  402. //设置变量
  403. Input[1].ki.dwFlags=KEYEVENTF_KEYUP;
  404. Input[0].type=Input[1].type=INPUT_KEYBOARD;
  405. Input[0].ki.wVk=Input[1].ki.wVk=wViraulCode;
  406. //模拟输入
  407. SendInput(CountArray(Input),Input,sizeof(INPUT));
  408. break;
  409. }
  410. default: //默认按钮
  411. {
  412. //设置变量
  413. m_bShiftStatus=(GetKeyState(VK_SHIFT)&0xF0)>0;
  414. //发送消息
  415. if ( m_pEdit != NULL && m_pEdit->GetSafeHwnd() != NULL )
  416. {
  417. m_pEdit->SetDefaultTextMode(FALSE);
  418. m_pEdit->SendMessage(WM_CHAR,wViraulCode,0L);
  419. }
  420. break;
  421. }
  422. }
  423. }
  424. //更新界面
  425. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW);
  426. }
  427. return;
  428. }
  429. //鼠标消息
  430. VOID CPasswordKeyboard::OnLButtonDown(UINT nFlags, CPoint Point)
  431. {
  432. __super::OnLButtonDown(nFlags,Point);
  433. //点击按钮
  434. if ((m_wHoverLine!=INVALID_WORD)&&(m_wHoverRow!=INVALID_WORD))
  435. {
  436. //捕获鼠标
  437. SetCapture();
  438. //设置变量
  439. m_bMouseDown=true;
  440. //更新界面
  441. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW);
  442. }
  443. return;
  444. }
  445. //光标消息
  446. BOOL CPasswordKeyboard::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT uMessage)
  447. {
  448. //获取光标
  449. CPoint MousePoint;
  450. GetCursorPos(&MousePoint);
  451. ScreenToClient(&MousePoint);
  452. //更新位置
  453. WORD wHoverRow=m_wHoverRow;
  454. WORD wHoverLine=m_wHoverLine;
  455. SetCurrentStation(MousePoint);
  456. //更新界面
  457. if ((m_wHoverRow!=wHoverRow)||(m_wHoverLine!=wHoverLine))
  458. {
  459. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW);
  460. }
  461. //设置光标
  462. if ((m_wHoverRow!=INVALID_WORD)&&(m_wHoverLine!=INVALID_WORD))
  463. {
  464. SetCursor(LoadCursor(GetModuleHandle(SKINUI_DLL_NAME),MAKEINTRESOURCE(8000)));
  465. return true;
  466. }
  467. return __super::OnSetCursor(pWnd,nHitTest,uMessage);
  468. }
  469. void CPasswordKeyboard::SetBuddy( CSkinEdit*pEdit )
  470. {
  471. m_pEdit = pEdit;
  472. }
  473. //////////////////////////////////////////////////////////////////////////////////