详解DC、CDC、HDC、句柄、设备上下文

来源:互联网 发布:网络代写兼职是真的吗 编辑:程序博客网 时间:2024/04/20 16:51

http://wenku.baidu.com/link?url=Cbw_6z33NlLtKNNNohXKnCOc7-YXJqePDdjkSgt-GPI0MxFKxIWnjWy6hPvGfWPcjy2_dp_EfcPewKHygrCKRsiRidMjp46UBcZFThFrrh7




















































































































































































有的绘制操作通过设备描述表进行。设备描述表与大多WIN32结构不同,应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的句柄间接访问该结构。    
    设备描述表总是与某种系统硬件设备相关。比如屏幕设备描述表与显示设备相关,打印机设备描述表与打印设备相关等等。    
    屏幕设备描述表,一般我们简单地称其为设备描述表。它与显示设备具有一定的对应关系,在windows   GDI界面下,它总是相关与某个窗口或这窗口上的某个显示区域。通常意义上窗口的设备描述表,一般指的是窗口的客户区,不包括标题栏、菜单栏所占有的区域,而对于整个窗口来说,其设备描述表严格意义上来讲应该称为窗口设备描述表,它包含窗口的全部显示区域。二者的操作方法完全一致,所不同的仅仅是可操作的范围不同而已。    
    windows   窗口一旦创建,它就自动地产生了与之相对应的设备描述表数据结构,用户可运用该结构,实现对窗口显示区域的GDI操作,如划线、写文本、绘制位图、填充等,并且所有这些操作均要通过设备描述表句柄了进行。    
  /***************************************************************************************/      书中是这么说的,但是如何理解啊?    
  如果将设备描述表理解成为设备的一种抽象地描述(或者说是硬件在数据结构上一种映射),那么显示设备描述表对应显示器,在编写程序的时候现在假设以GetDC获得设备描述标的句柄。      hdc   =   GetDC(hwnd);//获得窗口设备描述表句柄      [使用GDI函数]    
  ReleaseDC(hwnd,   hdc);    
  我想知道这个过程和显存的关系。也就是如何通过显存绘制到显示器对应的窗口上的。      再确切地说就是GDI绘制既然针对的是设备描述表,那么设备描述表是否在内存中?      他和显存之间的关系是什么? 
通过设备描述表调用显示卡驱动,由显示卡驱动程序访问显存实现绘图输出,因此在GDI下面是无法直接访问到显存的。这种方式主要是提供了统一的编程界面,使得编程人员不用考虑具体的设备的特性,一切和设备打交道的工作交由系统完成,编程者只要调用统一的GDI函数即可。设备描述表在内存中是存在的。                                                                                                                                                  转自CSDN GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。 
  在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。    GDI是如何实现输出的?  
  要想在屏幕或者其它输出设备上输出图形或者文字,那么我们就必须先获得一个称为设备描述表( DC:Device Context)的对象的句柄,以它为参数,调用各种GDI函数实现各种文字或图形的输出。设备描述表是GDI内部保存数据的一种数据结构,此结构中的属性内容与特定的输出设备(显示器,打印机等)相关,属性定义了GDI函数的工作细节,在这里属性确定了文字的颜色,x坐标和y坐标映射到窗口显示区域的方式等。 
  设备描述表句柄一旦获得,那么系统将使用默认的属性值填充设备描述表结构。   如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。 如何使用设备描述表 2007-02-22 19:46:18  www.hackbase.com  来源:互联网 本文示例源代码下载 












 
  Windows 程序在屏幕、打印机或其它设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的  
本文示例源代码下载  
  Windows 程序在屏幕、打印机或其它设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的逻辑意义上的"显示平面"上去。设备描述表(DC)是Windows中的一种数据结构,它包含GDI需要的所有关于显示界面情况的描述字段,包括相连的物理设备和各种各样的状态信息。在Windows画图之前,Windows程序从GDI获取设备描述表句柄(HDC),并在每次调用完GDI输出函数后将句柄返回给GDI。本文将对如何获得和释放 HDC以及 CDC及其派生类的使用方法进行演示说明。  
  下载示例工程 DCDemo 具体说明:  
  1、按钮 IDC_GETDC_APINULL的函数  
void CDCDemoDlg::OnGetdcApinull() { 
  HDC hDC=::GetDC(NULL);   ::MoveToEx(hDC,0,0,NULL);   LineTo(hDC,200,20);   ::ReleaseDC(NULL,hDC); 
}  该段代码具体演示了如何使用API 函数GetDC(NULL),取得屏幕的HDC.并进行画图。 HDC GetDC(HWND hWnd); //功能:取得hWnd窗口的设备描述表句柄。当hWnd参数为NULL时,取得整个屏幕的设备描述表句柄。 MoveToEx和LineTo演示在DC上画一条直线记住,最后调用ReleaseDC释放HDC资源。int ReleaseDC ( 
HWND hWnd,//你要控制的那个窗口的句柄,如果你在GetDC函数传递的是NULL,现在还要传递NULL。 HDC hDC //DC的句柄 
);编译运行程序,按下按钮,发现屏幕的左上角处画了一条直线。   2、按钮 IDC_GETDC_API的函数  
void CDCDemoDlg::OnGetdcApi() { 












  HDC hDC=::GetDC(m_hWnd);   ::MoveToEx(hDC,0,0,NULL);   LineTo(hDC,200,50);   ::ReleaseDC(m_hWnd,hDC); 
}  这段代码与前一段代码唯一的区别是GetDC的参数不再是NULL,而改为CWnd的成员变量m_hWnd,即对话框窗口的句柄。对比两段代码运行结果,深入体会API函数 GetDC。   3、按钮IDC_GETDC_CWND的函数  
void CDCDemoDlg::OnGetdcCwnd() { 
  CDC *pDC=GetDC();   pDC->MoveTo(0,0);   pDC->LineTo(200,100);   ReleaseDC(pDC); 
}  该段代码演示使用MFC CWnd类的 GetDC函数和ReleaseDC的方法,使用该方法在程序窗口中画图非常方便。为了避免获取和释放设备描述表所带来的麻烦,MFC提供了一些CDC派生类,如CPaintDC,CClientDC,CWindowDC,这些类被设计为可直接进行实例化。各个类的构造函数和析构函数调用相应的函数捕获和释放设备描述表,从而使得更加方便简捷。   4、按钮IDC_CCLIENTDC的函数 
http://www.hackbase.com/lib/2007-02-22/13807.html 
windows 程序设计中的 设备描述表 2009-08-26 08:55 
从CDC 派生出四个功能更具体的设备描述表类。层次如图所示。 
 












下面,分别讨论派生出的四种设备描述表。 
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。  
本文来自CSDN博客,转载请标明出处:
http://blog.csdn.net/anthit/archive/2007/05/15/1610037.aspx 要使用设备描述表,一般有如下步骤: 获取或者创建设备描述表; 
必要的话,改变设备描述表的属性; 使用设备描述表完成绘制操作; 
释放或删除设备描述表。  
Common设备描述表通过::GetDC,::GetDCEx,::BeginPaint来获得一个设备描述表,用毕,用::ReleaseDC或::EndPaint释放设备描述表; 
Printer设备描述表通过::CreateDC创建设备描述表,用::DeleteDC删除设备描述表。 
Memory设备描述表通过::CreateCompatibleDC创建设备描述表,用::DeleteDC












删除。 
Information设备描述表通过::CreateIC创建设备描述表,用::DeleteDC删除

0 0
原创粉丝点击