• CWnd和CDC, hwnd和hdc


    虽然Gilbert之前介绍过CWndHWnd的区别但是这里和其他几个CDC, HDC放在一起重申一下其中的区别和关系.

    1.对象和句柄

    CWnd是类, HWnd是句柄, CWnd封装了HWnd

    CWnd wnd;

    HWnd hWnd;

    wnd.Attach(hWnd);//句柄到对象

        wnd->m_hWnd;// 对象到句柄

    当然一般在程序中是这样获得句柄:

    AfxGetMainWnd()->m_hwnd;

    同样的, CDCHDC也是这样的关系:

    CDC *pDC=new CDC;

    HDC hdc;

    pDC->GetSafeHdc();//通过对象获得句柄:

    pDC->Attach(hdc); //通过句柄获得对象:


    HWND是SDK定义的类型,是一个无确切意义的32-bit值,在调用API时用于指代窗体。 
    CWnd*是一个有确切意义的指针,指向一个MFC窗体类CWnd的实例。因为MFC对SDK做了封装,大部分调用都可以用CWnd*作为参数,所以很容易混淆。从一个CWnd*获取句柄的方法是pWnd->GetSafeHwnd(),他比 pWnd->m_hWnd安全,因为前者在pWnd == NULL的时候返回NULL而后者出现access violation.

    2. CWndCDC, hwndhdc

    所有跟窗口相关的操作都被封装在CWnd类中所有跟绘图相关的操作都被封装在CDC类中.

    hwnd句柄是描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结构;hdc句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。  

    3. 使用不同的CDC绘图

    CClientDC      客户区dc;

    CWindowDC      整窗口dc;    

    CDC            任何dc;

    /*
      CDC *pDC=CWnd::GetDC();
      //此处直接使用CWnd类的GetDC,其返回值为CDC*
      //SDK中的同名函数使用返回的是HDC

    */
      pDC->MoveTo(m_ptOrigin);
      pDC->LineTo(point);
      CWnd::ReleaseDC(pDC);
      


      /*//使用CClientDC绘图
      CClientDC派生自CDC,在构造的时候调用GetDC,
      在析构的时候调用ReleaseDC。使得我们不必
      显示调用GetDCReleaseDC
      */
      CClientDC dc(this);
      dc.MoveTo(m_ptOrigin);
      dc.LineTo(point);

    /*//使用CWindowDC绘图
      同样派生自CDC,构造调用GetWindowDC

    析构时调用ReleaseDC()
      可以访问整个屏幕区域,包括客户区和非客户区。
      */
      CWindowDC dc(this);
      dc.MoveTo(m_ptOrigin);
      dc.LineTo(point);

    所有知识来自于互联网.

  • 相关阅读:
    Struts1简单开发流程梳理
    更改数据库字符集编码引起的问题、textarea标签输出内容时不能顶格(左对齐)输出
    FineReport基本使用
    Navicat for MySQL笔记1
    Hibernate(十)
    Elasticsearch NEST 控制字段名称命名格式
    ckeditor 敏感词标记显示处理方法
    Elasticsearch .Net Client NEST 多条件查询示例
    Elasticsearch .Net Client NEST 索引DataSet数据
    一个很简单的SqlServer生成常用C#语句工具的诞生
  • 原文地址:https://www.cnblogs.com/qq78292959/p/2153457.html
Copyright © 2020-2023  润新知