第四章、简单绘图
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);