📄 cprintpreview.cpp
字号:
::SetDlgItemText( cDlgPrinting.m_hWnd, IDC_STATIC_JOBNAME, szJobName );
/* 親ウィンドウを無効化 */
::EnableWindow( m_pParentWnd->m_hWnd, FALSE );
/* 印刷 ジョブ開始 */
if( FALSE == m_cPrint.PrintOpen(
szJobName,
&m_pPrintSetting->m_mdmDevMode, /* プリンタ設定 DEVMODE用*/
&hdc,
szErrMsg /* エラーメッセージ格納場所 */
) ){
// MYTRACE( "%s\n", szErrMsg );
}
/* 印刷用半角フォントと、印刷用全角フォントを作成 */
hFontHan = CreateFontIndirect( &m_lfPreviewHan );
hFontZen = CreateFontIndirect( &m_lfPreviewZen );
// 現在のフォントを印刷用半角フォントに設定&以前のフォントを保持
hFontOld = (HFONT)::SelectObject( hdc, hFontHan );
/* 紙の大きさをあらわすRECTを設定 */
RECT cRect;
cRect.left = m_pPrintSetting->m_nPrintMarginLX - m_nPreview_PaperOffsetLeft + 5;
cRect.right = m_nPreview_PaperAllWidth - (m_pPrintSetting->m_nPrintMarginRX + m_nPreview_PaperOffsetLeft + 5);
cRect.top = nDirectY * ( m_pPrintSetting->m_nPrintMarginTY - m_nPreview_PaperOffsetTop + 5 );
cRect.bottom = nDirectY * ( m_nPreview_PaperAllHeight - (m_pPrintSetting->m_nPrintMarginBY + m_nPreview_PaperOffsetTop + 5) );
/* ヘッダ?フッタの$pを展開するために、m_nCurPageNumを保持 */
int nCurPageNumOld = m_nCurPageNum;
for( i = 0; i < nNum; ++i ){
m_nCurPageNum = nFrom + i;
/* 印刷過程を表示 */
// Jun. 18, 2001 genta ページ番号表示の計算ミス修正
sprintf( szProgress, "%d/%d", i + 1, nNum );
::SetDlgItemText( cDlgPrinting.m_hWnd, IDC_STATIC_PROGRESS, szProgress );
/* 印刷 ページ開始 */
m_cPrint.PrintStartPage( hdc );
// From Here Jun. 26, 2003 かろと / おきた
// Windows 95/98ではStartPage()関数の呼び出し時に、属性はリセットされて既定値へ戻ります.
// このとき開発者は次のページの印刷を始める前にオブジェクトを選択し直し,
// マッピングモードをもう一度設定しなければなりません
// Windows NT/2000ではStartPageでも属性はリセットされません.
/* マッピングモードの変更 */
::SetMapMode( hdc, MM_LOMETRIC ); //それぞれの論理単位は、0.1 mm にマップされます
::SetMapMode( hdc, MM_ANISOTROPIC ); //論理単位は、任意にスケーリングされた軸上の任意の単位にマップされます
// 現在のフォントを印刷用半角フォントに設定
::SelectObject( hdc, hFontHan );
// To Here Jun. 26, 2003 かろと / おきた
/* ヘッダ印刷 */
DrawHeader( hdc, cRect, hFontZen );
/* 印刷/印刷プレビュー ページテキストの描画 */
DrawPageText(
hdc,
m_pPrintSetting->m_nPrintMarginLX - m_nPreview_PaperOffsetLeft ,
m_pPrintSetting->m_nPrintMarginTY - m_nPreview_PaperOffsetTop+ 2 * ( m_pPrintSetting->m_nPrintFontHeight + (m_pPrintSetting->m_nPrintFontHeight * m_pPrintSetting->m_nPrintLineSpacing / 100) ),
nFrom + i,
hFontZen,
&cDlgPrinting
);
/* フッタ印刷 */
DrawFooter( hdc, cRect, hFontZen );
/* 印刷 ページ終了 */
m_cPrint.PrintEndPage( hdc );
/* 中断ボタン押下チェック */
if( cDlgPrinting.IsCanceled() ){
break;
}
}
// 印刷前のフォントに戻す 2003.05.02 かろと hdc解放の前に処理順序を変更
::SelectObject( hdc, hFontOld );
/* 印刷 ジョブ終了 */
m_cPrint.PrintClose( hdc );
// 印刷用フォントを削除。
::DeleteObject( hFontZen );
::DeleteObject( hFontHan );
::EnableWindow( m_pParentWnd->m_hWnd, TRUE );
cDlgPrinting.CloseDialog( 0 );
m_nCurPageNum = nCurPageNumOld;
// 印刷が終わったら、Previewから抜ける 2003.05.02 かろと
m_pParentWnd->PrintPreviewModeONOFF();
return;
}
/*! 印刷/印刷プレビュー ヘッダの描画
*/
void CPrintPreview::DrawHeader( HDC hdc, RECT& rect, HFONT hFontZen )
{
/* ヘッダ */
const int nHeaderWorkLen = 1024;
char szHeaderWork[1024 + 1];
/* 左寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szHeaderForm[POS_LEFT], szHeaderWork, nHeaderWorkLen);
Print_DrawLine( hdc,
rect.left,
rect.top,
szHeaderWork, lstrlen( szHeaderWork ),
hFontZen
);
/* 中央寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szHeaderForm[POS_CENTER], szHeaderWork, nHeaderWorkLen);
Print_DrawLine( hdc,
( rect.right + rect.left - lstrlen( szHeaderWork ) * m_pPrintSetting->m_nPrintFontWidth) / 2,
rect.top,
szHeaderWork, lstrlen( szHeaderWork ),
hFontZen
);
/* 右寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szHeaderForm[POS_RIGHT], szHeaderWork, nHeaderWorkLen);
Print_DrawLine( hdc,
rect.right - lstrlen( szHeaderWork ) * m_pPrintSetting->m_nPrintFontWidth,
rect.top,
szHeaderWork, lstrlen( szHeaderWork ),
hFontZen
);
}
/*! 印刷/印刷プレビュー フッタの描画
*/
void CPrintPreview::DrawFooter( HDC hdc, RECT& rect, HFONT hFontZen )
{
/* フッタ */
const int nFooterWorkLen = 1024;
char szFooterWork[1024 + 1];
/* 左寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szFooterForm[POS_LEFT], szFooterWork, nFooterWorkLen);
// 左寄せx座標
Print_DrawLine( hdc,
rect.left,
rect.bottom + m_pPrintSetting->m_nPrintFontHeight,
szFooterWork, lstrlen( szFooterWork ),
hFontZen
);
/* 中央寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szFooterForm[POS_CENTER], szFooterWork, nFooterWorkLen);
Print_DrawLine( hdc,
( rect.right + rect.left - lstrlen( szFooterWork ) * m_pPrintSetting->m_nPrintFontWidth) / 2,
rect.bottom + m_pPrintSetting->m_nPrintFontHeight,
szFooterWork, lstrlen( szFooterWork ),
hFontZen
);
/* 右寄せ */
m_pParentWnd->m_cEditDoc.ExpandParameter(m_pPrintSetting->m_szFooterForm[POS_RIGHT], szFooterWork, nFooterWorkLen);
Print_DrawLine( hdc,
rect.right - lstrlen( szFooterWork ) * m_pPrintSetting->m_nPrintFontWidth,
rect.bottom + m_pPrintSetting->m_nPrintFontHeight,
szFooterWork, lstrlen( szFooterWork ),
hFontZen
);
}
/* 印刷/印刷プレビュー ページテキストの描画
DrawPageTextでは、行番号を(半角フォントで)印刷。
本文はPrint_DrawLineにお任せ
*/
void CPrintPreview::DrawPageText(
HDC hdc,
int nOffX,
int nOffY,
int nPageNum,
HFONT hFontZen,
CDlgCancel* pCDlgCancel
)
{
int nDirectY = -1;
int nLineCols;
const char* pLine;
int nLineLen;
TEXTMETRIC tm;
int nLineHeight = m_pPrintSetting->m_nPrintFontHeight + ( m_pPrintSetting->m_nPrintFontHeight * m_pPrintSetting->m_nPrintLineSpacing / 100 );
/* 半角フォントの情報を取得&半角フォントに設定 */
::GetTextMetrics( hdc, &tm );
int nAscentHan = tm.tmAscent;
int nDan; // 段数カウンタ
int i; // 行数カウンタ
for( nDan = 0; nDan < m_pPrintSetting->m_nPrintDansuu; ++nDan ){
for( i = 0; i < m_bPreview_EnableLines; ++i ){
if( NULL != pCDlgCancel ){
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( pCDlgCancel->m_hWnd ) ){
return;
}
}
/* 現在描画しようとしている行の物理行数(折り返しごとにカウントした行数)
関係するものは、
「ページ数(nPageNum)」
「段数(m_pPrintSetting->m_nPrintDansuu)」
「段数が1のときに、1ページあたりに何行入るか(m_bPreview_EnableLines)」
*/
int nLineNum = nPageNum * ( m_bPreview_EnableLines * m_pPrintSetting->m_nPrintDansuu ) + m_bPreview_EnableLines * nDan + i;
pLine = m_pLayoutMgr_Print->GetLineStr( nLineNum, &nLineLen );
if( NULL == pLine ){
break;
}
/* 行番号を表示するか */
if( m_pPrintSetting->m_bPrintLineNumber ){
char szLineNum[64]; // 行番号を入れる。
/* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
if( m_pParentWnd->m_cEditDoc.GetDocumentAttribute().m_bLineNumIsCRLF ){
/* 論理行番号表示モード */
const CLayout* pcLayout = m_pLayoutMgr_Print->Search( nLineNum );
if( NULL == pcLayout || 0 != pcLayout->m_nOffset ){
strcpy( szLineNum, " " );
}else{
_itoa( pcLayout->m_nLinePhysical + 1, szLineNum, 10 ); /* 対応する論理行番号 */
}
}else{
/* 物理行(レイアウト行)番号表示モード */
_itoa( nLineNum + 1, szLineNum, 10 );
}
/* 行番号区切り 0=なし 1=縦線 2=任意 */
if( 2 == m_pParentWnd->m_cEditDoc.GetDocumentAttribute().m_nLineTermType ){
char szLineTerm[2];
wsprintf( szLineTerm, "%c", m_pParentWnd->m_cEditDoc.GetDocumentAttribute().m_cLineTermChar ); /* 行番号区切り文字 */
strcat( szLineNum, szLineTerm );
}else{
strcat( szLineNum, " " );
}
nLineCols = lstrlen( szLineNum );
::ExtTextOut( hdc,
nOffX +
( m_bPreview_EnableColms * m_pPrintSetting->m_nPrintFontWidth + m_pPrintSetting->m_nPrintDanSpace )
* nDan +
m_nPreview_LineNumberColmns * m_pPrintSetting->m_nPrintFontWidth * (nDan) +
( m_nPreview_LineNumberColmns - nLineCols) * m_pPrintSetting->m_nPrintFontWidth,
nDirectY * ( nOffY + nLineHeight * i + ( m_pPrintSetting->m_nPrintFontHeight - nAscentHan ) ), 0, NULL,
szLineNum, nLineCols, m_pnDx
);
/* 行番号区切り 0=なし 1=縦線 2=任意 */
if( 1 == m_pParentWnd->m_cEditDoc.GetDocumentAttribute().m_nLineTermType ){
::MoveToEx( hdc,
nOffX +
( m_bPreview_EnableColms * m_pPrintSetting->m_nPrintFontWidth + m_pPrintSetting->m_nPrintDanSpace )
* nDan +
m_nPreview_LineNumberColmns * m_pPrintSetting->m_nPrintFontWidth * (nDan) +
( m_nPreview_LineNumberColmns ) * m_pPrintSetting->m_nPrintFontWidth
- (m_pPrintSetting->m_nPrintFontWidth / 2 )
,
nDirectY * ( nOffY + nLineHeight * i ),
NULL );
::LineTo( hdc,
nOffX +
( m_bPreview_EnableColms * m_pPrintSetting->m_nPrintFontWidth + m_pPrintSetting->m_nPrintDanSpace )
* nDan +
m_nPreview_LineNumberColmns * m_pPrintSetting->m_nPrintFontWidth * (nDan) +
( m_nPreview_LineNumberColmns ) * m_pPrintSetting->m_nPrintFontWidth
- (m_pPrintSetting->m_nPrintFontWidth / 2 )
,
nDirectY * ( nOffY + nLineHeight * i + nLineHeight )
);
}
}
if( 0 <= nLineLen - 1 && ( pLine[nLineLen - 1] == CR || pLine[nLineLen - 1] == LF ) ){
nLineLen--;
if( 0 <= nLineLen - 1 && ( pLine[nLineLen - 1] == CR || pLine[nLineLen - 1] == LF ) ){
nLineLen--;
}
}
if( 0 == nLineLen ){
continue;
}
/* 印刷/プレビュー 行描画 */
Print_DrawLine(
hdc,
nOffX + ( m_bPreview_EnableColms * m_pPrintSetting->m_nPrintFontWidth + m_pPrintSetting->m_nPrintDanSpace ) * nDan + m_nPreview_LineNumberColmns * m_pPrintSetting->m_nPrintFontWidth * (nDan + 1),
nDirectY * ( nOffY + nLineHeight * i ),
pLine,
nLineLen,
hFontZen
);
}
}
return;
}
/* 印刷プレビュー スクロールバー初期化 */
void CPrintPreview::InitPreviewScrollBar( void )
{
SCROLLINFO si;
RECT rc;
int cx, cy;
int nToolBarHeight = 0;
if( NULL != m_hwndPrintPreviewBar ){
::GetWindowRect( m_hwndPrintPreviewBar, &rc );
nToolBarHeight = rc.bottom - rc.top;
}
::GetClientRect( m_pParentWnd->m_hWnd, &rc );
cx = rc.right - rc.left;
cy = rc.bottom - rc.top - nToolBarHeight;
if( NULL != m_hwndVScrollBar ){
/* 垂直スクロールバー */
si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
si.nMin = 0;
if( m_nPreview_ViewHeight <= cy - nToolBarHeight ){
si.nMax = cy - nToolBarHeight; /* 全幅 */
si.nPage = cy - nToolBarHeight; /* 表示域の桁数 */
si.nPos = -1 * m_nPreviewVScrollPos; /* 表示域の一番左の位置 */
si.nTrackPos = 0;
m_SCROLLBAR_VERT = FALSE;
}else{
si.nMax = m_nPreview_ViewHeight; /* 全幅 */
si.nPage = cy - nToolBarHeight; /* 表示域の桁数 */
si.nPos = -1 * m_nPreviewVScrollPos; /* 表示域の一番左の位置 */
si.nTrackPos = 100;
m_SCROLLBAR_VERT = TRUE;
}
::SetScrollInfo( m_hwndVScrollBar, SB_CTL, &si, TRUE );
}
/* 印刷プレビュー 水平スクロールバーウィンドウハンドル */
if( NULL != m_hwndHScrollBar ){
si.cbSize = sizeof( si );
si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
/* 水平スクロールバー */
// si.cbSize = sizeof( si );
// si.fMask = SIF_ALL;
si.nMin = 0;
if( m_nPreview_ViewWidth <= cx ){
si.nMax = cx; /* 全幅 */
si.nPage = cx; /* 表示域の桁数 */
si.nPos = m_nPreviewHScrollPos; /* 表示域の一番左の位置 */
si.nTrackPos = 0;
m_SCROLLBAR_HORZ = FALSE;
}else{
si.nMax = m_nPreview_ViewWidth; /* 全幅 */
si.nPage = cx; /* 表示域の桁数 */
si.nPos = m_nPreviewHScrollPos; /* 表示域の一番左の位置 */
si.nTrackPos = 100;
m_SCROLLBAR_HORZ = TRUE;
}
::SetScrollInfo( m_hwndHScrollBar, SB_CTL, &si, TRUE );
}
return;
}
/* 印刷/プレビュー 行描画 */
void CPrintPreview::Print_DrawLine(
HDC hdc,
int x,
int y,
const char* pLine,
int nLineLen,
HFONT hFontZen
)
{
#define MODE_SINGLEBYTE 1
#define MODE_DOUBLEBYTE 2
int nCharChars;
int nPreviousChars = MODE_SINGLEBYTE;
TEXTMETRIC tm;
/* 全角文字のアセント(文字高)を取得 */
HFONT hFontHan = (HFONT)::SelectObject( hdc, hFontZen );
::GetTextMetrics( hdc, &tm );
int nAscentZen = tm.tmAscent;
/* 半角文字のアセント(文字高)を取得 */
// 半角文字用フォントが選択されていることを期待している。
::SelectObject( hdc, hFontHan );
::GetTextMetrics( hdc, &tm );
int nAscentHan = tm.tmAscent;
/* pLineをスキャンして、半角文字は半角文字でまとめて、全角文字は全角文字でまとめて描画する。
*/
int nPosX = 0; // TABを展開した後のバイト数で、テキストの何バイト目まで描画したか?
int nBgn = 0; // TABを展開する前のバイト数で、pLineの何バイト目まで描画したか?
int i; // pLineの何文字目をスキャン?
// Sep. 23, 2002 genta LayoutMgrの値を使う
int nTabSpace = m_pParentWnd->m_cEditDoc.m_cLayoutMgr.GetTabSpace();
for( i = 0; i < nLineLen; ++i ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -