MFC打印Listctrl控件内容



typedef   struct   tagColAtt
{
 int   nColIndex;
 CString   strColText;
 int   nPrintX;
 int   nSubItemIndex;
}COLATT;


BOOL CCMP2Dlg::PrintListCtrl(CListCtrl &list)
{
 PRINTDLG   pd;
 pd.lStructSize   =   sizeof(PRINTDLG);
 pd.Flags   =   PD_RETURNDC;
 pd.hDC   =   NULL;
 pd.hwndOwner   =   NULL;
 pd.hInstance   =   NULL;
 pd.nMaxPage   =   1;
 pd.nMinPage   =   1;
 pd.nFromPage   =   1;
 pd.nToPage     =   1;
 pd.nCopies   =   1;
 pd.hDevMode   =   NULL;
 pd.hDevNames   =   NULL;

 //显示打印对话框,由用户来设定纸张大小等。
 if(!PrintDlg(&pd))   return   FALSE;  
 ASSERT(pd.hDC!=NULL);

 int   nHorRes   =   GetDeviceCaps(pd.hDC,   HORZRES);
 int   nVerRes   =   GetDeviceCaps(pd.hDC,   VERTRES);
 int   nXMargin   =   2;
 int   nYMargin   =   2;
 TEXTMETRIC   tm;
 GetTextMetrics(pd.hDC,   &tm);
 int   nCharHeight   =   tm.tmHeight;
 int   nCharWidth   =   tm.tmAveCharWidth;


 CHeaderCtrl*   pHeader   =   list.GetHeaderCtrl();
 //获得行,列的个数
 int   nColCount   =   pHeader-> GetItemCount();
 int   nLineCount   =   list.GetItemCount();

 int   ColOrderArray[100];
 COLATT   ca[100];
 list.GetColumnOrderArray(ColOrderArray,   nColCount);
 int   nColX   =nXMargin*nCharWidth;

 //检索各列的信息,确定列标题的内容长度。
 for(int   i   =0   ;   i <   nColCount;   i++)
 {
  ca[i].nColIndex   =   ColOrderArray[i];
  LVCOLUMN   lvc;
  TCHAR   text[100];
  lvc.mask   =   LVCF_TEXT|LVCF_SUBITEM;
  lvc.pszText   =   text;
  lvc.cchTextMax   =   100;
  list.GetColumn(ca[i].nColIndex,   &lvc);
  ca[i].strColText   =   lvc.pszText;
  ca[i].nSubItemIndex   =   lvc.iSubItem;
  ca[i].nPrintX   =   nColX;
  nColX   +=   nCharWidth   *   wcslen(ca[i].strColText);

  if(nColX   >   nHorRes)  
  {
   DeleteDC(pd.hDC);
   AfxMessageBox( _T("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。 "));
   return   FALSE;
  }
 }

 DOCINFO   di;
 di.cbSize   =   sizeof(DOCINFO);
 di.lpszDocName   =   _T("考勤报表");  
 di.lpszOutput   =   (LPTSTR)   NULL;  
 di.lpszDatatype   =   (LPTSTR)   NULL;  
 di.fwType   =   0;  
 StartDoc(pd.hDC,   &di);
 StartPage(pd.hDC);

 TextOut(pd.hDC,nHorRes/3,nYMargin,_T("考勤报表"),wcslen(_T("考勤报表")));

 //调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。
 int   space   =   (nHorRes-nXMargin*nCharWidth-nColX)   /   (nColCount   -1);
 for(int i   =1;   i <nColCount;   i++)
 {
  ca[i].nPrintX   +=   i*space;
 }

 //输出列标题
 for(int i=0;   i <nColCount;   i++)
  TextOut(pd.hDC,   ca[i].nPrintX,   nYMargin,  
  ca[i].strColText,   wcslen(ca[i].strColText));

 int   nMaxLinePerPage   =   nVerRes/nCharHeight   -3;
 int   nCurPage   =1;
 //输出各列的数据
 for(int i=0;   i <nLineCount;   i++)
 {
  for(int j=0;   j <nColCount;   j++)
  {
   if(i+1-(nCurPage-1)*nMaxLinePerPage   >   nMaxLinePerPage)
   {
    //新的一页
    EndPage(pd.hDC);
    StartPage(pd.hDC);
    nCurPage   ++;
   }
   CString   subitem   =   list.GetItemText(i,   ca[j].nSubItemIndex);
   TextOut(pd.hDC,   ca[j].nPrintX,   nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight,   subitem,   wcslen(subitem));
  }
 }

 EndPage(pd.hDC);
 EndDoc(pd.hDC);
 //打印结束
 DeleteDC(pd.hDC);
 return   TRUE;
}

猜你喜欢

转载自blog.csdn.net/landeli2/article/details/51160225