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

📄 printlistctrl.cpp

📁 使用vc++技术实现光电机串口通信管理程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ==========================================================================
// PrintListCtrl.cpp
// 
// Author : Marquet Mike
//          mike.marquet@altavista.net
//
// Last Modified : 29/03/2000
// by            : MMA
//
// Modification done :
//
// - Comment from Chris (2000/01/27) corrected.
// - Comment from Danijel Ilisin (2000/01/28) corrected.
// - Comment from Alan Gamboa (2000/03/01) corrected.
// - Adding Print Preview (2000/03/29) from Jeff Rucker
// ==========================================================================

// ==========================================================================
// Les Includes
// ==========================================================================

#include "stdafx.h"
#include <commctrl.h>
#include <commdlg.h>
#include <malloc.h>
#include "PrintListCtrl.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

// ==========================================================================
// Les Defines
// ==========================================================================

#define HEIGHT_SEPARATOR1   20
#define HEIGHT_SEPARATOR2   10
#define HEIGHT_SEPARATOR3    6
#define HEIGHT_SEPARATOR4    2
#define HEIGHT_SEPARATOR5   10

/////////////////////////////////////////////////////////////////////////////
// class CPrintListCtrl

CPrintListCtrl::CPrintListCtrl()
 {
  m_hListCtrl                  = NULL;
  m_hPrintDC                   = NULL;
  m_bResizeColumnsToFitContent = FALSE;
  m_bPrintHead                 = TRUE;
  m_bPrintFoot                 = TRUE;
  m_bTruncateColumn            = TRUE;
  m_bPrintColumnSeparator      = TRUE;
  m_bPrintLineSeparator        = FALSE;
  m_bPrintHeadBkgnd            = FALSE;
  m_bPrintFootBkgnd            = FALSE;
  m_bHeaderLine1               = FALSE;
  m_bHeaderLine2               = FALSE;
  m_iScreenFtHead              = 10;
  m_iScreenFtFoot              = 10;
  m_iScreenFtList              = 10;
  m_uiHeaderLine1Format        = DT_RIGHT;
  m_uiHeaderLine2Format        = DT_RIGHT;
  m_clrHeadBkgnd               = RGB(255,255,255);
  m_clrFootBkgnd               = RGB(255,255,255);
  m_hDevMode                   = NULL;

  strcpy(m_szFtHead, "Arial");
  strcpy(m_szFtFoot, "Arial");
  strcpy(m_szFtList, "Arial");

  memset(m_szHeaderLine1, 0, sizeof(m_szHeaderLine1));
  memset(m_szHeaderLine2, 0, sizeof(m_szHeaderLine2));

  CreateDevModeObject();
 }

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

CPrintListCtrl::~CPrintListCtrl()
 {
  ClearPrintDC();
  DeleteDevModeObject();
 }

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

void CPrintListCtrl::ClearPrintDC()
 {
  if (m_hPrintDC) DeleteDC(m_hPrintDC);

  m_hPrintDC = NULL;
 }

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

void CPrintListCtrl::CreateDevModeObject()
 {
  DeleteDevModeObject();

  m_hDevMode = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DEVMODE));
  
  DEVMODE *pstDevMode = (DEVMODE *)GlobalLock(m_hDevMode);

  pstDevMode->dmSize = sizeof(DEVMODE);

  GlobalUnlock(m_hDevMode);
 }

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

void CPrintListCtrl::DeleteDevModeObject()
 {
  if (m_hDevMode) GlobalFree(m_hDevMode);

  m_hDevMode = NULL;
 }

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

int CPrintListCtrl::GetFootHeight(HFONT hFootFont)
 {
  LOGFONT stLF;

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

  return stLF.lfHeight + (2 * HEIGHT_SEPARATOR4);
 }

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

int CPrintListCtrl::GetLengthyStringFromColumn(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);
  int iLineCount = (int)SendMessage(m_hListCtrl, LVM_GETITEMCOUNT, 0L, 0L);
  int iMax       = 0;

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

  HDITEM stHDI;
  char   szBuf[255];

  stHDI.mask       = HDI_TEXT;
  stHDI.pszText    = szBuf;
  stHDI.cchTextMax = sizeof(szBuf);

  if (SendMessage(hHeaderCtrl, HDM_GETITEM, (WPARAM)(int)iCol, (LPARAM)(LPHDITEM)&stHDI))
   {
    if ((int)strlen(szBuf) > iMax) iMax = strlen(szBuf);
   }

  for (int L=0; L<iLineCount; L++)
   {
    LVITEM stLVI;

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

    if (SendMessage(m_hListCtrl, LVM_GETITEMTEXT, (WPARAM)(int)L, (LPARAM)(LPLVITEM)&stLVI))
     {
      if ((int)strlen(szBuf) > iMax) iMax = strlen(szBuf);
     }
   }

  return iMax;
 }

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

int CPrintListCtrl::GetTextSize(LPCTSTR lpszText, SIZE *pstSize)
 {
  int  iWidth;
  SIZE stSize;

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

  iWidth = stSize.cx;
  
  if (!pstSize) return iWidth;

  memcpy(pstSize, &stSize, sizeof(SIZE));

  return iWidth;
 }

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

BOOL CPrintListCtrl::Print(HWND hParent, LPCTSTR lpszDocName, BOOL bDefault)
 {
  if (!m_hPrintDC && !PrintSetup(hParent,bDefault)) return FALSE;

  if (!m_hPrintDC) return FALSE;

  if (!m_hListCtrl) return FALSE;

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

  if (!hHeaderCtrl) return FALSE;

  if (m_bResizeColumnsToFitContent) ResizeColumnsToFitContent();

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

  int   *piColWidthTable  = new int[iColCount];
  int   *piColFormatTable = new int[iColCount];
  char **pszColTitleTable = new char *[iColCount];

  // Get system time
  GetSystemTime(&m_stST);

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

  HFONT 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);
  HFONT hListFont = CreateFont(iPrinterFtList, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, m_szFtList);
  HFONT 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);

  if (!hHeadFont || !hListFont || !hFootFont)
   {
    if (hHeadFont) DeleteObject(hHeadFont);
    if (hListFont) DeleteObject(hListFont);
    if (hFootFont) DeleteObject(hFootFont);

    return FALSE;
   }

  // Get size of a character in list font
  HFONT hOldFont = (HFONT)SelectObject(m_hPrintDC, 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<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;

    if (!SendMessage(hHeaderCtrl, HDM_GETITEM, (WPARAM)(int)C, (LPARAM)(LPHDITEM)&stHDI)) continue;

    int iMax = GetLengthyStringFromColumn(C) + 1;

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

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

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

      ASSERT(pszColTitleTable[C]);

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

  // Get page dimension
  int iPageWidth  = GetDeviceCaps(m_hPrintDC, HORZRES);
  int iPageHeight = GetDeviceCaps(m_hPrintDC, VERTRES);

  // Start printing
  DOCINFO stDI;

  stDI.cbSize       = sizeof(stDI);
  stDI.fwType       = 0;
  stDI.lpszDatatype = 0;
  stDI.lpszOutput   = 0;
  stDI.lpszDocName  = lpszDocName;

  StartDoc(m_hPrintDC, &stDI);

  BOOL bNewPage     = TRUE;
  int  iPageCounter = 0;
  int  iOffsetY     = 0;

  for (int L=0; L<iLineCount; L++)
   {
    if (bNewPage)
     {
      StartPage(m_hPrintDC);
      bNewPage = FALSE;
      iOffsetY = 0;
      iPageCounter++;

      iPageWidth  = GetDeviceCaps(m_hPrintDC, HORZRES); // CORRECTION 02/03/2000
      iPageHeight = GetDeviceCaps(m_hPrintDC, VERTRES); // CORRECTION 02/03/2000

      if (m_bPrintHead)
       {
        iOffsetY = PrintHead(iOffsetY, hHeadFont, lpszDocName, iPageCounter);
       }

      iOffsetY = PrintListCtrlHeader(iOffsetY, hListFont, iColCount, piColWidthTable, piColFormatTable, pszColTitleTable);

      if (m_bPrintFoot)
       {
        PrintFoot(iPageHeight - GetFootHeight(hFootFont), hFootFont, iPageCounter);

        iPageHeight -= (GetFootHeight(hFootFont) + HEIGHT_SEPARATOR5);
       }
     }

    iOffsetY = PrintListCtrlLine(iPageWidth, iPageHeight, iOffsetY, hListFont, m_hListCtrl, L, piColWidthTable, piColFormatTable, &bNewPage);

    if (iOffsetY == -1 && bNewPage)
     {
      EndPage(m_hPrintDC);
      L--;
     }
   }

  if (!bNewPage) EndPage(m_hPrintDC);

  EndDoc(m_hPrintDC);

  // Free all allocated memories and objects
  if (hHeadFont) DeleteObject(hHeadFont);
  if (hListFont) DeleteObject(hListFont);
  if (hFootFont) DeleteObject(hFootFont);

  if (pszColTitleTable)
   {
    for (int C=0; C<iColCount; C++)
     if (pszColTitleTable[C]) delete [] pszColTitleTable[C];

    delete [] pszColTitleTable;
   }

  if (piColFormatTable) delete [] piColFormatTable;

  if (piColWidthTable) delete [] piColWidthTable;

  return TRUE;
 }

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

⌨️ 快捷键说明

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