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