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);
}


今天学习到此结束,明天继续学习。

posted @ 2011-12-06 23:22  程序员杰诺斯  阅读(112)  评论(0编辑  收藏  举报