up!

解决方案 »

  1.   

    谢谢liuhongyong(荒原困兽)兄,发过来参考一下把!
      

  2.   

    //该结构用于存储各列的信息
    typedef struct tagColAtt
    {
    int nColIndex;
    CString strColText;
    int nPrintX;
    int nSubItemIndex;
    }COLATT;BOOL 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;
    char 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 * strlen(ca[i].strColText);if(nColX > nHorRes) 
    {
    DeleteDC(pd.hDC);
    AfxMessageBox("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。");
    return FALSE;
    }
    }DOCINFO di;
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = "ListCtrl Data Printing"; 
    di.lpszOutput = (LPTSTR) NULL; 
    di.lpszDatatype = (LPTSTR) NULL; 
    di.fwType = 0; 
    StartDoc(pd.hDC, &di);
    StartPage(pd.hDC);//调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。
    int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);
    for(i =1; i<nColCount; i++)
    {
    ca[i].nPrintX += i*space;
    }//输出列标题
    for(i =0; i<nColCount; i++)
    TextOut(pd.hDC, ca[i].nPrintX, nYMargin, 
    ca[i].strColText, strlen(ca[i].strColText));int nMaxLinePerPage = nVerRes/nCharHeight -3;
    int nCurPage =1;
    //输出各列的数据
    for(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, strlen(subitem));
    }
    }EndPage(pd.hDC);
    EndDoc(pd.hDC);
    //打印结束
    DeleteDC(pd.hDC);
    return TRUE;
    }