设备描述表http://www.360doc.com/content/13/0131/06/6781252_263350340.shtml

设备描述表

 
  DC(Device Context)设备描述表,又称设备上下文
 
  设备描述表是一个定义一组图形对象及其属性、影响输出的图形方式(数据)结构。windows提供设备描述表,用于应用程序和物理设备之间进行交互,从而提供了应用程序设计的平台无关性。设备描述表又称为设备上下文,或者设备环境。
 
  设备描述表是一种数据结构,它包括了一个设备(如显示器和打印机)的绘制属性相关的信息。所有的绘制操作通过设备描述表进行。设备描述表与大多 WIN32结构不同,应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的句柄间接访问该结构。
 
  设备描述表总是与某种系统硬件设备相关。比如屏幕设备描述表与显示设备相关,打印机设备描述表与打印设备相关等等。
 
  屏幕设备描述表,一般我们简单地称其为设备描述表。它与显示设备具有一定的对应关系,在windows GDI界面下,它总是相关与某个窗口或这窗口上的某个显示区域。通常意义上窗口的设备描述表,一般指的是窗口的客户区,不包括标题栏菜单栏所占有的区域,而对于整个窗口来说,其设备描述表严格意义上来讲应该称为窗口设备描述表,它包含窗口的全部显示区域。二者的操作方法完全一致,所不同的仅仅是可操作的范围不同而已。
 
  windows 窗口一旦创建,它就自动地产生了与之相对应的设备描述表数据结构,用户可运用该结构,实现对窗口显示区域的GDI操作,如划线、写文本、绘制位图、填充等,并且所有这些操作均要通过设备描述表句柄来进行。
 
1.在处理WM_PAINT消息时,使用BeginPaint()和EndPaint()调用:
hdc = BeginPaint(hwnd, &ps);
……
……
EndPaint(hwnd, &ps);
变量ps是型态为PAINTSTRUCT的结构(见MSDN),该结构的hdc字段是BeginPaint传回的设备内容句柄。 PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定义一个包围窗口显示区域无效范围的矩形。使用从 BeginPaint获得的设备描述表句柄,只能在这个区域内绘图。BeginPaint调用使该区域有效。

注意:若要响应WM_PAINT消息,则无论如何都要使BeginPaint和EndPaint被执行,否则程序会出问题(CPU占用近100%)。因为,如果不调用BeginPaint函数,WM_PAINT消息不会从消息队列中移出,问题可想而知了。

2.在处理非WM_PAINT消息时取得设备描述表句柄:
hdc = GetDC(hwnd);
……
……
ReleaseDC(hwnd, hdc);
这个设备描述表适用于窗口句柄为hwnd的客户区。这些调用与BeginPaint和EndPaint组合之间的基本区别是,利用从GetDC传回的句柄可以在整个客户区上绘图。
注意:GetDC和ReleaseDC不会使客户区中任何可能的无效区域变成有效。

3. 取得适用于整个窗口(而不仅限于窗口的客户区)的设备内容句柄:
hdc = GetWindowDC(hwnd);
……
GetWindowRect(hwnd, &rect);
……
ReleaseDC(hwnd, hdc);

4. 取得设备描述表句柄的更常用的函数是CreateDC:
hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);
……
……
DeleteDC(hdc);
注意上面的释放句柄函数是DeleteDC。可以通过下面的调用来取得整个屏幕的设备描述表句柄(可以作出汉王手写板的效果):
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);

5. 使用位图时,取得一个“内存设备描述表”:
hdcMem = CreateCompatibleDC(hdc);
……
BitBlt(...);
……
DeleteDC(hdcMem);
posted @   程序员阿钢  阅读(287)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示