lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
鼠标点击操作
2018-12-21 11:37:40
100
0
0
lee-romantic
(一)MFC 鼠标双击响应单击事件: https://blog.csdn.net/qq_26669845/article/details/46472827 (二)鼠标点击事件: https://bbs.csdn.net/topics/360232427 检查一下CXXXDlg头文件的消息响应函数声明 //{{AFX_MSG(CXXXDlg) afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//声明 //}}AFX_MSG 再检查下源文件中的消息映射 BEGIN_MESSAGE_MAP(CXXXDlg, CDialog) //{{AFX_MSG_MAP(CXXXDlg) ON_WM_LBUTTONDOWN() //消息映射 //}}AFX_MSG_MAP END_MESSAGE_MAP() 如果都正确的话应该可以响应的 (三)消息映射宏 ON_WM_LBUTTONDOWN(),如何将 消息 与 响应函数 关联起来的呢? ``` BEGIN_MESSAGE_MAP(CDrawView, CView) //{{AFX_MSG_MAP(CDrawView) ON_WM_LBUTTONDOWN() ON_WM_KEYDOWN() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ``` 以上代码, 消息映射宏 `ON_WM_LBUTTONDOWN() ON_WM_KEYDOWN()` 如何将 `消息`与 `映射函数 `关联起来的呢? 答案: ON_WM_LBUTTONDOWN()添加一个条目到CDrawView得消息列表里,它是一个数组,这个条目其中有一项为OnLButton(),即该消息处理函数的地址 所有的CWnd类的WindowProc都会被替换成AfxWndProcBase或AfxWndProc,有消息来时,AfxWndProc首先被调用,继而,要调用到一个叫做OnWndMsg的函数,这个函数查上述的消息列表,查到WM_LBUTTONDOWN后,调用OnLButton。 (四)【VC6.0】直线的橡皮筋绘图技术(貌似只能画点): ``` CPoint m_ptTarget; bool m_MouseIsButtonDown; CPoint m_ptOrigin; void CImage_ProcessingView::OnLButtonDown(UINT nFlags, CPoint point) { //CString s; //s.Format(L"%d", point.x); ////MessageBox(s); ////MessageBox(L"按下了鼠标!!!!!!"); m_ptOrigin = point; m_ptTarget = point; m_MouseIsButtonDown = 1; CWnd::OnLButtonDown(nFlags, point); } void CImage_ProcessingView::OnLButtonUp(UINT nFlags, CPoint point) { if (!m_MouseIsButtonDown) return;//如果鼠标左键没有被按下,则不响应直接返回 CClientDC ClientDC(this); ClientDC.SelectStockObject(NULL_BRUSH);//SelectStockObject 选择的是系统预定义的GDI对象 //SelectObject 选择你自己自定义的的GDI对象 CPen pen, *oldPen; pen.CreatePen(PS_SOLID, 10, RGB(255, 0, 0)); oldPen = ClientDC.SelectObject(&pen); ClientDC.SetROP2(R2_NOTXORPEN); ClientDC.MoveTo(m_ptOrigin.x, m_ptOrigin.y); ClientDC.LineTo(m_ptTarget.x, m_ptTarget.y); m_ptTarget = point; ClientDC.MoveTo(m_ptOrigin.x, m_ptOrigin.y); //这两句画本次鼠标移动事件的直线因为有异或操作 ClientDC.LineTo(m_ptTarget.x, m_ptTarget.y); ClientDC.SelectObject(oldPen); CWnd::OnLButtonUp(nFlags, point); //调用下基类的 } void CImage_ProcessingView::OnMouseMove(UINT nFlags, CPoint point) { if (!m_MouseIsButtonDown) return;//如果鼠标左键没有被按下,则不响应直接返回 m_MouseIsButtonDown = false; CClientDC ClientDC(this); ClientDC.SelectStockObject(NULL_BRUSH); CPen pen, *oldPen; pen.CreatePen(PS_SOLID, 10, RGB(255, 255, 0)); oldPen = ClientDC.SelectObject(&pen); ClientDC.SetROP2(R2_COPYPEN); // ClientDC.MoveTo(m_ptOrigin.x, m_ptOrigin.y); ClientDC.LineTo(m_ptTarget.x, m_ptTarget.y); ClientDC.SelectObject(oldPen);// CWnd::OnMouseMove(nFlags, point); } ``` (五)VC真正的橡皮筋技术(经测试,正确!) ``` CPoint OriginPos; // 绘图的起始点 CPoint TargetPos; // 绘图的目标点 bool m_bDrawing; // 是否在绘图状态 void CImage_ProcessingView::OnLButtonDown(UINT nFlags, CPoint point) { m_bDrawing = true; OriginPos = point; TargetPos = point; CWnd::OnLButtonDown(nFlags, point); } void CImage_ProcessingView::OnLButtonUp(UINT nFlags, CPoint point) { if (!m_bDrawing) return; m_bDrawing = false; CClientDC ClientDC(this); ClientDC.DPtoLP(&point); ClientDC.SelectStockObject(NULL_BRUSH); CPen pen, *oldPen; pen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); oldPen = ClientDC.SelectObject(&pen); ClientDC.SetROP2(R2_COPYPEN); ClientDC.MoveTo(OriginPos.x, OriginPos.y); ClientDC.LineTo(TargetPos.x, TargetPos.y); ClientDC.SelectObject(oldPen); CView::OnLButtonUp(nFlags, point); CWnd::OnLButtonUp(nFlags, point); //调用下基类的 } void CImage_ProcessingView::OnMouseMove(UINT nFlags, CPoint point) { if (!m_bDrawing) return; CClientDC ClientDC(this); ClientDC.DPtoLP(&point); ClientDC.SelectStockObject(NULL_BRUSH); CPen pen, *oldPen; pen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); oldPen = ClientDC.SelectObject(&pen); ClientDC.SetROP2(R2_NOT); ClientDC.MoveTo(OriginPos.x, OriginPos.y); ClientDC.LineTo(TargetPos.x, TargetPos.y); TargetPos = point; ClientDC.MoveTo(OriginPos.x, OriginPos.y); ClientDC.LineTo(TargetPos.x, TargetPos.y); ClientDC.SelectObject(oldPen); CWnd::OnMouseMove(nFlags, point); } ``` (六)MFC移动画矩形: https://blog.csdn.net/chenjie863/article/details/17531339 (七)获取当前鼠标的位置,以及messagebox显示位置 ``` CPoint point; GetCursorPos(&point); CRect rect_ctr; this->GetWindowRect(&rect_ctr); //获取主窗口相对屏幕左上角的坐标,/存储到rect_ctr中 point.x += rect_ctr.left; //在屏幕上的绝对坐标 point.y += rect_ctr.top; SetCursorPos(100, 200);//移动到某点坐标 GetCursorPos(&point); //获取当前光标位置 int i= 2; float f = 1.8f; CString s; s.Format(L"%d", point.x); //显示变量point.x MessageBox(s); s.Format(L"%.1f", f);//显示变量f MessageBox(s); SetCursorPos(400, 200);//移动到某点坐标 GetCursorPos(&point); ```
上一篇:
PyTorch里的requires_grad、volatile及no_grad
下一篇:
一二三维数组的内存分配与释放
0
赞
100 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册