• Windows Gdi & CDC和HDC的区别与转换


    一,GDI基础   

       GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。

          而在MFC代码中,常常遇到的CDC CPaintDC CWindowDC CClientDC。在这里稍作解释。

      CDC :例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。

      CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时调用EndPaint,其余同理)。

      BeginPaint:一般用在对WM_PAINT的响应函数中使用

      GetWindowDC:可获得整个Window的HDC,而GetDC仅能获得客户区的HDC,区别就在于--

      前者有效地绘制区域是整个窗口(边框、标题栏、客户区的总和)。
      后者有效地绘制区域仅限于客户区。

      两者的坐标系都是相对坐标而非屏幕坐标,原点是(0,0)。即以自己可绘制区域的左上角作为原点。

    二,CDC和HDC的区别与转换

    一)区别与联系

    HDC是句柄;CDC是MFC封装的Windows   设备相关的一个类;CClientDC是CDC的衍生类,产生对应于Windows客户区的对象

    HDC是WINDOWS的一种数据类型,是设备描述句柄。

    而CDC是MFC里的一个类,它封装了几乎所有的关于HDC的操作。   

    也可以这样说,HDC定义的变量指向一块内存,这块 内存用来描述一个设备的相关的内容,所以也可以   认为HDC定义的是一个指针;而CDC类定义一个对象,   这个对象拥有HDC定义的一个设备描述表,同时也包   含与HDC相关的操作的函数。   

    这与HPEN和CPen,POINT与CPoint之间的差别是一样的。

    二)获得CDC *

    CDC* pDC

    pDC=GetDC(); 

    三)获得hdc

    HDC hDC;

    1,hDC=GetDC(pCxp->hWnd);  // windows api

    2,pDC->m_hDC;        // mfc CDC class member data

    四)转换

    CDC* pDC

    HDC hDC;

    pDC=Attach(hDC);

    hDC=GetSafeHDC(pDC);

    pDC->m_hDC==hDC

  • 相关阅读:
    [转]Android自定义控件三部曲系列完全解析(动画, 绘图, 自定义View)
    【深入Java虚拟机】之二:Java垃圾回收机制
    【深入Java虚拟机】之一:Java内存模型
    java线程安全
    [转]软键盘用法总结
    jqgrid 不能选中行, 每次点击单元格都自动选中第一行
    TextBox禁用与启用的方法
    Easyui TextBox 添加事件的方法
    运行程序时抛出异常“找不到请求的 .Net Framework Data Provider。可能没有安装。”
    序列 Sequence
  • 原文地址:https://www.cnblogs.com/endenvor/p/9855503.html
Copyright © 2020-2023  润新知