首页 > 代码库 > [游戏学习25] MFC 橡皮筋画线效果
[游戏学习25] MFC 橡皮筋画线效果
>_<:这是给出窗口内外不同情况的处理展示的例子。
>_<:MouseCap.h
1 #include<afxwin.h> 2 class CMyApp :public CWinApp 3 { 4 public: 5 virtual BOOL InitInstance(); 6 }; 7 class CMainWindow:public CFrameWnd 8 { 9 protected: 10 BOOL m_bTracking; //标志:鼠标按下为真,否则为假 11 BOOL m_bCaptureEndabled;//初始化为真,由OnNcLButtonDown()切换,以便用来打开或关闭鼠标捕获对程序影响 12 CPoint m_ptFrom; 13 CPoint m_ptTo; 14 15 void InverLine(CDC* pDC,CPoint ptFrom,CPoint ptTo); 16 public: 17 CMainWindow(); 18 protected: 19 afx_msg void OnLButtonDown(UINT nFlags,CPoint point); 20 afx_msg void OnLButtonUp(UINT nFlags,CPoint point); 21 afx_msg void onm ouseMove(UINT nFlags,CPoint point); 22 afx_msg void OnNcLButtonDown(UINT nHitTest,CPoint point); 23 DECLARE_MESSAGE_MAP(); 24 };
>_<:MouceCap.cpp
1 #include <afxwin.h> 2 #include "MouseCap.h" 3 4 CMyApp myApp; 5 6 BOOL CMyApp::InitInstance(){ 7 8 m_pMainWnd=new CMainWindow; 9 m_pMainWnd->ShowWindow(m_nCmdShow); 10 m_pMainWnd->UpdateWindow(); 11 return TRUE; 12 } 13 14 BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) 15 ON_WM_LBUTTONDOWN() 16 ON_WM_LBUTTONUP() 17 ON_WM_MOUSEMOVE() 18 ON_WM_NCLBUTTONDOWN() 19 END_MESSAGE_MAP() 20 21 22 CMainWindow::CMainWindow(){ 23 m_bTracking = FALSE; 24 m_bCaptureEndabled=TRUE; 25 26 CString strWndClass = AfxRegisterWndClass( 27 0, 28 AfxGetApp()->LoadStandardCursor(IDC_CROSS), 29 (HBRUSH)(COLOR_WINDOW+1), 30 AfxGetApp()->LoadStandardIcon(IDI_WINLOGO) 31 ); 32 33 Create(strWndClass,_T("捕获鼠标_橡皮筋操作")); 34 } 35 36 void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point){ 37 m_ptFrom=point; 38 m_ptTo=point; 39 m_bTracking=TRUE; 40 41 if(m_bCaptureEndabled) 42 SetCapture(); 43 } 44 void CMainWindow::OnMouseMove(UINT nFlags,CPoint point){ 45 if(m_bTracking){ 46 CClientDC dc(this); 47 InverLine(&dc,m_ptFrom,m_ptTo);//清除原来的 48 InverLine(&dc,m_ptFrom,point);//画一条新的 49 m_ptTo=point; 50 } 51 } 52 void CMainWindow::OnLButtonUp(UINT nFlags,CPoint point){ 53 if(m_bTracking){ 54 m_bTracking=FALSE; 55 if(GetCapture()==this) 56 ::ReleaseCapture(); 57 58 CClientDC dc(this); 59 InverLine(&dc,m_ptFrom,m_ptTo);//清除原来的 60 61 CPen pen(PS_DASHDOTDOT,8,RGB(0,255,0));//画一条红的 62 dc.SelectObject(&pen); 63 64 dc.MoveTo(m_ptFrom); 65 dc.LineTo(point); 66 } 67 } 68 //单击标题栏激活CFrameWnd::OnNcLButtonDown(nHitTest,point)处理程序 69 void CMainWindow::OnNcLButtonDown(UINT nHitTest,CPoint point){ 70 if(nHitTest==HTCAPTION){ 71 m_bCaptureEndabled=m_bCaptureEndabled ? FALSE:TRUE; 72 SetWindowText(m_bCaptureEndabled ? 73 _T("能够"):_T("不能")); 74 } 75 CFrameWnd::OnNcLButtonDown(nHitTest,point); 76 } 77 void CMainWindow::InverLine(CDC* pDC,CPoint ptFrom,CPoint ptTo){ 78 int nOldMode=pDC->SetROP2(R2_NOT);//这种绘图模式保证一条清除一条新的 79 pDC->MoveTo(ptFrom); 80 pDC->LineTo(ptTo); 81 82 pDC->SetROP2(nOldMode); 83 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。