1.通常窗口的客户区并不包括边框、标题栏和菜单栏.因此如果创建了一个CClientDC对象,则该设备环境的映射区域也仅限于客户区域,即用户不可能在客户区域之外绘图.如果创建的是CWindowDC对象那么点(0,0)指的就是整个屏幕的左上角,这时就允许用户在显示器的任何地方绘图.包括窗口边框、标题栏等等.
但是我们要记住:视图窗口没有非客户区,因此CWindowDC更适合于框架窗口,而不是视图窗口.
警告:千万不要删除作为参数以指针形式传递给OnDraw函数的CDC对象,应用程序框架会自动控制他的删除
2.当利用CDC绘图时,我们所绘制的图形都要依赖于设备环境当前状态:
■被选中的GDI绘图对象,如笔,刷子和字体
■决定绘制时缩放尺寸的映射模式
■其他细节,如文本的对其参数,多边形的填充状态
3.GDI派生列表:
■CBitmap:位图是一种位矩阵,每一个显示像素都对应于其中一个或者多个位我们可以用它来表示图像和刷子
■CBrush:刷子定义了一种位图形式的像素,利用它可对区域内部填充颜色
■CFont:字体是一种具有某种风格和尺寸的所有字符的完整集合,它常当作资源存于磁盘中,其中还有一些依赖于某种设备
■CPalette:调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下可以充分利用输出设备的颜色描绘能力
■CPen:笔是一种用来画线及绘制有型边框的工具
■CRgn:区域是由多边形、椭圆或者二者组合形成的一种范围利用它可用来填充,裁剪及鼠标的点中测试
4.如果个构造了一个CGdiObject派生类对象,则在退出程序之前必须先将它删除
5.MFC库函数SelectStockObject可以把一个库存对象选进设备环境中,并返回原先被选中的对象的指针.同时使得该对象被分离出来
利用删除由selectObject返回的指针指向的对象时,如果该对象是由我们自己申请的,那么就可以删除它.如果是临时的则由它说指向的对象也许是最初被选进设备环境的,所以不能将此对象删除.
6.面向颜色的GDI函数可以接收32位COLORREF参数,这种类型的参数分别包含了8位红绿蓝颜色值.
7.系统内含的打印机字体的尺寸都是以磅为单位来进行定义的.此时我们选择的映射模式是MM_TWIPS映射模式,只有在打印和显示的映射模式都被置为MM_TEXT情况下(此时一个像素或点相当于一个逻辑单位),显示和打印才能够得到精确的匹配
■int GetDeviceCaps(int nIndex) const;//捡取有关显示设备的特殊设备宽列信息
返回值:如果成功,则返回所需要的能力值。
参数:
nIndex |
指定返回信息类型,可为下列值之一:
· |
DRIVERVERSION |
版本号,例如:0x100表示1.0版 |
· |
TECHNOLOGY |
设备技术,可为下列值之一:
值 |
含义 |
DT_PLOTTER |
矢量绘图机 |
DT_RASDISPLAY |
光栅显示 |
DT_RASPRINTER |
光栅打印机 |
DT_RASCAMERA |
光栅照相机 |
DT_CHARSTREAM |
字符流 |
DT_METAFILE |
元文件 |
DT_DISPFILE |
显示文件 |
|
· |
HORZSIZE |
物理显示宽度(以毫米为单位)。 |
· |
VERTSIZE |
物理显示高度(以毫米为单位)。 |
· |
HORZRES |
显示宽度(用像素表示)。 |
· |
VERTRES |
显示高度(用光栅线表示)。 |
· |
LOGPIXELSX |
沿显示宽度方向,每一逻辑单位的像素数。 |
· |
LOGPIXELSY |
沿显示高度方向,每一逻辑单位的像素数。 |
· |
BITPIXEL |
每一像素的颜色字节数。 |
· |
PLANES |
颜色位面数。 |
· |
NUMBRUSHES |
指定设备的画刷数目。 |
· |
NUMPENS |
指定设备的画笔数目。 |
· |
NUMFONTS |
指定设备的字体数目。 |
· |
NUMCOLORS |
设备颜色表的入口数目。 |
· |
ASPECTX |
用于描线的设备像素的相对宽度。 |
· |
ASPECTY |
用于描线的设备像素的相对高度。 |
· |
ASPECTXY |
用于描线的设备像素的对角线宽度。 |
· |
PDEVICESIZE |
PDEVICE内部数据结构的尺寸。 |
· |
CLIPCAPS |
设备的剪切能力。可以为以下值之一:
值 |
含义 |
CP_NONE |
输出不被剪切 |
CP_RECTANGLE |
输出被剪切到矩形 |
CP_REGION |
输出被剪切到区域 |
|
· |
SIZEPALETTE |
系统调色板的入口数。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE,该参数才有效。 |
· |
NUMRESERVER |
系统调色板的保留的入口数。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE,该参数才有效。 |
· |
COLORRES |
设备实际的颜色分辨率,用位/像素表示。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE,该参数才有效。 |
· |
RASTERCAPS |
表示设备光栅能力的值。可以为以下值的组合:
值 |
含义 |
RC_BANDING |
需要绑定支持 |
RC_BIGFONT |
支持大于64K的字体 |
RC_BITBLT |
具有传输位图的能力 |
RC_BITMAP64 |
支持大于64K的位图 |
RC_DEVBITS |
支持设备位图 |
RC_DI_BITMAP |
具有支持SetDIBits和GetDIBits Windows 函数的能力 |
RC_DIBTODEV |
具有支持SetDIBitsToDevice Windows 函数的能力 |
RC_FLOODFILL |
具有全面填充能力 |
RC_GD120_OUTPUT |
支持Windows 2.0RC_GD120_STATE设备上下文中包括状态块 |
RC_NONE |
不支持光栅操作 |
RC_OP_DX_OUTPUT |
支持设备白底和DX数组 |
RC_PALETTE |
指定基于调色板的设备 |
RC_SAVEBITMAP |
支持在本地保存位图的能力 |
RC_SCALING |
具有缩放能力 |
RC_STRETCHBLT |
能执行StretchBlt成员函数 |
RC_STRETCHDIB |
能执行Windows StretchDIBits函数 |
|
· |
CURVECAS |
设备的曲线能力。可为以下值的组合:
值 |
含义 |
CC_NONE |
支持曲线 |
CC_CIRCLES |
支持圆 |
CC_PIE |
支持饼图 |
CC_CHORD |
支持弧 |
CC_ELLIPSES |
支持椭圆 |
CC_WIDE |
支持宽边界 |
CC_STYLED |
支持边界风格 |
CC_WIDESTYLED |
支持加宽的边界风格 |
CC_INTERIORS |
支持内部功能 |
CC_ROUNDRECT |
支持圆角矩形 |
|
· |
LINECAPS |
设备的绘制直线能力。可为以下值的组合:
值 |
含义 |
LC_NONE |
不支持直线 |
LC_POLYLINE |
支持多直线 |
LC_MARKER |
支持标记 |
LC_POLYMARKER |
支持多标记 |
LC_WIDE |
支持加宽直线 |
LC_STYLED |
支持直线风格 |
LC_WIDESTYLED |
支持加宽的直线风格 |
LC_INTERIORS |
支持内部功能 |
|
· |
POLYGONALCAPS |
设备绘制多边形的能力。可为以下值的组合:
值 |
含义 |
PC_NONE |
不支持多边形 |
PC_POLYGON |
支持多边形 |
PC_RECTANGLE |
支持矩形 |
PC_WINDPOLYGON |
支持多边形的弯曲数目 |
PC_SCANLINE |
支持扫描直线 |
PC_WIDE |
支持加宽边界 |
PC_STYLED |
支持边界风格 |
PC_WIDESTYLED |
支持加宽的直线风格 |
PC_INTERORS |
支持内部功能 |
|
· |
TEXTCAPS |
设备绘制文本的能力。可为以下值的组合:
值 |
含义 |
TC_OP_CHARACTER |
支持字符精确输出,设备可将设备字体置于任何像素位置。这要求设备带有设备字体 |
TC_OP_STROKE |
支持笔画精确输出,设备可覆盖设备字体的重复动作 |
TC_CP_STROKE |
支持笔画剪切输出,设备可在像素边界剪切设备字体 |
TC_CR_90 |
支持90度的字符旋转,设备一次只能旋转字符90度 |
TC_CR_ANY |
支持任意角度的字符旋转 |
TC_SF_X_YINDEP |
支持x,y方向上的独立度量,设备可以分别从x,y方向上度量设备字体 |
TC_SA_DOUBLE |
支持度量倍增字符,设备可将设备字体放大一倍 |
TC_SA_INTEGER |
支持整数倍度量。设备可将设备字体放大至任意整数倍 |
TC_SA_CONTIN |
支持任意倍度量。设备可将设备字体放大至任意倍。但仍保持X和Y的比率 |
TC_EA_DOUBLE |
支持字符重量加倍,设备字体可设置为粗体。如果此位没有设置打印驱动程序。GDI将通过两次打印的方法创建粗体的设备字体 |
TC_IA_ABLE |
支持斜体字符,设备字体可设置为斜体。如果此位没有设置,GDI认为不能得到斜体 |
TC_UA_ABLE |
支持下划线,设备字体可设置为下划线。如果此位没有设置,GDI为设备字体创建下划线 |
TC_SO_ABLE |
支持空心字符,设备字体可设置为空心。如果此位没有设置,GDI为设备字体创建空心 |
TC_RA_ABLE |
支持光栅字体,GDI应为设备列举可用的光栅或TrueType字体,以便对EnumFonts或EnumFontFamilies函数的调用作出反应。如果此位没有设置,当这些函数调用时,光栅或字体不会加以列举 |
TC_VA_ABLE |
支持矢量字体,GDI应为设备列举可用的矢量或TrueType字体,以便对EnumFonts或EnumFontFamilies函数的调用作出反应。这对矢量设备很重要(如绘图机),显示程序(它们必须使用光栅字体)和光栅打印驱动程序列举矢量字体,因为GDI在将矢量字体送到驱动程序之前要将其进行光栅处理 |
TC_RESERVED |
反转,必须设置为0 |
|
|
说明:检取有关显示设备的特殊设备宽列信息。
其中,利用HORZSIZE和VERTSIZE表示显示器的物理尺寸(这些值并不一定正确,因为Windows并不知道连接到显示适配器的显示器的真实尺寸).我们可以利用HORZSIZE乘以LOGPIXELSX,VERTSIZE乘以LOGPIXELSY来计算显示器的尺寸.用这种方法得到的是显示器的逻辑尺寸
把影射模式设置为逻辑twips的代码:
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1440, 1440);
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),
-pDC->GetDeviceCaps(LOGPIXELSY));
CDC::GetTextFace
int GetTextFace(int nCount,LPTSTR lpszFacename)const;
返回值:拷贝到缓冲区的字节数,不包括空终止符,如果出错,则返回0
参数:nCount:指定缓冲区的大小
lpszFacename:字体名称缓冲区
说明:调用该成员函数将使用当前的字体的字体名拷贝到缓冲区中.