建一个工程Draw
一、画一条线
(1)在DrawView.h头文件中,声明一个私有的成员变量:CPoint m_ptOrigin;在其构造函数中初始化为:m_ptOrigin=0;
(2)在DrawView.cpp中,添加如下函数:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptOrigin=point;//将该函数传递进来的点保存到m_ptOrigin中
CView::OnLButtonDown(nFlags, point);
}
第一种方法:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
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);
CView::OnLButtonUp(nFlags, point);
}
第二种方法:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();//CDC是一个专门用来画图的类
pDC->MoveTo(m_ptOrigin);//原理同MoveToEx()
pDC->LineTo(point);
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags, point);
}
第三种方法:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/*CClientDC类是CDC类的派生类,它封装了GetDC()和ReleaseDC*/
CClientDC dc(this);// this指针指向当前窗口,即view类窗口,即绘图区域只有view
//类窗口
//CClientDC dc(GetParent());//GetParent()作用是获得当前窗口的父窗口的指
//frame类窗口,绘图区域可以达到frame类窗口
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
第四种方法:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/* CWindowDC 类也是从CDC类派生出来的类,它封装了GetWindowDC()和ReleaseDC(),该类可以把绘图区域画到客户区和非客户区*/
//CWindowDC dc(this);
//CWindowDC dc(GetParent());//即可以在非客户区划线
CWindowDC dc(GetDesktopWindow());//可以把线画到桌面上
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
拓展:
1、画一条有颜色的线
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPen pen(PS_SOLID,1,RGB(255,0,0));//定义一个画笔(画笔的类型,宽度,颜色);
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);/*把这个画笔加载到设备描述表当中,并且返回原先的画笔*/
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//把旧的画笔再添加到设备描述表当中
CView::OnLButtonUp(nFlags, point);
}
2、添加一个位图
通过菜单栏的“Insert”—“Resouce”,新建一个位图。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;//定义一个位图对象
bitmap.LoadBitmap(IDB_BITMAP1);
//调用LoadBitmap()进行初始化。IDB_BITMAP1是所建立的位图的ID号
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush); //用画刷填充一个矩形区域
CView::OnLButtonUp(nFlags, point);
}
3、画一个透明的矩形框
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
// FromHandle()用来将句柄转换成对象的指针,GetStockObject()获得空的画刷。
CBrush *pOldBrush=dc.SelectObject(pBrush);//将新建的画刷添加到设备描述表中
dc.Rectangle(CRect(m_ptOrigin,point));//画一个矩形
dc.SelectObject(pOldBrush);//还原画刷
CView::OnLButtonUp(nFlags, point);
}
补:若是画一个不透明的矩形框,则只有下面的两个语句就够了:
CClientDC dc(this);
dc.Rectangle(CRect(m_ptOrigin,point));//画一个矩形
二、画一个连续的线
① 在DrawView.h中添加一个私有变量 BOOL m_bDraw。在构造函数中将其初始化为:m_bDraw= FALSE。
② 在OnLButtonDown()中将其置为TRUE,以致在鼠标按下时,也就是在鼠标滑动时,m_bDraw为TRUE,来捕捉信息。
③ 在OnLButtonUp()中,将其置为FALSE,也就是在鼠标左键弹起的时候,捕捉信息结束。
④ 在DrawView.cpp中添加如下函数:
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(m_bDraw==TRUE)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;//这一句最关键,是把前一个线段的末点当做后一个线段的起点,
//这里充分的说明了直线是由无数个点组成的
}
CView::OnMouseMove(nFlags, point);
}
拓展:
1、 画一个无边的扇形
只需要把上面的程序中的m_ptOrigin=point去掉就可以画出一个无边的扇形了
2、 画一个有边的扇形
① 在DrawView.h中添加一个私有变量CPoint m_ptOld,在构造函数中初始化为0。
② 在OnLButtonDown()中将m_ptOld和m_ptOrigin初始化为重合,即m_ptOrigin=m_ptOld=point。
③ 将OnMouseMove()函数修改为:
void CDrawView::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));
if(m_bDraw==TRUE)
{
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptOld);
// m_ptOrigin不变,m_ptOld总是在变,这两个函数是画扇形的轴。
dc.MoveTo(m_ptOld);
dc.LineTo(point);
//这两个函数是画扇形的边。
m_ptOld=point;
dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}