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