扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
设备描述表定义一组图形对象及其属性、影响输出的图形方式(数据)结构。
windows提供设备描述表,用于应用程序和物理设备之间进行交互,从而提供了应用程序设计的平台无关性。
设备描述表是一种数据结构,它包括了一个设备(如显示器和打印机)的绘制属性相关的信息。所有的绘制操作通过设备描述表进行。应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的句柄间接访问该结构。
属性定义了GDI函数的工作细节,在这里属性确定了文字的颜色,x坐标和y坐标映射到窗口显示区域的方式等。
包含GDI需要的所有关于显示界面情况的描述字段,包括相连的物理设备和各种各样的状态信息。
定义了一系列图形对象及其相关的属性,以及会影响输出结果的绘图方式。这些图形对象包括:画笔(用于画直线),笔刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。设备环境函数用于对设备环境进行创建、删除或获取信息。
windows 窗口一旦创建,它就自动地产生了与之相对应的设备描述表数据结构,用户可运用该结构,实现对窗口显示区域的GDI操作,如划线、写文本、绘制位图、填充等,并且所有这些操作均要通过设备描述表句柄了进行。
屏幕设备描述表:与显示设备具有一定的对应关系,在windows GDI界面下,它总是相关与某个窗口或这窗口上的某个显示区域。
窗口的设备描述表:一般指的是窗口的客户区,不包括标题栏、菜单栏所占有的区域,而对于整个窗口来说,其设备描述表严格意义上来讲应该称为窗口设备描述表,它包含窗口的全部显示区域。
Windows 程序在屏幕、打印机或其它设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的逻辑意义上的"显示平面"上去。通过设备描述表调用显示卡驱动,由显示卡驱动程序访问显存实现绘图输出。
在Windows画图之前,Windows程序从GDI获取设备描述表句柄HDC(HDC hDC=::GetDC(NULL)
),并在每次调用完GDI输出函数后将句柄返回给GDI。
负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现程序开发者与硬件设备隔离,大大方便了开发工作。
在屏幕或者其它输出设备上输出图形或者文字:1. 先获得一个称为设备描述表( DC:Device Context)的对象的句柄。 2. 以它为参数,调用各种GDI函数实现各种文字或图形的输出。
设备描述表句柄一旦获得,那么系统将使用默认的属性值填充设备描述表结构。
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
MFC常见设备描述表:CDC、CCientDC 、 CPaintDC、CMetaFileDC、CWindowDCCDC:将Windows API封装成一个类来操作。
CCientDC:代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过::GetDC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在一起;其析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::ReleaseDC释放设备描述表HDC。
CPaintDC:仅仅用于响应WM_PAINT消息时绘制窗口,因为它的构造函数调用了**::BeginPaint**获取设备描述表HDC,并且使用成员函数Attach把它和CPaintDC对象捆绑在一起;析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::EndPaint释放设备描述表HDC,而::BeginPaint和::EndPaint仅仅在响应WM_PAINT时使用。
CMetaFileDC :用于生成元文件。
CWindowDC :代表**整个窗口区(包括非客户区)**的设备描述表。其构造函数CWindowDC(CWnd *pWin)通过::GetWindowDC获取指定窗口的客户区的设备描述表HDC,并使用Attach把它和CWindowDC对象捆绑在一起;其析构函数使用Detach把设备描述表HDC分离出来,调用::ReleaseDC释放设备描述表HDC。
HDC GetDC(HWND hWnd) 、CDC *pDC=pWnd->GetDC()取得hWnd窗口的设备描述表句柄,获得DC的使用权,可以使用它的所有函数。当hWnd参数为NULL时,取得整个屏幕的设备描述表句柄。
HWND hWnd:要控制的窗口的句柄。
HDC hDC:DC的句柄。
释放设备描述表。
详解DC、CDC、HDC、句柄、设备上下文
CDC::BitBlt()将某一内存块的数据传送到另一内存块,前一内存块被称为 "源 ",后一内存块被称为 "目标 "。图象程序开发者使用Blit的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上。
BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);
hDestDC | 目标设备环境的句柄 |
x | 目标设备环境的矩形区域的左上角的x坐标 |
y | 目标设备环境的矩形区域的左上角的y坐标 |
nWidth | 目标设备环境的矩形区域的宽度值 |
nHeight | 目标设备环境的矩形区域的高度值 |
hSrcDC | 源设备环境的句柄 |
xSrc | 源设备环境的矩形区域的左上角的x坐标 |
ySrc | 源设备环境的矩形区域的左上角的y坐标 |
dwRop | 光栅操作符 (Rop),它是指源位图与目标位图以及图案刷的颜色值进行布尔运算的方式 |
常用的光栅操作码及含义 :
void CMainDlg::DrawToolPhotoButton(CDC &dc)
{CDC memDC ;
memDC.CreateCompatibleDC ( &dc ) ;
CBitmap* pBitmap ; //load all bitmap
CBitmap* pOldBitmap ; //save old bitmap temp
//分配bitmap对象内存
pBitmap = new CBitmap ;
pBitmap ->LoadBitmap ( IDB_GPS_B ) ;
pOldBitmap = memDC.SelectObject ( pBitmap ) ;
//将图片COPY到指定的像素位置
dc.BitBlt ( 111,111, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
memDC.SelectObject ( pOldBitmap ) ;
//释放bitmap对象内存
delete pBitmap ;
}
CDC::BitBlt用法
CDC::GetOutputTextExtent()使用当前字体计算输出设备上下文中一行文本的宽度和高度以确定尺寸。
Microsoft CDC 类
CDC::StretchBlt()BOOL StretchBlt( int x, int y,int nWidth,int nHeight, CDC* pSrcDC, intxSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop)
返回值:如果位图已经绘制,则返回非零值,否则为0。
参数: x 目标矩形左上角的X逻辑坐标。
y 目标矩形左上角的Y逻辑坐标。
nWidth 目标矩形的宽度(逻辑单位)。
nHeight 目标矩形的高度(逻辑单位)。
pSrcDC 指定源设备上下文。
xSrc 源矩形左上角的X逻辑坐标。
ySrc 源矩形左上角的Y逻辑坐标。
nSrcWidth 源矩形的宽度(逻辑单位)。
nSrcHeight 源矩形的高度(逻辑单位)。
dwRop 指定光栅操作。
HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
创建与指定的设备环境相关的设备兼容的位图。
hdc: 设备环境句柄。
nWidth:指定位图的宽度,单位为像素。
nHeight:指定位图的高度,单位为像素。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流