• 【笨嘴拙舌WINDOWS】Dj,oh!nonono,It is about DC


    “DC: Device content 设备描述表。通常指显示器,或者打印机设备的描述”

    如果你不是从事打印机方面的编程,那么就可以将DC简单的理解为显示器的属性表。WINDOWS将内存里面的东西通过显示器展现出来,使用了显示器的绘制(在显示器中间画一条黑色水平1个像素宽的直线)属性,这些属性被WINDOWS装入了一个叫做DC的结构里面!应用程序通过使用DC来绘制自己的窗体。

    image

    如何获得DC


    1.在处理WM_PAINT消息的时候使用

    PAINTSTRUCT ps ;

    hdc = BeginPaint (hwnd, &ps) ;

    EndPaint (hwnd, &ps) ;

    “只能绘制无效区域”

    2.

    hdc= GetDc(hwnd)

    ReleaseDc(hwnd,hdc);

    “只能绘制客户区”

    3.

    hdc = GetWindowDC(hwnd)

    ReleaseDc(hwnd,hdc);

    “能绘制窗体内任何位置”

    4.

    hdc=CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL)

    DeleteDC(hdc);

    “获取屏幕设备”

    hdc=CreateDC(TEXT(“WINSPOOL”),NULL,NULL,NULL)

    DeleteDC(hdc);

    “获取打印机设备”

    5.当使用位图时

    hdcMem=CreateCompatibleD(hdc Of Screen or Printer)

    DeleteDc(hdcMem)

    “创建一个与屏幕兼容的内存设备描述表:绘画从直接屏幕转移到内存,快速进行多种GDI处理,然后一次性输出到屏幕”

    获取DC的属性


    Value=GetDeviceCaps(hdc,Index)

    常用Index取值

    image

    “”

    完整Index的取值与意义列表如下

    DRIVERVERSION:设备驱动程序版本。

    TECHNOLOGY:设备技术,它可以是下列一值:

          DT_PLOTTER:矢量绘图仪;DT_RASDISPLAY:光栅显示器;

          DT_RASPRINTER:光栅打印机;DT_RASCAMERA:光栅照相机;

          DT_CHARSTREAM:字符流;DT_METAFILE:图元文件

          DT_DISPFILE:显示器文件。

    如果hdc参数指定图元文件设备上下文环境,则设备技术就是给CreateEnhMetaFile函数的引用设备,使用GetObjectType函数可以确定它是否是一增强元文件设备上下文环境。

    HORZSIZE:物理屏幕的宽度(毫米);VERTSIZE:物理屏幕的高度(毫米);HORZRES:屏幕的宽度(像素);

    VERTRES:屏幕的高度(光栅线);

    LOGPIXELSX:沿屏幕宽度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;

    LOGPIXELSY:沿屏幕高度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;

    BITSPIXEL:像素相连颜色位数;PLANES:颜色位面数;NUMBRUSHES:设备指定画刷数;

    NUMPENS:设备指定笔数;NUMFONTS:设备指定字体数;

    NUMCOLORS:设备颜色表的入口数,如果设备的色深不超过8位像素。对于超过色深的设备返回-1;

    ASPECTX:用于画线的设备像素的相对宽度;ASPECTY:用于画线的设备像素的相对高度;

    ASPECTXY:用于画线的设备像素的对角线宽度;PDEVLCESIZE:保留;

    CLIDCAPS:显示设备支持剪切性能的标志。如果设备可剪切为一个长方形,则为1,否则为0;

    SIZEPALETTE:系统调色板中的入口数目,只有在设备驱动器在RASTERCAPS索引中设置RC PALETFE位时该索引值才是有效的。且该索引值只能用于16位Windows的驱动器;

    NUMRESERVED:系统调色板中保留的入口数目,只有在设备驱动器在RASTERLAP索引中设置RC PALETFE位时,该索引值才是有效的且该索引值只有能于16位的Windows驱动器;

    COLORRES:实际位像的实际设备颜色,只有设备驱动器在RASTERLAP索引中设置RCPALETFE位时,该索引值才是有效的且该索引值只能用于16位的Windows驱动器;

    PHYSICALWIDTH:对于打印设备,为以设备单位的物理页面宽度。例如一个在8.5*11纸上设置为600dpi的打印机的设备物理单位宽度值为5100,注意物理页面总是大于可打印的页面面积,且从不小于;

    PHPSICALHEIGHT:为以设备单位的物理页面宽度。例如一个在8.5*11纸上设置为600dpi的打印机的设备物理单位高度值为6600;

    PHYSICALOFFSETX:对于打印设备,从物理页面左边到打印页面左边的距离,例如,一个在8.5*11纸上设置为600dpi的打印机,不能在超出左边0.25处打印,且有一个150备单位的水平物理位移;

    PHYSICALOFFSETY;对于打印设备。从物理页面上面到打印页面上边的距离。例如一个在8.5*11打印纸上设置为的打印机,不能在超出上边的地方打处,且有一个设备单位的物理位移;

    VREFRESH:Windows NT:对于显示设备。设备的当前垂直刷新率以每秒中的循环次数为单位0或1刷新率代表显示硬件的缺省刷新率,此缺省刷新率通常通过设置显卡或主板的跳线来改变,或通过一个不使用Win32显示函数比如ChangeDisplay Setting的一个配置程序来设置;

    DESKTOPHORZRES:Windows NT:可视桌面的以像素为单位的宽度。如果设备支持一个可视桌面或双重显示则此值可能大于VERTRES;

    SCALINGFACTORX:打印机x轴的比例系数;SCALINGFACTORY:打印机y轴的比例系数。

    BLTALIGNMENT:在Windows NT中作为像素倍数的水平绘图调整,对于最好的绘图操作,窗口绘图应该是水平调整到此值的倍数。0显示设备为加速的,且可用任何调整。

    SHADEBLENDCAPS:在Windows 98、Windows NT 5.0和以后版本中此值显示设备的阴影和混合特性。

    SB_CONST_ALPHA:处理BLENDFUNCTION结构中的Source constantAlpha元素,并通过AlphaBlend数中的blendFunction参数来指定;

    SB_GRAD_RECT:进行Gradientfill矩形填充的能力。SB_GRAD_TRI;进行Gradientfill三角形填充的能力;

    SB_NONE:设备不支持这些特性中的任何一个。SB_PIXEL_ALPHA:处理AlphaBlond中每一个像素Alphx;

    SB_PREMULT_ALPHA:在Alphablend中对alpha进行预乘;

    RASTERCAPS:设备所支持的光栅性能,可以是下列值的某种组合;

    RC_BANDING:需要联合支持。RC_BITBLT:支持传送位图

    RC_BITMAP64:支持大于64K的位图。RC_DI_BITMAP:支持SetDIBitsGetDIBits函数。

    RC_DIBTODEV:支持SetDIBits To Device函数;RC_FLOODFILL:支持连续填充

    RC_GDI20_OUTPUT:支持16位Windows 2.0特征;RC_PALETTE:指定一个基于调色板的设备。

    RC_SCALING:支持缩放;RC_STRETCHBLT:支持StretchBlt函数。

    RC_STRETCHDIB:stretchDIBits函数。

    CURVECAPS:显示设备所支持的曲线性能,可以是下列值的某种组合。

    CC_NONE:不支持绘制曲线;CC_CHORD:支持绘制弦;CC_CIRCLES:支持绘制圆。

    CC_ELLIPSES:支持绘制椭圆;CC_INTERIORS:支持内部填充;CC_PIE:支持绘制扇形图。

    CC_ROUNDRECT:支持绘制圆角矩形;CC_STYLED:支持绘制带风格的边界。

    CC_WIDE:支持绘制宽的边界;CC_WIDESTYLED:支持绘制宽的、带风格的边界。

    LINECAPS设备所支持的画线性能,可以是下列值的某种组合:

    LC_NONE:不支持绘制线段;LC_INTERIORS:支持内部填充;LC_MARKER:支持绘制标记符。

    LC_POLYLINE:支持折线;LC_POLYMARKER:支持多种标记符;LC_STYLED:带风格的线段。

    LC_WIDE:支持画宽线;LC_WIDESTYLED:支持宽的带风格的线段。

    POLYGONALCAPS设有所支持的多边形性能。可以是下列值的某种组合。

    PC_NONE:不支持绘制多边形;PC_INTERIORS:支持内部填充;PC_POLYGON:支持绘制间隔式填充多边形。

    PC_RECTANGLE:支持绘制矩形;PC_SCANLINE:支持绘制扫描线;PC_STYLED:支持绘制带风格的边界。

    PC_WIDE:支持绘制宽边界;PC_WIDESTYLED:支持绘制宽的带风格的边界。

    PC_WINDPOLYGON:支持绘制折线式填充多边形。

    TEXTCAPS设备所支持的文字性能,可以是下列值的某种组合:

    TC_OP_CHARACTER:支持字符输出精度;TC_OP_STROKE:支持笔画输出精度。

    TC_CP_STROKE:支持笔画剪切精度;TC_CR_90:支持字符作90度旋转;

    TC_CR_ANY:支持字符作任意角度旋转;TC_SF_X_YINDEP:支持x和y方向的独立缩放。

    TC_SA_DOUBLE:支持把字符放大一倍;TC_SA_INTEGER:支持整数倍缩放。

    TC_SA_CONTIN:支持以任何倍数的严格缩放;TC_EA_DOUBLE:支持字符加重。

    TC_IA_ABLE:支持斜字体;TC_UA_ABLE:支持下划线;TC_SO_ABLE:支持删除线。

    TC_RA_ABLE:支持光栅字体;TC_VA_ABLE:支持矢量字体;TC_RESERVED:保留、必须为零。

    TC_SCROLLBLT:不支持用位快传递来滚动,注意这可能事与愿违。

    获取、设置DC


    DC的属性通常存在于某种状态,一旦更改了准备设备不会自动复原(除非重启),可以通过以下这些API来更改其某种属性

    {

    属性

    默认值

    相关函数

    }

    背景色

    WHITE

    GetBkColor

    SetBkColor

    背景模式

    OPAQUE

    GetBkMode

    SetBkMode

    位图

    NONE

    CreateBitMap

    CreateBitMapIndirect

    CreateCompatibleBitmap

    SelectObject

    画刷

    WHITE_BRUSH

    CreateBrushIndirect

    CreateDIBPatternBrush

    CreateHatchBrush

    CreatePatternBrush

    CreateSolidBrush

    SelectObject

    画刷起始位置

    (0,0)

    GetBrushOrg

    SetBrushOrg

    UnrealizeObject

    剪裁域

    DISPLAY SURFACE

    ExcludeClipRect

    IntersetClipRect

    OffsetClipRgn

    SelectClipPath

    SelectObject

    SelectClipRgn

    颜色调色板

    DEFAULT_PALETTE

    CreatePalette

    RealizePatte

    SelectPalette

    绘图方式

    R2_COPYPEN

    GetROP2

    SetROP2

    字体

    SYSTEM_FONT

    CreateFont

    CreateFontIndirect

    SelectObject

    字符间距

    0

    GetTextCharacterExtra

    SetTextCharacterExtra

    映射方式

    MM_TEXT

    GetMapMode

    SetMapMode

    画笔

    BLACK_PEN

    CreatePen

    CreatePenIndirect

    SelectObject

    多边形填充方式

    ALTERNATE

    GetPolyFillMode

    SetPolyFileMode

    缩放模式

    BLACKONWHITE

    SetStretchBltMode

    GetStretchBltMode

    文本颜色

    BLACK

    GetTextColor

    SetTextColor

    视图范围

    (1,1)

    GetViewportExtEx

    SetViewportExtEx

    ScaleViewportExtEx

    视图原点

    (0,0)

    GetViewportOrgEx

    SetViewportOrgEx

    窗口范围

    (1,1)

    GetWindowExtEx

    SetWindowExtEx

    ScaleWindowExtEx

    窗口原点

    (0,0)

    GetWindowOrgEx

    OffsetWindowOrgEx

    SetWindowOrgEx

    保存DC


    DC的使用可以像栈一样PUSH和POP

    idSaved=SaveDc(Hdc)

    RestoreDcr(Hdc,idSaved) //或者RestoreDC(hdc,-1)

  • 相关阅读:
    openh264 动态调整码率
    ffmpeg的avcodec_encode_video2延迟
    深入浅出c++协程
    asio的异步与线程模型解析
    libco分析
    《深入理解kafka》阅读笔记
    记一次shm_open返回EINVAL的错误排查
    css 圆形脉冲动画
    animate.css VUE 使用
    python 装饰器
  • 原文地址:https://www.cnblogs.com/pavkoo/p/3291679.html
Copyright © 2020-2023  润新知