请教一下在windows开发中到底什么是设备内容句柄,作用是什么?
小弟以前是作.net开发的对win32的开发不是很了解。最近看了很多关于win32图形绘制的资料。但是设备内容句柄这个东西感觉有点模糊。在这里请高手给我解释一下设备内容句柄到底是什么东西。有什么作用。
[解决办法]
以前看过些设备句柄的说法,有的说是某类对象的指针(地址),有的说不是.不管他是不是地址,
但实际上他的功能,跟一个对象的地址是一样的,我把句柄输出后,其值就是一地址的表式方式一样,也是0x333..等等这种,所以,我就直接拿当地址用了.
[解决办法]
设备描述表概述
当一个应用程序使用GDI函数时,必须先装入特定的设备驱动程序,然后为绘制窗口准备设备描述表,比如指定线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等等。不像其他Win32结构,设备描述表不能被直接访问,只能通过系列Win32函数来间接地操作。
如同Windows“窗口类”一样,设备描述表也是一种Windows数据结构,用来描述绘制窗口所需要的信息。它定义了一个坐标映射模式、一组GDI图形对象及其属性。这些GDI对象包括用于画线的笔,绘图、填图的刷子,位图,调色板,剪裁区域,及路径(Path)。
表2-2列出了设备描述表的结构和各项缺省值,表2-3列出了设备描述表的类型,表2-4显示设备描述表的类型。
表2-2 设备描述表的结构
属性
缺省值
Background color
Background color setting from Windows Control Panel (typically, white)
Background mode
OPAQUE
Bitmap
None
Brush
WHITE_BRUSH
Brush origin
(0,0)
Clipping region
Entire window or client area with the update region clipped, as appropriate. Child and pop-up windows in the client area may also be clipped
Palette
DEFAULT_PALETTE
Current pen position
(0,0)
Device origin
Upper left corner of the window or the client area
Drawing mode
R2_COPYPEN
Font
SYSTEM_FONT (SYSTEM_FIXED_FONT for applications written to run with Windows versions 3.0 and earlier)
Intercharacter spacing
0
Mapping mode
MM_TEXT
Pen
BLACK_PEN
Polygon-fill mode
ALTERNATE
Stretch mode
BLACKONWHITE
Text color
Text color setting from Control Panel (typically, black)
Viewport extent
(1,1)
Viewport origin
(0,0)
Window extent
(1,1)
Window origin
(0,0)
表2-3 设备描述表的分类
Display
显示设备描述表,提供对视频显示设备上的绘制操作的支持
Printer
打印设备描述表,提供对打印机、绘图仪设备上的绘制操作的支持
Memory
内存设备描述表,提供对位图操作的支持
Information
信息设备描述表,提供对操作设备信息获取的支持
表2-3中的显示设备描述表又分三种类型,如表2-4所示。
表2-4 显示设备描述表的分类
名称
特点
功能
Class Device
Contexts
提供对Win16的向后兼容
Common
Device
Contexts
在Windows系统的高速缓冲区,数量有限
Applicaion获取设备描述表时,Windows用缺省值初始化该设备描述表,Application使用它完成绘制操作,然后释放
Private
Device
Contexts
没有数量限制,用完不需释放一次获取,多次使用
多次使用过程中,每次设备描述表属性的任何修改或变化都会被保存,以支持快速绘制
(1)使用设备描述表的步骤
要使用设备描述表,一般有如下步骤:
获取或者创建设备描述表;
必要的话,改变设备描述表的属性;
使用设备描述表完成绘制操作;
释放或删除设备描述表。
Common设备描述表通过::GetDC,::GetDCEx,::BeginPaint来获得一个设备描述表,用毕,用::ReleaseDC或::EndPaint释放设备描述表;
Printer设备描述表通过::CreateDC创建设备描述表,用::DeleteDC删除设备描述表。
Memory设备描述表通过::CreateCompatibleDC创建设备描述表,用::DeleteDC删除。
Information设备描述表通过::CreateIC创建设备描述表,用::DeleteDC删除。
(2)改变设备描述表属性的途径
要改变设备描述表的属性,可通过以下途径:
用::SelectObject选入新的除调色板以外的GDI Object到设备描述表中;
对于调色板,使用::SelectPalette函数选入逻辑调色板,并使用::RealizePalette把逻辑调色板的入口映射到物理调色板中。
用其他API函数改变其他属性,如::SetMapMode改变映射模式。
[解决办法]
设备 上下文 句柄
Device Context Handle
一共3个概念,2个设计理念
句柄,一般是一个索引,通过它得到实际的struct
设备,就是普通设备,比如显示器,打印机
设备上下文,简单理解为一个struct,里面有颜色,画笔粗细,字体,等信息
决定你在这个设备上画出来的效果
句柄是一个封装常用的设计方法
把各种设备抽象为一个统一的设备也是一个常用的设计方法
[解决办法]
设备上下文(device context),其实简单的理解就是一个内存块,但句柄其实是一个二级指针,一个窗口对应一个DC,可以做一些绘图操作。