登 录
建一个工程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); }
抱歉!评论已关闭.