📄 printlistctrl.cpp
字号:
// ==========================================================================
// 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 + -