VC深入浅出学习笔记(二)
孙鑫VC++第四课,先介绍了一下MFC的消息处理机制,之后主要实现了一些绘图的方法。
一 消息处理映射
MFC维护了一个窗口句柄和类对象指针的表,每当收到一个消息,该消息与一个窗口相关,那么通过窗口句柄找到类对象指针,并把指针传给基类,基类就调用CWnd::WindowProc(虚函数),每个子类都会有该函数, 该函数又调用OnWndMsg(实现消息映射的处理),判断子类是否消息相应的是否实现。如果实现了,则调用子类的消息响应函数。
二 绘图
1>画线
基本方式,记录左键单击的位置,在左键松开的位置记录位置,并连线。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bDraw = TRUE;
m_ptOld=m_ptOrigin = point;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
①WINDOW SDK 实现
// TODO: 在此添加消息处理程序代码和/或调用默认值
HDC hdc;
hdc =::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
②CDC类实现 (MFC)
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
③CClienDC类实现 不用get和release
CClientDC dc(this);
/*CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
④CWindow类实现 坐标对应包括非客户区域
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
前面画出的都是黑线 可以用一个CPen类 和dc的SelectObject函数来改变画的线类型,记得回复原本的dc设备
CPen pen(PS_DOT,1,RGB(255,0,0));
CClientDC dc(this);
CPen *oldpen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(oldpen);
三 利用bitmap画矩形
矩形:
dc.Rectangle(CRect(m_ptOrigin,point));
矩形边框透明不覆盖:(修改默认画刷为透明画刷,并在最后恢复默认)
CBrush *pBrush=CBrush::FromHandle( (HBRUSH)(GetStockObject(NULL_BRUSH)));(static)
CBrush *pOldBrush =dc.SelectObject(pBrush);
CBrush填充:
dc.FillRect(CRect(m_ptOrigin,point),&brush);
bitmap填充:
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);//添加资源 这里为相应ID号
CBrush brush(&bitmap);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
四 连续曲线(断的小连线
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *p_old_pen=dc.SelectObject(&pen);
if(m_bDraw)
{
dc.SetROP2(R2_BLACK);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
m_ptOld = point;
}
dc.SelectObject(p_old_pen);
CView::OnMouseMove(nFlags, point);
}
今天学习到此结束,明天继续学习。