我们平常画一条线,通常肯定是需要知道起点和终点的。mfc也一样。
我们先定义一个。变量CPoint的m_ptStart变量记录起点位置,起点是鼠标放下去的位置
创建按下鼠标事件:
void Ctest4View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptStart = point; //记录起点 CView::OnLButtonDown(nFlags, point); }
在终点,做画线操作。方法很多。鼠标弹起来的事件
void Ctest4View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ................ CView::OnLButtonUp(nFlags, point); }
方法一:
HDC hdc; //申明hdc句柄 hdc = ::GetDC(m_hWnd); //调用全局的函数 MoveToEx(hdc,m_ptStart.x,m_ptStart.y,NULL); //移动到这个点 LineTo(hdc,point.x,point.y); //从当前位置划线结束 ::ReleaseDC(m_hWnd,hdc);//释放dc,也是全局
方法二:
CDC *pDC = GetDC(); //返回dc句柄指针,相当于设置 pDC->MoveTo(m_ptStart);// pDC->LineTo(point); ReleaseDC(pDC);//释放dc
方法三:
//CClientDC dc(this);//本窗口 CClientDC dc(GetParent());//父窗口 CClientDC 包含了 getdc 并releasedc dc.MoveTo(m_ptStart); dc.LineTo(point);
方法四:
//CWindowDC dc(GetParent()); CWindowDC dc(GetDesktopWindow()); //获取桌面设备 dc.MoveTo(m_ptStart); dc.LineTo(point);
给dc对象增加画笔
CDC *pDC = GetDC(); CPen pen(PS_SOLID,10,RGB(255,0,0)); //创建画笔,画笔风格,颜色 pDC->MoveTo(m_ptStart); //指定起点位置 CPen *poldPen = pDC->SelectObject(&pen);//将画笔上线,并返回老画笔 pDC->LineTo(point);//描绘,从起点到point点 pDC->SelectObject(poldPen); //恢复画笔 ReleaseDC(pDC); //释放
给dc对象增加画刷
//颜色画刷 CBrush brush(RGB(255,0,0)); //创建红色画刷 CClientDC dc(this); //创建dc CClientDC 构造函数里,有getdc 和 releasedc dc.FillRect(CRect(m_ptStart,point),&brush);//填充矩形
创建位图画刷,IDB_BITMAP1是位图资源
//位图画刷 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap); CClientDC dc(this); //创建dc dc.FillRect(CRect(m_ptStart,point),&brush);
创建透明画刷
CClientDC dc(this); //获取透明画刷 GetStockObject 返回画刷句柄 FromHandle 返回画刷指针 CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush *poldBrush = dc.SelectObject(pBrush); dc.Rectangle(CRect(m_ptStart,point));//画矩形 dc.SelectObject(poldBrush);
鼠标轨迹事件
void Ctest4View::OnMouseMove(UINT nFlags, CPoint point) // { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(pen); if(m_draw) { dc.MoveTo(m_ptStart); dc.LineTo(m_ptold); dc.MoveTo(m_ptold); dc.LineTo(point); m_ptold = point; } CView::OnMouseMove(nFlags, point); }