CDC类定义的是设备上下文对象的类。
CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。
通过CDC对象的成员函数进行所有的绘图。
类对设备上下文操作提供了成员函数,处理绘图工具。安全型图形设备接口(GDI)对象收集,以及处理颜色和调色板。
它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。
另外还为绘制文本、处理字体,使用打印机跳转,滚动和播放元文件提供成员函数。
使用CDC对象时要构造它,然后调用与它平等的、使用设备上下文的Windows函数的成员函数。
在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。
//创建透明画刷
CClientDC dc(this);
//使用(HBRUSH)GetStockObject可以返回空画刷句柄,但CBrush
//无法通过画刷句柄构造,可通过给其静态成员函数FromHandle传递HBRUSH
//句柄获得CBrush指针
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
双缓存绘图
格式基本固定
Line 自定义结构体包含地点 和终点
m_lstLines 自定义队列
CList<Line> m_lstLines; //用于保存之前绘制的直线
// 1. 创建一个内存DC
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
// 2. 创建一个内存位图, 作为绘图的画布
CRect rcClient;
GetClientRect(&rcClient); //获取客户区的大小
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(pDC,
rcClient.Width(),
rcClient.Height());
// 3. 将内存位图选入内存DC
dcMem.SelectObject(&bmpMem);
//将内存的背景色设为客户区的背景色
dcMem.FillSolidRect(&rcClient, pDC->GetBkColor());
//设置内存的背景颜色
//dcMem.FillSolidRect(&rcClient, RGB(0, 255, 0));
// 4. 在内存DC中绘制图形
//绘制保存的直线
//获得列表头结点
POSITION pos = m_lstLines.GetHeadPosition();
while (pos)
{
Line& line = m_lstLines.GetNext(pos);
//绘制直线起点函数
dcMem.MoveTo(line.m_ptBegin);
//绘制直线终点函数
dcMem.LineTo(line.m_ptEnd);
}
//绘制当前直线
dcMem.MoveTo(m_lineCurrent.m_ptBegin);
dcMem.LineTo(m_lineCurrent.m_ptEnd);
// 5. 贴图, 将内存DC中的图形贴到窗口
pDC->BitBlt(0, 0, //拷贝到客户区的位置
rcClient.Width(), rcClient.Height(),//拷贝的大小
&dcMem, //从内存DC拷贝
0, 0, //从内存DC的左上角拷贝
SRCCOPY);
Bitblt作用将某一内存块的数据传送到另一内存块,前一内存块被称为 "源 ",后一内存块被称为 "目标 "图象程序开发者使用Blit的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上
//通知窗口重绘
InvalidateRect(NULL, FALSE);
第二个参数表示是否刷新背景
鼠标操作
SetCapture(); // 接受窗口外的鼠标消息
ReleaseCapture(); //不再接受窗口外的鼠标消息