消息映射与处理

WM_KEYDOWN:某一键被按下

WM_KEYUP:某一键弹起

WM_CHAR:某一键按下又弹起,输入了一个字符        进入消息处理函数OnChar

其参数并不是虚键码,而是默认的ASCII码

CPoint型变量     记录位置

 1 CPoint ptCharacter;                //记录字符位置
 2 if(nChar==13)                        //按下了回车键
 3     {
 4         //换行
 5         ptCharacter.x=0;
 6         ptCharacter.y=ptCharacter.y+25;
 7     }
 8     else
 9     {
10         CClientDC dc(this);
11         dc.TextOut(ptCharacter.x,ptCharacter.y,(LPCTSTR)&nChar);        //输出显示字符
12         CSize textsize;
13         textsize=dc.GetTextExtent((LPCTSTR)&nChar);                //获取当前字符大小
14         //前进到下一个字符位置
15         ptCharacter.x=ptCharacter.x+textsize.cx;
16     }

键盘插入符(Caret)是一个闪烁的位图,可以使用户知道在窗口何处进行有效的键盘输入

Windows总是把键盘消息送到拥有输入焦点的窗口,接收键盘消息的窗口称为有“输入焦点”的窗口,具有输入焦点的窗口称为活动窗口。

WM_SETFOCUS  通知即将接收输入焦点的窗口,当窗口获得键盘焦点时,就可以创建插入符了,若窗口没有焦点,就不能进行键盘输入。

插入符一旦创建起来,还要在窗口对其进行定位和显示。

void CCaretKeyDemoView::OnSetFocus(CWnd* pOldWnd) 
{
    CView::OnSetFocus(pOldWnd);
    
    // TODO: Add your message handler code here
        CreateSolidCaret(3, 18);                            //创建插入符
        SetCaretPos (ptCharacter);                            //将插入符移到当前字符输入点
        ShowCaret ();                                    //显示插入符    
}

使用API函数keybd_event可以触发WM_KEYDOWN或者WM_UP键盘消息,模拟键盘的输入

为用户在视图窗口中按下鼠标左键,拖动鼠标时,在窗口中绘制一个随鼠标位置变化的椭圆,当释放鼠标键时,停止椭圆绘制。

BOOL bDrag;                        //是否在拉动
CPoint ptDown;                    //鼠标左键按下位置
CPoint ptUp;                        //鼠标左键释放位置



//初始化成员变量
bDrag=false;
ptDown.x=ptDown.y=0;
ptUp.x=ptUp.y=0;


void CBaseMouseDemoView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    bDrag=TRUE;
    ptUp=ptDown=point;//记录鼠标当前位置
    CView::OnLButtonDown(nFlags, point);
}

void CBaseMouseDemoView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    if(bDrag)
    {
        ptUp=point;
        DrawCircle();                                    //画新圆
        bDrag=FALSE;
    }
    
    CView::OnLButtonUp(nFlags, point);
}

void CBaseMouseDemoView::OnMouseMove(UINT nFlags, CPoint point) 
{
    if(bDrag)
    {
        ptUp=point;//记录鼠标的当前位置
        DrawCircle();                                    //画新圆
    }
    CView::OnMouseMove(nFlags, point);
}

void CBaseMouseDemoView::DrawCircle()
{
    Invalidate(false);
    CClientDC dc(this);                            //获取DC
    CRect rect;
    GetClientRect(rect);                            //获取客户窗口区域
    CBrush brush(RGB(255,255,255));
    dc.FillRect(rect,&brush);                        //填充背景色为白色
    dc.Ellipse(ptDown.x,ptDown.y,ptUp.x,ptUp.y);        //绘制矩形

}

// 将提示性文字隐藏
GetDlgItem(IDC_TEXT)->ShowWindow(SW_HIDE);

实现鼠标的捕捉功能,即当用户在客户区窗口中单击鼠标左键后,该窗口实现对鼠标的捕捉,并记录鼠标的位置坐标,而当双击鼠标时,则释放捕捉

使用API函数SetCapture()可以实现鼠标的捕获

其原型为HWND SetCapture(HWND hWnd);

一旦某个窗口捕获了鼠标,其他窗口将无法得到鼠标消息,因此,当窗口不再需要捕获鼠标消息时,应及时使用ReleaseCapture()函数将鼠标释放。

void CCaptureMouseView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    SetCapture();//捕捉鼠标
    CString s;
    s.Format("用户摁下鼠标左键的位置:X=%d,Y=%d",point.x,point.y);
    CClientDC dc(this);                                        //获得DC
    dc.TextOut(30,40,s);                        //输出文本
    CView::OnLButtonDown(nFlags, point);
}



void CCaptureMouseView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    ReleaseCapture();//释放鼠标    
    CClientDC dc(this);                                        //获得DC
    dc.TextOut(30,40,"释放了鼠标,此时可以响应客户窗口以外的鼠标命令!");                        //输出文本

    CView::OnLButtonDblClk(nFlags, point);
}

void CCaptureMouseView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString s;
    s.Format("用户松开鼠标左键的位置:X=%d,Y=%d",point.x,point.y);
    CClientDC dc(this);                                        //获得DC
    dc.TextOut(30,80,s);                        //输出文本
    
    CView::OnLButtonUp(nFlags, point);
}

创建和使用自定义消息

#define WM_MYMESSAGE (WM_USER+100)       //声明自定义消息

afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l); //声明消息响应函数

ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)            //添加消息响应宏

PostMessage(WM_MYMESSAGE, IDC_BUTTON1);

PostMessage  只把消息放入队列,不管其他程序是否处理都继续执行;

SendMessage 必须等待其他程序处理消息后才继续执行

使用VC提供的范围消息映像宏,可以实现为ID在某一范围内的对象添加同一个消息处理函数

ON_COMMAND_RANGE(ID_MENUITEM1,ID_MENUITEM4,OnMenuItemCommandRange)//命令消息映射
ON_UPDATE_COMMAND_UI_RANGE(ID_MENUITEM1,ID_MENUITEM4,OnUpdateMenuItemCommandRange)//界面消息映射

原文地址:https://www.cnblogs.com/wangfx91/p/4981135.html