void printTable_draw(CDC* pDC);
bool APIprintFile()
{
CDC dc;
CTime tm = CTime::GetCurrentTime();
CString m_stime;
m_stime = tm.Format("产量报表%Y-%m-%d %H:%M:%S");

CPrintDialog dlg (FALSE,PD_ALLPAGES | PD_RETURNDC, NULL);
dlg.GetDefaults();
if(!AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
       return FALSE;
HDC hdcPrint=dlg.CreatePrinterDC();
dc.Attach (hdcPrint); if (!dc)return false;//未发现打印机 DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);

di.lpszDocName = m_stime ;

CSize size = CSize(800,650);
dc.SetMapMode(MM_ANISOTROPIC);//转换坐标映射方式
dc.SetWindowExt(size);//确定窗口大小
//得到实际设备每逻辑英寸的像素数量
int xLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSY);
//得到设备坐标和逻辑坐标的比例
long yExt = (long)size.cy * yLogPixPerInch/96 ;
long xExt = (long)size.cx * xLogPixPerInch/96;
dc.SetViewportExt((int)xExt, (int)yExt);

  if (dc.StartDoc(&di) < 0)
  {
  MessageBox(NULL,_T("Printer wouldn't initalize"),_T("Info"),MB_OK);
  }
  else
  {
  if (dc.StartPage() < 0 )
  dc.AbortDoc(); 
  else
  {
  printTable_draw(&dc);
  dc.EndPage();
  dc.EndDoc();
  int i = 0;
  i =  (int)m_printarray.GetCount(); 
  PRINTPOOL pl;
  pl.FileName = di.lpszDocName;
  pl.state = 0;
  pl.tm = m_stime;
  pl.ncount = 0;
  m_printarray.InsertAt(i,pl); 
 
  UINT _PrintListen(LPVOID lparam);
  if (pListenPrinting  == NULL)
      pListenPrinting = ::AfxBeginThread(_PrintListen,0); 
  }
  }  
//如何释放dc
  //TRACE("\n%d",ReleaseDC(NULL,dc.m_hDC));
  //dc.Detach();    
  
 // CDC::FromHandle(hdcPrint)->DeleteDC();
 // free(&di);
//  TRACE("\n%d",j);
// Wnd->ReleaseDC(&dc);
  dc.DeleteDC();
return ;
}
如和释放DC?
我用的是是独立的线程中
TRACE("\n%d",ReleaseDC(NULL,dc.m_hDC));可以释放DC但是内存一只上涨!·!
但是如果把代码放在一个由CView继承而来的类中
可以由ReleaseDC(&dc);
释放且内存不会直线上涨!
thank you!

解决方案 »

  1.   

    关键代码:
    void printTable_draw(CDC* pDC);
    bool APIprintFile()
    {
    CDC dc;
    CTime tm = CTime::GetCurrentTime();
    CString m_stime;
    m_stime = tm.Format("产量报表%Y-%m-%d %H:%M:%S");

    CPrintDialog dlg (FALSE,PD_ALLPAGES | PD_RETURNDC, NULL);
    dlg.GetDefaults();
    if(!AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
           return FALSE;
    HDC hdcPrint=dlg.CreatePrinterDC();
    dc.Attach (hdcPrint); if (!dc)return false;//未发现打印机 DOCINFO di;
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);

    di.lpszDocName = m_stime ;

    CSize size = CSize(800,650);
    dc.SetMapMode(MM_ANISOTROPIC);//转换坐标映射方式
    dc.SetWindowExt(size);//确定窗口大小
    //得到实际设备每逻辑英寸的像素数量
    int xLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSX);
    int yLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSY);
    //得到设备坐标和逻辑坐标的比例
    long yExt = (long)size.cy * yLogPixPerInch/96 ;
    long xExt = (long)size.cx * xLogPixPerInch/96;
    dc.SetViewportExt((int)xExt, (int)yExt);

      if (dc.StartDoc(&di) < 0){}
      else
      { 
                 if (dc.StartPage() < 0 )
              dc.AbortDoc(); 
        else
                {
         printTable_draw(&dc);
         dc.EndPage();
                  dc.EndDoc();
                  }
    /*****************************************
                     ???????释放dc
    /___________________________________________return ;
    }
      

  2.   

    HDC hDC = dc.Detach();
      

  3.   

    不行!还是内存泄露!
    不过thank you