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

📄 printlistctrl.cpp

📁 一个简单的cprint_listctrl程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CPrintListCtrl::PrintFoot(int iOffsetY, HFONT hFootFont, int iPageCounter)
 {
  LOGFONT stLF;

  GetObject(hFootFont, sizeof(stLF), &stLF);

  int   iPageWidth = GetDeviceCaps(m_hPrintDC, HORZRES);
  char  szBuf[255];
  RECT  stRect;
  RECT  stFrameRect;
  HFONT hOldFont = (HFONT)SelectObject(m_hPrintDC, hFootFont);
  int   iOldMode = SetBkMode(m_hPrintDC, TRANSPARENT);

  stFrameRect.left   = 0;
  stFrameRect.top    = iOffsetY;
  stFrameRect.right  = iPageWidth - 1;
  stFrameRect.bottom = iOffsetY + stLF.lfHeight + (2 * HEIGHT_SEPARATOR4);

  if (m_bPrintFootBkgnd)
   {
    HBRUSH hBrush    = CreateSolidBrush(m_clrFootBkgnd);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(m_hPrintDC, hBrush);
  
    FillRect(m_hPrintDC, &stFrameRect, hBrush);

    SelectObject(m_hPrintDC, hOldBrush);
   }

  // Print page counter
  stRect.left   = 2;
  stRect.top    = iOffsetY;
  stRect.right  = iPageWidth / 2;
  stRect.bottom = iOffsetY + stLF.lfHeight + (2 * HEIGHT_SEPARATOR4);

  sprintf(szBuf, "Page : %d", iPageCounter);

  DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);

  // Print date and time
  stRect.left   = iPageWidth / 2;
  stRect.top    = iOffsetY;
  stRect.right  = iPageWidth - 3;
  stRect.bottom = iOffsetY + stLF.lfHeight + (2 * HEIGHT_SEPARATOR4);

  sprintf(szBuf, "%02d/%02d/%04d  %02d:%02d:%02d", m_stST.wDay,
                                                   m_stST.wMonth,
                                                   m_stST.wYear,
                                                   m_stST.wHour,
                                                   m_stST.wMinute,
                                                   m_stST.wSecond);

  DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);

  // Print frame rectangle
  FrameRect(m_hPrintDC, &stFrameRect, (HBRUSH)GetStockObject(BLACK_BRUSH));

  // Restore objects
  SetBkMode(m_hPrintDC, iOldMode);

  SelectObject(m_hPrintDC, hOldFont);
 }

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

int CPrintListCtrl::PrintHead(int iOffsetY, HFONT hHeadFont, LPCTSTR lpszTitle, int iPageCounter)
 {
  LOGFONT stLF, stTitleLF;
  int     iPageWidth, iPageHeight;
  HFONT   hTitleFont;

  GetObject(hHeadFont, sizeof(stLF), &stLF);

  memcpy(&stTitleLF, &stLF, sizeof(LOGFONT));

  stTitleLF.lfHeight = stTitleLF.lfHeight * 2;

  hTitleFont = CreateFontIndirect(&stTitleLF);

  iPageWidth  = GetDeviceCaps(m_hPrintDC, HORZRES);
  iPageHeight = GetDeviceCaps(m_hPrintDC, VERTRES);

  RECT  stRect;
  char  szBuf[255];
  HFONT hOldFont;
  int   iTopFrame = iOffsetY;

  int iOldMode = SetBkMode(m_hPrintDC, TRANSPARENT);

  // Print head background if wanted
  RECT stFrameRect;

  stFrameRect.left   = 0;
  stFrameRect.top    = iTopFrame;
  stFrameRect.right  = iPageWidth - 1;
  stFrameRect.bottom = iOffsetY + (2 * stLF.lfHeight) + stTitleLF.lfHeight;

  if (m_bPrintHeadBkgnd)
   {
    HBRUSH hBrush    = CreateSolidBrush(m_clrHeadBkgnd);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(m_hPrintDC, hBrush);
  
    FillRect(m_hPrintDC, &stFrameRect, hBrush);

    SelectObject(m_hPrintDC, hOldBrush);
   }

  // Print page counter
  stRect.left   = 0;
  stRect.top    = iOffsetY;
  stRect.right  = iPageWidth;
  stRect.bottom = iOffsetY + stLF.lfHeight;

  hOldFont = (HFONT)SelectObject(m_hPrintDC, hHeadFont);
  
  if (!m_bPrintFoot)
   {
    sprintf(szBuf, "Page : %d", iPageCounter);
    
    DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
   }
  else if (m_bHeaderLine1)
        {
         sprintf(szBuf, m_szHeaderLine1);
    
         DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | m_uiHeaderLine1Format | DT_VCENTER);
        }
  
  iOffsetY += stLF.lfHeight;

  // Print title
  stRect.left   = 0;
  stRect.top    = iOffsetY;
  stRect.right  = iPageWidth;
  stRect.bottom = iOffsetY + stTitleLF.lfHeight;

  SelectObject(m_hPrintDC, hTitleFont);
  DrawText(m_hPrintDC, lpszTitle, strlen(lpszTitle), &stRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  iOffsetY += stTitleLF.lfHeight;

  // Print page counter
  stRect.left   = 0;
  stRect.top    = iOffsetY;
  stRect.right  = iPageWidth;
  stRect.bottom = iOffsetY + stLF.lfHeight;

  SelectObject(m_hPrintDC, hHeadFont);
  
  if (!m_bPrintFoot)
   {
    sprintf(szBuf, "%02d/%02d/%04d  %02d:%02d:%02d", m_stST.wDay,
                                                     m_stST.wMonth,
                                                     m_stST.wYear,
                                                     m_stST.wHour,
                                                     m_stST.wMinute,
                                                     m_stST.wSecond);

    DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
   }
  else if (m_bHeaderLine2)
        {
         sprintf(szBuf, m_szHeaderLine2);
    
         DrawText(m_hPrintDC, szBuf, strlen(szBuf), &stRect, DT_SINGLELINE | m_uiHeaderLine2Format | DT_VCENTER);
        }
  
  iOffsetY += stLF.lfHeight;

  // Print frame
  FrameRect(m_hPrintDC, &stFrameRect, (HBRUSH)GetStockObject(BLACK_BRUSH));

  // Restore default values
  SetBkMode(m_hPrintDC, iOldMode);

  SelectObject(m_hPrintDC, hOldFont);

  DeleteObject(hTitleFont);

  return (iOffsetY + HEIGHT_SEPARATOR1);
 }

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

int CPrintListCtrl::PrintListCtrlHeader(int iOffsetY, HFONT hListFont, int iColCount, int *piColWidthTable, int *piColFormatTable, char **pszColTitleTable)
 {
  LOGFONT stLF;
  RECT    stRect;
  int     iOffsetX    = 0;
  HFONT   hOldFont    = (HFONT)SelectObject(m_hPrintDC, hListFont);
  int     iPageWidth  = GetDeviceCaps(m_hPrintDC, HORZRES);
  int     iPageHeight = GetDeviceCaps(m_hPrintDC, VERTRES);

  GetObject(hListFont, sizeof(stLF), &stLF);

  // Print columns titles
  for (int C=0; C<iColCount; C++)
   {
    if (m_bTruncateColumn && (iOffsetX + piColWidthTable[C]) > iPageWidth) break;

    if (iOffsetX > iPageWidth) break;

    if (!piColWidthTable[C]) continue;

    stRect.left   = iOffsetX;
    stRect.top    = iOffsetY;
    stRect.right  = iOffsetX + piColWidthTable[C] - 1;
    stRect.bottom = iOffsetY + stLF.lfHeight;

    CRect cDrawRect = stRect;

    cDrawRect.DeflateRect(4,0);

    DrawText(m_hPrintDC, pszColTitleTable[C], strlen(pszColTitleTable[C]), cDrawRect, DT_SINGLELINE | DT_VCENTER | piColFormatTable[C]);

    iOffsetX += piColWidthTable[C];

    // Print column separator if wanted
    if (m_bPrintColumnSeparator && C > 0)
     {
      MoveToEx(m_hPrintDC, stRect.left-2, stRect.top, NULL);
      LineTo(m_hPrintDC, stRect.left-2, stRect.bottom + HEIGHT_SEPARATOR2);
     }
   }

  iOffsetY += stLF.lfHeight;

  // Print separator line
  HPEN hPen    = CreatePen(PS_SOLID, 3, RGB(0,0,0));
  HPEN hOldPen = (HPEN)SelectObject(m_hPrintDC, hPen);

  MoveToEx(m_hPrintDC, 0, iOffsetY, NULL);
  LineTo(m_hPrintDC, iPageWidth, iOffsetY);

  // Restore default values
  SelectObject(m_hPrintDC, hOldPen);

  SelectObject(m_hPrintDC, hOldFont);

  return (iOffsetY + HEIGHT_SEPARATOR2);
 }

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

int CPrintListCtrl::PrintListCtrlLine(int iPageWidth, int iPageHeight, int iOffsetY, HFONT hListFont, HWND hListCtrl, int iLine, int *piColWidthTable, int *piColFormatTable, BOOL *pbNewPage)
 {
  *pbNewPage = FALSE;

  if (!hListCtrl) return -1;

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

  if (!hHeaderCtrl) return -1;

  int iColCount   = (int)SendMessage(hHeaderCtrl, HDM_GETITEMCOUNT, 0L, 0L);
  int iLineCount  = (int)SendMessage(hListCtrl, LVM_GETITEMCOUNT, 0L, 0L);

  LOGFONT stLF;

  GetObject(hListFont, sizeof(stLF), &stLF);

  if ((iOffsetY + stLF.lfHeight) > iPageHeight)
   {
    *pbNewPage = TRUE;

    return -1;
   }

  int   iOffsetX = 0;
  HFONT hOldFont = (HFONT)SelectObject(m_hPrintDC, hListFont);

  for (int C=0; C<iColCount; C++)
   {
    if (m_bTruncateColumn && (iOffsetX + piColWidthTable[C]) > iPageWidth) break;
    
    if (iOffsetX > iPageWidth) break;

    if (!piColWidthTable[C]) continue;

    LVITEM stLVI;
    char   szBuf[255];
    RECT   stRect;

    memset(szBuf, 0, sizeof(szBuf));

    stLVI.iSubItem   = C;
    stLVI.pszText    = szBuf;
    stLVI.cchTextMax = sizeof(szBuf);

    SendMessage(hListCtrl, LVM_GETITEMTEXT, (WPARAM)(int)iLine, (LPARAM)(LPLVITEM)&stLVI);

    stRect.left   = iOffsetX;
    stRect.top    = iOffsetY;
    stRect.right  = iOffsetX + piColWidthTable[C];
    stRect.bottom = iOffsetY + stLF.lfHeight;

    //int iWidth = GetTextSize(szBuf);
    
    //if (iWidth > (stRect.right - stRect.left)) strcpy(szBuf,"...");

    CRect cDrawRect = stRect;

    cDrawRect.DeflateRect(4,0);

    DrawText(m_hPrintDC, szBuf, strlen(szBuf), cDrawRect, DT_SINGLELINE | DT_VCENTER | piColFormatTable[C]);

    iOffsetX += piColWidthTable[C];

    // Print column separator if wanted
    if (m_bPrintColumnSeparator && C > 0)
     {
      MoveToEx(m_hPrintDC, stRect.left-2, stRect.top, NULL);
      LineTo(m_hPrintDC, stRect.left-2, stRect.bottom + HEIGHT_SEPARATOR3);
     }
   }

  iOffsetY += stLF.lfHeight;

  // Print line separator if wanted

  if (m_bPrintLineSeparator)
   {
    MoveToEx(m_hPrintDC, 0, iOffsetY + (int)(HEIGHT_SEPARATOR3 / 2), NULL);
    LineTo(m_hPrintDC, iPageWidth, iOffsetY + (int)(HEIGHT_SEPARATOR3 / 2));
   }

  SelectObject(m_hPrintDC, hOldFont);

  return (iOffsetY + HEIGHT_SEPARATOR3);
 }

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

BOOL CPrintListCtrl::PrintSetup(HWND hParent, BOOL bDefault)
 {
  PRINTDLG stPD;

  memset(&stPD, 0, sizeof(stPD));

  stPD.lStructSize = sizeof(stPD);
  stPD.hwndOwner   = hParent;
  stPD.Flags       = PD_ALLPAGES | PD_DISABLEPRINTTOFILE |
                     PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
  stPD.hDevNames   =  NULL;
  stPD.hDevMode    = bDefault ? NULL : m_hDevMode;

  if (bDefault)
   {
    stPD.Flags |= PD_RETURNDEFAULT;
   }

  BOOL bRet = PrintDlg(&stPD);

  if (bRet == FALSE && CommDlgExtendedError()) return FALSE;

  if (bRet == FALSE && !CommDlgExtendedError()) return TRUE;

  ClearPrintDC();

  m_hPrintDC = stPD.hDC;

  return (m_hPrintDC != NULL);
 }

⌨️ 快捷键说明

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