window GDI
专用设备描述表类
CPaintDC 用于在窗口客户区画图(仅限于OnPaint处理程序)
CClientDC 用于在窗口客户区画图(除OnPaint外的任何处理程序)
CWindowDC 用于在窗口内任意地方画图(包括非客户区)
CMetaFileDC 用于向GDI元文件画图
★在堆上用new创建设备描述表,要亲自释放设备描述表
CPaintDC *pdc =new CPaintDC(this);
delete pdc;
CPaintDC
CPaintDC类响应WM_PAINT消息,允许在客户区画图,但只能在OnPaint处理程序中使用。
CClientDC CWindowDC
程序需要全屏幕的访问权,此时创建CClientDC或CWindowDC对象,并给构造函数传递一个NULL指针。
CClientDC dc(NULL);
dc.Ellipse(0,0,100,100);
设备描述表属性
Attribute | Default | Set With | Get with |
文本颜色 | Black | SetTextColor | GetTextColor |
背景颜色 | White | SetBkColor | GetBkColor |
映射模式 | MM_TEXT | SetMapMode | GetMapMode |
绘图模式 | R2_COPYPEN | SetROP2 | GetROP2 |
当前位置 | (0,0) | MoveTo | GetCurrentPosition |
当前画笔 | BLACK_PEN | SelectObject | SelectObject |
当前画刷 | WHITE_BRUSH | SelectObject | SelectObject |
当前字体 | SYSTEM_FONT | SelectObject | SelectObject |
★ 如果想将背景色设为透明
dc.SetBkMode(TRANSPARENT)
★ 如果不想使用设备描述表是反复进行初始化,可以使用CDC::SaveDC保存它的状态,在下次使用时使用CDC::RestoreDC恢复.
映射模式
MM_TEXT 1像素 x+ y+
MM_LOMETRIC 0.1mm x+ y-
MM_HIMETRIC 0.01mm x+ y-
MM_LOENGLISH 0.01in x+ y-
MM_HIENGLISH 0.001in x+ y-
MM_TWIPS 1/ 1440in ( 0.0007in ) x+ y-
MM_ISOTROPIC 自定义 自定义
MM_ANISOTROPIC 自定义 自定义
获取设备信息
GetDeviceCaps()
参数 返回值
HORZRES 以像素点数目表示显示平面的宽度
VERTRES以像素点数目表示显示平面的高度
HORZSIZE 以毫米表示显示平面的宽度
VERTSIZE 以毫米表示显示平面的高度
LOGPIXELSX 水平方向上每逻辑英寸内像素点的数目
LOGPIXELSY 竖直方向上没逻辑英寸内像素点的数目
NUMCOLORS 如果是显示设备,则返回静态颜色数目;如果是打印机或绘图仪,则返回能支持的颜色数目。
BISPIXEL 每个像素点的位的数目
PLANES 位平面的数目
RASTERCAPS 表述设备的某些特性的位标志,如设备是否为调色板式,设备是否能显示位图。
TECHNOLOGY 位标志,确定设备类型----屏幕、打印机、绘图仪等。
画一条正弦曲线
#include <math.h>
#define SEGMENTS 500
#define PI 3.1415926
void CMfc2View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect);
int nWidth=rect.Width();
int nHeight=rect.Height();
CPoint aPoint[SEGMENTS];
for(int i=0;i<SEGMENTS;i++)
{
aPoint[i].x=(i*nWidth)/SEGMENTS;
aPoint[i].y=(int)((nHeight/2)*(1-(sin((2*PI*i)/SEGMENTS))));
}
dc.Polyline(aPoint,SEGMENTS);
// Do not call CView::OnPaint() for painting messages
}
//画一个不带黑色边框的矩形
dc.FillSolidRect(0,0,10,10,RGB(190,190,190));