|-----类CMetaFileDC,Windows元文件设备环境操作,用于向GDI元文件绘图
(1)类CClientDC
用于窗口客户区绘图,除了OnPaint函数外。构造此DC时会调用函数CWnd::GetDC以获取一个代表窗口客户区设备环境的指针。
(2)类CMetaFileDC
用于向GDI元文件绘图。构造函数是一个空函数,必须在调用初始化方法的Create函数,才能实现此DC的创建,函数Close用来结束此DC的使用。
(3)类CPaintDC
用于窗口客户区绘图,仅限于OnPaint函数。与类CClientDC不同,在构造此DC的时候会调用函数CWnd::BeginPaint准备绘图,同时建立一个PAINTSTRUCT结构以存储窗口信息:
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
当Windows发送消息WM_PAINT时候,窗口调用消息响应函数OnPaint,建立此DC对象实现绘图。在此DC析构的时候,应用程序调用CWnd::EndPaint函数结束绘图
(4)类CWindowDC
用于窗口内任何地方绘图,除了窗口客户区外,还包含诸如菜单区,状态区,边框等等。
与CClientDC不同,此构造此DC的时候会调用函数CWnd::GetWindowDC以获取整个窗口的设备环境指针。绘图完成后,调用函数CWnd::ReleaseDC结束窗口设备环境的使用,完成DC的析构。
3)CDC基本绘图函数
(1)点,直线与曲线
绘制点的函数
COLORREF SetPixel(int x, int y, COLORREF crColor);
COLORREF SetPixel(POINT point, COLORREF crColor);
常用绘制直线的函数
CPoint MoveTo(int x, int y);
CPoint MoveTo(POINT point);
BOOL LineTo(int x, int y);
BOOL LineTo(POINT point);
BOOL Polyline(const POINT* lpPoints, int nCount);
BOOL PolylineTo(const POINT* lpPoints, int nCount);
常用绘制曲线的函数
BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd);
BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd);
BOOL PolyBezier(const POINT* lpPoints, int nCount);
BOOL PolyBezierTo(const POINT* lpPoints, int nCount);
(2)圆,矩形,多边形与其他图形与效果
常用绘制圆或者椭圆的函数
BOOL Ellipse(int x1, int y1, int x2, int y2);
BOOL Ellipse(LPCRECT lpRect);
常用绘制矩形的函数
直角矩形
BOOL Rectangle(int x1, int y1, int x2, int y2);
BOOL Rectangle(LPCRECT lpRect);
圆角矩形
BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3);
BOOL RoundRect(LPCRECT lpRect, POINT point);
常用绘制多边形的函数
BOOL Polygon(const POINT* lpPoints, int nCount);
函数Chord用于绘制椭圆和直线相交后围成的封闭图形
函数Pie用于绘制饼状的楔形物
3)文本
virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount);
BOOL TextOut(int x, int y, const CString& str);
virtual BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect,
LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths);
BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect,
const CString& str, LPINT lpDxWidths);
virtual CSize TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount,
int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin);
CSize TabbedTextOut(int x, int y, const CString& str,
int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin);
4. 映射模式
映射模式(mapping mode)是设备环境的属性,用于确定从逻辑坐标值到设备坐标值的转换方式,用户可不必考虑输出设备的坐标情况,而在统一的逻辑坐标系中进行图形的绘制和操作。
应用程序支持两类坐标系统:设备坐标系统和逻辑坐标系统。
设备坐标系统是物理设备的坐标系统,比如显示器坐标系统,包含了三种相互独立的坐标系统:屏幕坐标系统,窗口坐标系统和客户区坐标系统。设备坐标系统以像素为度量单位,x轴的正方向为右,y轴的正方向为下。
除了设备坐标系统,其他的就是逻辑坐标系统。映射模式指定了从逻辑坐标转换到设备坐标系的方法。
映射模式定义了将逻辑单位转化为设备单位,以及将逻辑x/y轴方向转化为设备的x/y轴方向。
映射模式中比较特别的是MM_ANISOTROPIC和MM_IOSTROPIC,这两种模式通过将图形从用户自定义的逻辑坐标窗口映射到设备的视口以实现坐标转换,且允许自定义x和y方向。比如
void CExArcView::OnDraw(CDC* pDC)
{
CExArcDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CClientDC dc(this);
CRect rc;
GetClientRect(&rc);
// 设置映射模式
dc.SetMapMode(MM_ANISOTROPIC);
// 设置用户自定义的逻辑坐标窗口
dc.SetWindowExt(500, 500);
// 设置设备的视口
dc.SetViewportExt(rc.Width(), rc.Height());
// 图形输出
dc.Ellipse(0, 0, 500, 500);
}
5. 绘图模式
利用类CDC绘图函数在指定设备上进行图形绘制时,像素并不是简单的输出到逻辑显示平面上,而是通过一系列的布尔运算将输出像素点的颜色和输出目标位置上像素点的颜色合成在一起,所使用的逻辑关系由设备环境当前的绘图模式确定。绘图模式表示两个变量的可能布尔组合,主要使用二进制运算符(AND, OR, XOR和NOT)。
默认的绘图模式是R2_COPYPEN,将像素点复制到显示平面上。