做网站吗,成都黑帽seo,免费空白ppt模板下载,海外推广营销公开视频 - 链接点击跳转公开课程博客首页 - 链接点击跳转博客主页
目录
MFC鼠标
派发流程
鼠标消息(客户区)
鼠标消息(非客户)
坐标处理
客户区
非客户
坐标转换
示例代码
MFC键盘
击键消息
虚拟键代码
键状态 MFC鼠标
派发流程
消息捕获#…公开视频 - 链接点击跳转公开课程博客首页 - 链接点击跳转博客主页
目录
MFC鼠标
派发流程
鼠标消息(客户区)
鼠标消息(非客户)
坐标处理
客户区
非客户
坐标转换
示例代码
MFC键盘
击键消息
虚拟键代码
键状态 MFC鼠标
派发流程
消息捕获当鼠标在屏幕上移动或点击时Windows捕获这些事件并生成相应的消息。消息队列Windows将这些消息放入应用程序的消息队列中。消息循环应用程序的消息循环通常在主窗口的消息泵中从消息队列中取出消息。消息派发消息循环将消息派发给相应的窗口处理。对于客户区消息这些消息通常由窗口的视图类或主窗口类处理对于非客户区消息这些消息由窗口的非客户区处理函数处理。消息处理窗口接收到消息后通过消息映射机制调用相应的消息处理函数进行处理。
鼠标消息(客户区) WM_MOUSEMOVEWM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLKWM_RBUTTONDOWNWM_RBUTTONUPWM_RBUTTONDBLCLK
鼠标消息(非客户) WM_NCHITTESTWM_NCLBUTTONDOWNWM_NCLBUTTONUPWM_NCLBUTTONDBLCLK
坐标处理 客户区 客户区坐标是指窗口内部可用于绘制内容的区域坐标。这个区域的坐标原点0,0通常位于窗口的左上角。在客户区坐标系统中X轴向右增加Y轴向下增加。原点窗口的左上角。X轴向右为正。Y轴向下为正。 非客户 非客户区坐标是指窗口的非客户区域包括标题栏、边框、滚动条等部分的坐标。非客户区的坐标系统是屏幕坐标系统其原点0,0位于屏幕的左上角。原点屏幕的左上角。X轴向右为正。Y轴向下为正。
坐标转换 在处理窗口事件时经常需要在这两种坐标系统之间进行转换。ScreenToClient: 将屏幕坐标转换为客户区坐标。ClientToScreen: 将客户区坐标转换为屏幕坐标。
示例代码
#include main.hCMyApp MyApp;BOOL CMyApp::InitInstance()
{m_pMainWnd new CMainWnd;m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;
}CMainWnd::CMainWnd()
{Create(NULL, NULL);
}BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_NCLBUTTONDOWN()ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point)
{CString strPoint;strPoint.Format(_T(OnLButtonDown %d - %d\r\n), point.x, point.y);OutputDebugString(strPoint);
}void CMainWnd::OnLButtonUp(UINT nFlags, CPoint point)
{CString strPoint;strPoint.Format(_T(OnLButtonUp %d - %d\r\n), point.x, point.y);OutputDebugString(strPoint);
}void CMainWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
{CString strPoint;strPoint.Format(_T(OnNcLButtonDown %d - %d\r\n), point.x, point.y);OutputDebugString(strPoint);CFrameWnd::OnNcLButtonDown(nHitTest, point);
}void CMainWnd::OnNcLButtonUp(UINT nHitTest, CPoint point)
{CString strPoint;strPoint.Format(_T(OnNcLButtonUp %d - %d\r\n), point.x, point.y);OutputDebugString(strPoint);CFrameWnd::OnNcLButtonUp(nHitTest, point);
}void CMainWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{if (nHitTest ! HTCAPTION){CFrameWnd::OnNcLButtonDblClk(nHitTest, point);}
}LRESULT CMainWnd::OnNcHitTest(CPoint point)
{UINT uHit CFrameWnd::OnNcHitTest(point);if (uHit HTCLIENT){uHit HTCAPTION;}return uHit;
}
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point)
{m_Flg TRUE;m_str point;m_End point;
}void CMainWnd::OnLButtonUp(UINT nFlags, CPoint point)
{if (m_Flg){m_Flg FALSE;m_End point;CClientDC dc(this);dc.MoveTo(m_str);dc.LineTo(point);}}void CMainWnd::OnMouseMove(UINT nFlags, CPoint point)
{if (m_Flg){CClientDC dc(this);DrawLine(dc, m_str, m_End);DrawLine(dc, m_str, point);m_End point;}}VOID CMainWnd::DrawLine(CDC* pDC, CPoint str, CPoint end)
{INT nOld pDC-SetROP2(R2_NOT);pDC-MoveTo(m_str);pDC-LineTo(end);pDC-SetROP2(nOld);
}
MFC键盘
击键消息
WM_KEYDOWN非系统键被按下。WM_KEYUP非系统键被释放。WM_SYSKEYDOWN系统键通常是Alt键被按下。WM_SYSKEYUP系统键被释放。
虚拟键代码
虚拟键代码Virtual-Key Codes是Windows用来标识键盘上每个键的唯一值。例如VKA代表字母AVKSHIFT代表Shift键等。
键状态
在MFC中可以使用GetKeyState函数来获取特定键的状态例如Shift、Ctrl或Alt键的状态。