⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cprintpreview.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	::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 + -