利用HDC在内存上绘图

来源:互联网 发布:apache ftp http访问 编辑:程序博客网 时间:2024/06/05 15:10
          有时候,我们需要脱离控件来进行绘图,这是因为利用控件进行绘图有一定的局限性。而且有一些是他人需要用到的类时,用控件往往需要获取当前窗口指针等等操作,这个时候并不是很便利。相比较而言,利用内存直接进行回执,将图形全部回执在内存上,对方只需要将这块内存拷贝到画布上即可。
          上述所说的方法,可以通过HDC来实现,HDC是CDC的一个句柄,我们通过对一个对象传入HDC实现利用CDC来绘图,而且在整个类的内部绘图的CDC只要替换成这个外部传入的即可,省去了很多麻烦。但是由于对HDC并不是很熟悉,一开始也遇到了一些问题,现在将HDC传入到类内部使用的流程讲述一下。
          首先,HDC是一个句柄,也就是一个指向CDC的指针,我们知道,绘图操作一般都是通过CDC来完成的,而句柄不具备调用那些函数的作用或者调用起来比较麻烦。所以我们需要先对HDC进行初始化,要让他指向我们要绘图的DC。
    
  m_hDC = pDC->m_hDC;

      而这个时候,由于我们的绘图是用CDC的,所以如果我们的HDC在一个对象中完成了它的绘制任务,需要将HDC转换成CDC,如下:
 
    m_pDC     = CDC::FromHandle(m_hDC);
        这个时候,我们就可以对其进行绘图了。
   m_itic -> CreateITIC( m_hDC ,500,300);
     等到完成了绘图之后,我们需要将m_pdc绘制的内容拷贝到pDC 上,完成图形的打印。
     以下是整个处理的流程:
  
 CDC *pDC     = GetDC();     m_hDC     = pDC->m_hDC;     static int flag     = 0;     m_rect     = CRect(0,0,500,500);     if (flag     == 0)     {          m_pDC     = CDC::FromHandle(m_hDC);          GetClientRect(m_rect);          m_bitmap.CreateCompatibleBitmap(pDC,m_rect.Width(),m_rect.Height());          m_pDC->SelectObject(&m_bitmap);          //m_pDC->FillSolidRect(300,300,400,400,RGB(0,255,0));          m_itic->ShowDataPoint(TRUE);          m_itic->CreateITIC(m_hDC,500,300);          flag  =1;     }


     pDC->BitBlt(0,0,300,300,m_pDC,0,0,SRCCOPY);
当然,当我们传入一个HDC到一个对象内部,我们需要将它转换回PDC,所以在对象内部,也要进行: m_pDC     = CDC::FromHandle(m_hDC);的操作,来玩成转换。这样的话,就可以通过HDC来绘图了。



原创粉丝点击