MFC鼠标键盘消息处理

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;
}
原文地址:https://www.cnblogs.com/duyy/p/3775011.html