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)//界面消息映射