利用HDC在内存上绘图

           有时候,我们需要脱离控件来进行绘图,这是因为利用控件进行绘图有一定的局限性。而且有一些是他人需要用到的类时,用控件往往需要获取当前窗口指针等等操作,这个时候并不是很便利。相比较而言,利用内存直接进行回执,将图形全部回执在内存上,对方只需要将这块内存拷贝到画布上即可。
           上述所说的方法,可以通过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来绘图了。



你可能感兴趣的:(编程技术)