⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printlistctrl.cpp

📁 一个简单的cprint_listctrl程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// --------------------------------------------------------------------------

BOOL CPrintListCtrl::ResizeColumnToFitContent(int iCol)
 {
  if (!m_hListCtrl) return FALSE;

  HWND hHeaderCtrl = (HWND)SendMessage(m_hListCtrl, LVM_GETHEADER, 0L, 0L);

  if (!hHeaderCtrl) return FALSE;
  
  int iColCount = (int)SendMessage(hHeaderCtrl, HDM_GETITEMCOUNT, 0L, 0L);

  if (iCol < 0 || iCol >= iColCount) return FALSE;

  return SendMessage(m_hListCtrl, LVM_SETCOLUMNWIDTH, (WPARAM)(int)iCol, MAKELPARAM((int)LVSCW_AUTOSIZE_USEHEADER,0));
 }

// --------------------------------------------------------------------------

BOOL CPrintListCtrl::ResizeColumnsToFitContent()
 {
  if (!m_hListCtrl) return FALSE;

  HWND hHeaderCtrl = (HWND)SendMessage(m_hListCtrl, LVM_GETHEADER, 0L, 0L);

  if (!hHeaderCtrl) return FALSE;
  
  int iColCount = (int)SendMessage(hHeaderCtrl, HDM_GETITEMCOUNT, 0L, 0L);

  for (int C=0; C<iColCount; C++)
   {
    ResizeColumnToFitContent(C);
   }

  return TRUE;
 }

// --------------------------------------------------------------------------

int CPrintListCtrl::ScreenHeightToPrinterHeight(int iScreenHeight)
 {
  if (!m_hPrintDC) return -1;

  HDC hScreenDC = GetDC(NULL);

  if (!hScreenDC) return -1;

  int iPrinterHeight = (iScreenHeight * GetDeviceCaps(m_hPrintDC,LOGPIXELSY)) / GetDeviceCaps(hScreenDC,LOGPIXELSY);

  ReleaseDC(NULL, hScreenDC);

  return iPrinterHeight;
 }

// --------------------------------------------------------------------------

int CPrintListCtrl::ScreenWidthToPrinterWidth(int iScreenWidth)
 {
  if (!m_hPrintDC) return -1;

  HDC hScreenDC = GetDC(NULL);

  if (!hScreenDC) return -1;

  int iPrinterWidth = (iScreenWidth * GetDeviceCaps(m_hPrintDC,LOGPIXELSX)) / GetDeviceCaps(hScreenDC,LOGPIXELSX);

  ReleaseDC(NULL, hScreenDC);

  return iPrinterWidth;
 }

// --------------------------------------------------------------------------

BOOL CPrintListCtrl::SetDefaultPrinterSettings(HWND hParent)
 {
  ClearPrintDC();

  return PrintSetup(hParent,TRUE);
 }

// --------------------------------------------------------------------------

void CPrintListCtrl::SetHeaderLine1(char *szLine, UINT uiFormat)
 {
  if (!szLine)
   {
    m_bHeaderLine1 = FALSE;
    memset(m_szHeaderLine1, 0, sizeof(m_szHeaderLine1));
    return;
   }

  m_bHeaderLine1 = TRUE;

  strcpy(m_szHeaderLine1, szLine);

  m_uiHeaderLine1Format = uiFormat;
 }

// --------------------------------------------------------------------------

void CPrintListCtrl::SetHeaderLine2(char *szLine, UINT uiFormat)
 {
  if (!szLine)
   {
    m_bHeaderLine2 = FALSE;
    memset(m_szHeaderLine2, 0, sizeof(m_szHeaderLine2));
    return;
   }

  m_bHeaderLine2 = TRUE;

  strcpy(m_szHeaderLine2, szLine);

  m_uiHeaderLine2Format = uiFormat;
 }

// --------------------------------------------------------------------------

BOOL CPrintListCtrl::SetPrinterOrientation(BOOL bLandscape)
 {
  if (!m_hDevMode) return FALSE;

  DEVMODE *pstDevMode = (DEVMODE *)GlobalLock(m_hDevMode);

  pstDevMode->dmFields |= DM_ORIENTATION;

  pstDevMode->dmOrientation = bLandscape ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT;

  GlobalUnlock(m_hDevMode);

  return TRUE;
 }

// --------------------------------------------------------------------------

BOOL CPrintListCtrl::SetPrinterPaperSize(int iValue)
 {
  if (!m_hDevMode) return FALSE;

  DEVMODE *pstDevMode = (DEVMODE *)GlobalLock(m_hDevMode);

  pstDevMode->dmFields |= DM_PAPERSIZE;

  pstDevMode->dmPaperSize = iValue;

  GlobalUnlock(m_hDevMode);

  return TRUE;
 }

// --------------------------------------------------------------------------
// Functions for print preview
// --------------------------------------------------------------------------

#ifdef _AFXDLL
void CPrintListCtrl::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
 {
  m_hPrintDC = pDC->m_hAttribDC;

  // Create all fonts to use for printing
  int iPrinterFtHead = ScreenHeightToPrinterHeight(m_iScreenFtHead);
  int iPrinterFtList = ScreenHeightToPrinterHeight(m_iScreenFtList);
  int iPrinterFtFoot = ScreenHeightToPrinterHeight(m_iScreenFtFoot);

  m_hHeadFont = CreateFont(iPrinterFtHead, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, m_szFtHead);
  m_hListFont = CreateFont(iPrinterFtHead, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, m_szFtList);
  m_hFootFont = CreateFont(iPrinterFtFoot, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, m_szFtFoot);

  // Get size of a character in list font
  HFONT hOldFont = (HFONT)SelectObject(m_hPrintDC, m_hListFont);
  char  szChar[] = "X";
  SIZE  stSize;

  GetTextExtentPoint32(m_hPrintDC, szChar, strlen(szChar), &stSize);

  SelectObject(m_hPrintDC, hOldFont);

  // Get all information about column size, alignment, ...
  for (int C=0; C<m_iColCount; C++)
   {
    HDITEM stHDI;
    char   szTitle[255];

    memset(szTitle, 0, sizeof(szTitle));

    stHDI.mask       = HDI_TEXT | HDI_WIDTH | HDI_FORMAT;
    stHDI.cchTextMax = sizeof(szTitle);
    stHDI.pszText    = szTitle;

    HWND hHeaderCtrl = (HWND)SendMessage(m_hListCtrl, LVM_GETHEADER, 0L, 0L);
    if (!SendMessage(hHeaderCtrl, HDM_GETITEM, (WPARAM)(int)C, (LPARAM)(LPHDITEM)&stHDI)) continue;

    int iMax = GetLengthyStringFromColumn(C) + 1;

    //piColWidthTable[C] = ScreenWidthToPrinterWidth(stHDI.cxy) + 20;

    m_piColWidthTable[C]  = stHDI.cxy ? stSize.cx * iMax : 0;
    
    if ((stHDI.fmt & HDF_CENTER) == HDF_CENTER) m_piColFormatTable[C] = DT_CENTER;
    else if ((stHDI.fmt & HDF_RIGHT) == HDF_RIGHT) m_piColFormatTable[C] = DT_RIGHT;
         else m_piColFormatTable[C] = DT_LEFT;

    if (stHDI.cchTextMax > 0 && stHDI.pszText)
     {
      m_pszColTitleTable[C] = new char[stHDI.cchTextMax];

      ASSERT(m_pszColTitleTable[C]);

      lstrcpy(m_pszColTitleTable[C], stHDI.pszText);
     }
   }

  // Calculate the lines per page - First add the Page header + Footer
  LOGFONT stLF;
  
  GetObject(m_hHeadFont, sizeof(stLF), &stLF);
  
  int iOffset      = 0;
  int iTotalHeight = GetDeviceCaps(pDC->m_hAttribDC, VERTRES);

  if (m_bPrintHead)
   {
    iOffset = (stLF.lfHeight * 4) + HEIGHT_SEPARATOR1;
   }

  if (m_bPrintFoot)
   {
    iTotalHeight -= (GetFootHeight(m_hFootFont) + HEIGHT_SEPARATOR5);
   }

  // Add the size of the list control header
  GetObject(m_hListFont, sizeof(stLF), &stLF);

  iOffset += stLF.lfHeight + HEIGHT_SEPARATOR2;

  iTotalHeight -= iOffset;

  int iLineHeight = stLF.lfHeight + HEIGHT_SEPARATOR3;

  m_nLinesPerPage = iTotalHeight/iLineHeight;

  int nMaxPages = (m_iLineCount/m_nLinesPerPage) + 1;

  pInfo->SetMaxPage(nMaxPages);
  pInfo->SetMinPage(1);
 }

// --------------------------------------------------------------------------

void CPrintListCtrl::OnEndPrinting(CDC *pDC, CPrintInfo *pInfo)
 {
  // Free all allocated memories and objects
  if (m_hHeadFont) DeleteObject(m_hHeadFont);
  if (m_hListFont) DeleteObject(m_hListFont);
  if (m_hFootFont) DeleteObject(m_hFootFont);

  if (m_pszColTitleTable)
   {
    for (int C=0; C<m_iColCount; C++)
     if (m_pszColTitleTable[C]) delete [] m_pszColTitleTable[C];

    delete [] m_pszColTitleTable;
   }

  if (m_piColFormatTable) delete [] m_piColFormatTable;

  if (m_piColWidthTable) delete [] m_piColWidthTable;

  m_hPrintDC = NULL;
 }

// --------------------------------------------------------------------------

BOOL CPrintListCtrl::OnPreparePrinting(CPrintInfo *pInfo, CString csDocName)
 {
  m_csDocName = csDocName;

  if (!m_hListCtrl) return FALSE;

  HWND hHeaderCtrl = (HWND)SendMessage(m_hListCtrl, LVM_GETHEADER, 0L, 0L);

  if (!hHeaderCtrl) return FALSE;

  if (m_bResizeColumnsToFitContent) ResizeColumnsToFitContent();

  m_iColCount  = (int)SendMessage(hHeaderCtrl, HDM_GETITEMCOUNT, 0L, 0L);
  m_iLineCount = (int)SendMessage(m_hListCtrl, LVM_GETITEMCOUNT, 0L, 0L);

  m_piColWidthTable  = new int[m_iColCount];
  m_piColFormatTable = new int[m_iColCount];
  m_pszColTitleTable = new char *[m_iColCount];

  // Get system time
  GetLocalTime(&m_stST);

  // We don't use standard footer
  pInfo->m_strPageDesc.Empty();
 
  return TRUE;
 }

// --------------------------------------------------------------------------

void CPrintListCtrl::OnPrint(CDC *pDC, CPrintInfo *pInfo)
 {
  BOOL bNewPage  = TRUE;
  int  iOffsetY  = 0;
  int iStartLine = 0;
  int iEndLine   = 0;

  // Get page dimension
  m_hPrintDC    = pDC->m_hDC;
  m_iPageWidth  = GetDeviceCaps(pDC->m_hAttribDC, HORZRES);
  m_iPageHeight = GetDeviceCaps(pDC->m_hAttribDC, VERTRES);

  if (!m_hHeadFont || !m_hListFont || !m_hFootFont)
   {
    if (m_hHeadFont) DeleteObject(m_hHeadFont);
    if (m_hListFont) DeleteObject(m_hListFont);
    if (m_hFootFont) DeleteObject(m_hFootFont);
    pInfo->m_bContinuePrinting = FALSE;
    // I could not figure out how to stop the print preview if the font allocation failed
    // But, it never seems to happen, so I doubt the user can get this
    ASSERT(0);
    return ;
   }
  
  iStartLine = m_nLinesPerPage * (pInfo->m_nCurPage - 1);
  iEndLine   = iStartLine + m_nLinesPerPage;

  if (iEndLine>m_iLineCount) iEndLine = m_iLineCount;

  int iPageHeight;

  iOffsetY = 0;
      
  if (m_bPrintHead)
   {
    iOffsetY = PrintHead(iOffsetY, m_hHeadFont, m_csDocName, pInfo->m_nCurPage);
   }

  iOffsetY = PrintListCtrlHeader(iOffsetY, m_hListFont, m_iColCount, m_piColWidthTable, m_piColFormatTable, m_pszColTitleTable);

  if (m_bPrintFoot)
   {
    PrintFoot(m_iPageHeight - GetFootHeight(m_hFootFont), m_hFootFont, pInfo->m_nCurPage);
 
    iPageHeight = m_iPageHeight - (GetFootHeight(m_hFootFont) + HEIGHT_SEPARATOR5);
   }
 
  for (int L=iStartLine; L<iEndLine; L++)
   {
    iOffsetY = PrintListCtrlLine(m_iPageWidth, iPageHeight, iOffsetY, m_hListFont, m_hListCtrl, L, m_piColWidthTable, m_piColFormatTable, &bNewPage);
 
    if (iOffsetY==-1) break;
   }
 }
#endif

// ==========================================================================
// ==========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -