孙鑫VC++第4章简单绘图

来源:互联网 发布:seo外包hane888 编辑:程序博客网 时间:2024/05/27 16:40

                                     

第四章、简单绘图

 

1.      MessageBox(“Hello,MFC”);

2.      利用SDK全局函数实现画线功能

 

HDC hdc;//首先获得窗口的设备描述表

Hdc =::GetDC(m_hWnd); //m_hWnd已经存在的变量

//移动到线条的起点

MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);

//画线

LineTo(hdc,point.x,point.y);

 

//释放设备描述表

::ReleaseDC(m_hWnd,hdc);

 

3.CWnd类有一个成员变量m_hWnd用于保存窗口句柄,而C***View类派生于CWnd类,因此该类也有这个变量,可直接使用;

 

3.      利用MFC 的CDC类实现画线功能

 

CDC* pDC = GetDC();

pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

         ReleaseDC(pDC);

 

MFC为我们提供了一个设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。

该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄;

 

 

4.      利用MFC的CClientDC类实现画线功能,它继承于CDC类,在构造时调用GetDC函数,在析构时候调用ReleaseDC()函数;所有我们不用再显示调用;

 

 

//CClientDC(GetParent());不仅在客户区画图

CClientDCdc(this);

         dc.MoveTo(m_ptOrigin);

         dc.LineTo(point);

 

5.      利用MFC的CWindowDC类实现画线功能

 

 

         CWindowDCdc(this);

         //CWindowDC dc(GetDesktopWindow());

 

         dc.MoveTo(m_ptOrigin);

         dc.LineTo(point);

 

 

6.      在程序中,当构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表中,它才会在以后的绘制操作中生效;

 

一般情况下,在完成绘图操作之后,都要利用SelectObject函数把先前的GDI对象选入设备描述表中,以便使其恢复到先前的状态。

 

 

7.      绘制彩色线条

 

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

 

8.      使用画刷绘图

 

CBrush brush(RGB(255,0,0));

CClientDC dc(this);

         dc.FillRect(CRect(m_ptOrigin,point),&brush);//矩形区域

 

9.位图画刷

 

 

         CBitmapbitmap;//创建位图对象

         bitmap.LoadBitmap(IDB_BITMAP1);//加载位图资源

         CBrushbrush(&bitmap); 、、创建位图画刷

         CClientDCdc(this);

         dc.FillRect(CRect(m_ptOrigin,point),&brush);

 

9.      透明画刷

 

         CClientDCdc(this);

         //创建一个空画刷

         CBrush*pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//属于静态成员函数的调用方法

         CBrush*pOldBrush = dc.SelectObject(pBrush);

         dc.Rectangle(CRect(m_ptOrigin,point));

         dc.SelectObject(pOldBrush);

 

 

10.  绘制连续线条

 

 

CClientDC dc(this);

if(m_bDraw == TRUE)//要先判断是否按下

{

           dc.MoveTo(m_ptOrigin);

           dc.LineTo(point);

           //修改线段的起点

                   m_ptOrigin = point;

 

           }

 

 

11.  绘制扇形效果的线条

 

 

CClientDC dc(this);

dc.SetROP2(R2_MERGENOTPEN);//绘图模式的函数

CPen pen(PS_SOLID,1,RGB(255,0,0));

CPen *pOldPen = dc.SelectObject(&pen);

if (m_bDraw == TRUE)

{

           dc.MoveTo(m_ptOrigin);

           dc.LineTo(point);

           dc.LineTo(m_ptOld);

           m_ptOld = point;

}

 

dc.SelectObject(pOldPen);