#pragma once
#include "Msflexgrid.h"
#include "ForestEnum.h"
///
// PrintHelper
// Implementation of the Class PrintHelper
// Created on: 10-2-2006 20:42:11
// Original author: huangxinzhang
///
class CPrintHelper
{
public:
CPrintHelper(CDC * pDc, bool bHeader, bool bFooter);
~CPrintHelper();
// 該打印設備的 DPI 値
int dpi() { return _dpi; }
// 根據DPI値,將毫米單位轉換成像素單位
int mm2pixel(float mm) {
return (int) (mm * dpi() / 25.4);
}
// 根據DPI値,將像素單位轉換成毫米單位
float pixel2mm(int pixel) {
return (float) 25.4 * pixel / dpi();
}
//可打印區域頁高(單位:像素)
int GetPagePixelHeight() { return _pDc->GetDeviceCaps(VERTRES); }
//可打印區域頁寬(單位:像素)
int GetPagePixelWidth() { return _pDc->GetDeviceCaps(HORZRES); }
// 紙高(單位:像素)
int GetPaperHeight() { return _pDc->GetDeviceCaps(PHYSICALHEIGHT); }
// 紙寬 (單位:像素)
int GetPaperWidth() { return _pDc->GetDeviceCaps(PHYSICALWIDTH); }
//頁眉高度(單位:像素)
int GetHeaderHeight() { return _bHeader ? _headerHeight : 0; }
//頁脚高度(單位:像素)
int GetFooterHeight() { return _bFooter ? _footerHeight : 0; }
//字體高度(單位:像素)
int GetFontPixelHeight() { return _fontHeight; }
//行高 = 字體高度 + 行間距(單位:像素)
int GetLinePixelHeight()
{
return _fontHeight + _LineSpacing;
}
// 頁的默認左空白(單位:mm)
int GetPaperLMargin()
{
return int((25.4 * (GetPaperWidth() - GetPagePixelWidth()) / dpi()/2));
}
//頁的默認上空白(單位:mm)
int GetPaperTMargin()
{
return int((25.4 * (GetPaperHeight() - GetPagePixelHeight()) / dpi()/2));
}
// 一頁可打印多少行
int LinesPerPage() {
int pageHeight = GetPagePixelHeight() - _topMargin - _bottomMargin;
pageHeight -= GetHeaderHeight();
pageHeight -= GetFooterHeight();
int lpp = (int) (pageHeight / GetLinePixelHeight());
return lpp - 1; // 表頭用掉一行,所以減一
}
// 打印頁眉
void PrintHeader(CString title, CString sYear, CString sImage, CString eYear, CString eImage);
// 打印頁脚
void PrintFooter(int currentPage); // , int totalPage);
//打印一行格子及其内容
void PrintGridHeader();
// 打印一頁
int PrintPage(CMsflexgrid1 &grid, int line);
// 畫一行格子(除第一個格子外,其他格子同樣大小)
void PrintLineGrid(int top, int height = 1);
// 打印一行數據
bool PrintLineText(CMsflexgrid1 &grid, int row, int& linePosition);
// 打印一條row數據需要多少行
int GetPrintLineNumber(CMsflexgrid1 &grid, int rowPos);
private:
CString CPrintHelper::GetSubString( const CString s, int iStartPos, int iLen ) const;
private:
CDC * _pDc;
CFont * _pFont;
CPen * _pPen;
bool _bHeader; // 是否打印頁頭
bool _bFooter; // 是否打印頁脚
int _dpi; // DPI (英寸點數)
int _headerHeight; // 頁眉高度(單位:像素)
int _titleHeight; // 標題高(單位:像素)
int _footerHeight; // 頁脚高度(單位:像素)
int _fontHeight; // 字體高度(單位:像素)
int _LineSpacing; // 行間距(單位:像素)
int _topMargin; // 上留白(單位:像素)
int _bottomMargin; // 下留白(單位:像素)
int _leftMargin; // 左留白(單位:像素)
int _rightMargin; // 右留白(單位:像素)
int _gridWidth; // 格子寬度(單位:像素)
int _firstGridWidth; // 第一個格子寬度(單位:像素)
int _gridNUmber; // 行格子數
int _gridMargin; // 格子中的左右邊界(像素)
float _ratio; //與A3紙相對的比率
// 字體平均寬度(單位:mm)
float _CharWidth;
};