《1》一般画线方法
首先应在View类中增加CPOINT类的一成员变量,并在构造函数中将其初始化为0。
1、利用全局函数(SDK函数)实现画线
HDC hdc; //定义DC
hdc=::GetDC(m_hWnd);
::MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
//m_ptOriginLBUTTONDOWN时获取的点位置
::LineTo(hdc,point.x,point.y);//画线到当前点
::ReleaseDC(m_hWnd,hdc);//释放DC
2、利用CDC类实现画线
CDC *pDC=GetDC();//此时利用的是CWnd的成员函数GetDC
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
3、利用CClientDC类实现画线
//构造时调用GetDC,析构时调用ReleaseDC,因此无需显式的调用GetDC和ReleaseDC
CClientDC dc(this); //构造的DC仅与View类相关,画线仅能画在View窗口上
//CClientDC dc(GetParent());
//构造的DC与View类的父窗口(框架窗口)相关,画线能画在工具栏上,不能画到菜单栏上
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
4、利用CWindowDC类实现画线——也不需要显式地调用GetDC和ReleaseDC
//利用该类可在可在整个屏幕(包括客户区与非客户区)上画线
//CWindowDC dc(this); //与CClientDC没有区别
//CWindowDC dc(GetParent()); //可画到菜单栏
CWindowDC dc(GetDesktopWindow()); //可画到桌面上
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
《2》画出其他颜色线条(利用画笔—CPen类)
CPen pen(PS_DOT,1,RGB(0,255,0));
//创建画笔,参数分别为笔的类型,笔的粗细,笔的颜色
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
//将新画笔的类型选择到设备描述表中,并返回原来画笔的类型
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//将原先画笔的类型选择到设备描述表中
《3》创建画刷
1、创建颜色画刷
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
2、创建位图画刷
CBitmap bitmap;//定义位图
bitmap.LoadBitmap(IDB_BITMAP2);//加载位图
CBrush brush(&bitmap);//创建位图的画刷
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);//利用画刷填充
3、创建透明画刷
CClientDC dc(this);
CBrush *pBrush=CBrush
::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//创建透明画刷(使先前画的仍能看到)
//FromHandle函数将句柄转换为C++对象,GetStockObject函数获得画刷的句柄
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));//画矩形
dc.SelectObject(pOldBrush);
《4》画连续的线
步骤:
1、增加一BOOL型成员变量m_bDraw,并初始化为false
2、在OnLButtonUp函数中令m_bDraw=false;在OnLButtonDown函数中令m_bDraw=true,同时获取点的位置;
3、在OnMouseMove函数中添加
CClientDC dc(this);
if(m_bDraw==TRUE)
{
//dc.SetROP2(R2_BLACK);//设置绘画的模式
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
}