void CMainWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags ){ if((nChar=='A')&&(GetKeyState( VK_SHIFT)<0)&&(GetKeyState(VK_LBUTTON))){ MessageBox(_T("shift+A+鼠标左键被按下了")); } if(GetKeyState(VK_NUMLOCK)&0x01){/* 若高序位为1,则键处于DOWN状态,否则为UP状态。 若低序位为1,则键被触发。若低序位置为0,则键被关闭,且不被触发。触发键在键盘上的指示灯,当键被触发时即亮,键不被触发时即灭。 */ MessageBox(_T("NumLock被按下了")); } }
void CMainWindow::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags){ CString s; if((nChar>=_T('A'))&&(nChar<=_T('Z'))||(nChar>=_T('a'))&&(nChar<=_T('z'))){ s.Format(_T("你按下了:%c"),nChar); MessageBox(s); } }
判断是否在图形内部的两种方法:
方法一:PtInRect
void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point) { CRect rc(100,100,200,200); if(rc.PtInRect(point)){ MessageBox(_T("内部"),NULL); }else { MessageBox(_T("外部"),NULL); } }
方法二:判断像素颜色(最好用黑白两色,其他颜色可能是抖动色,不准确)
void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point) { CClientDC dc(this); if(dc.GetPixel(point)==RGB(0,0,0)){ MessageBox(_T("内部"),_T("a"),MB_ABORTRETRYIGNORE); } }
处理光标:
void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point) { TEXTMETRIC tm; CClientDC dc(this); dc.GetTextMetrics(&tm); CreateSolidCaret(4,tm.tmHeight);//光标的宽和高 CSize size=dc.GetTextExtent(_T("aaaaaaaaa",8));//光标处于当前鼠标位置之后8个字符的位置 SetCaretPos(CPoint(point.x+size.cx,point.y)); ShowCaret();//默认是隐藏的 m_ptCaret=point; }