📄 cprintpreview.cpp
字号:
nNewPos = 0;
}else
if( nNewPos > (int)(si.nMax - si.nPage + 1) ){
nNewPos = (int)(si.nMax - si.nPage + 1);
}
nMove = nNowPos - nNewPos;
nPreviewHScrollPos = nNewPos;
if( nPreviewHScrollPos != m_nPreviewHScrollPos ){
::SetScrollPos( hwndScrollBar, SB_CTL, nNewPos, TRUE);
m_nPreviewHScrollPos = nPreviewHScrollPos;
/* 描画 */
::ScrollWindowEx( m_pParentWnd->m_hWnd, nMove, 0, NULL, NULL, NULL , NULL, SW_ERASE | SW_INVALIDATE );
}
return 0;
}
LRESULT CPrintPreview::OnMouseMove( WPARAM wParam, LPARAM lParam )
{
/* 手カーソル */
::SetCursor( ::LoadCursor( m_pParentWnd->m_hInstance, MAKEINTRESOURCE( IDC_CURSOR_HAND ) ) );
if( !m_pParentWnd->m_bDragMode ){
return 0;
}
// WPARAM fwKeys = wParam; // key flags
int xPos = LOWORD( lParam ); // horizontal position of cursor
int yPos = HIWORD( lParam ); // vertical position of cursor
RECT rc;
GetClientRect( m_pParentWnd->m_hWnd, &rc );
POINT po;
po.x = xPos;
po.y = yPos;
if( !PtInRect( &rc, po ) ){ // プレビュー内かチェック。
return 0;
}
// Y軸
SCROLLINFO siV;
siV.cbSize = sizeof( SCROLLINFO );
siV.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
GetScrollInfo( m_hwndVScrollBar, SB_CTL, (SCROLLINFO*)&siV );
int nMoveY;
if( m_SCROLLBAR_VERT ){
int nNowPosY = GetScrollPos( m_hwndVScrollBar, SB_CTL );
nMoveY = m_pParentWnd->m_nDragPosOrgY - yPos;
int nNewPosY = nNowPosY + nMoveY;
if( nNewPosY < 0 ){
nNewPosY = 0;
}else
if( nNewPosY > (int)(siV.nMax - siV.nPage + 1) ){
nNewPosY = (int)(siV.nMax - siV.nPage + 1);
}
nMoveY = nNowPosY - nNewPosY;
SetScrollPos( m_hwndVScrollBar, SB_CTL, nNewPosY, TRUE );
m_nPreviewVScrollPos = -1 * nNewPosY;
}else{
nMoveY = 0;
}
// X軸
SCROLLINFO siH;
siH.cbSize = sizeof( SCROLLINFO );
siH.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
GetScrollInfo( m_hwndHScrollBar, SB_CTL, (SCROLLINFO*)&siH );
int nMoveX;
if( m_SCROLLBAR_HORZ ){
int nNowPosX = GetScrollPos( m_hwndHScrollBar, SB_CTL );
nMoveX = m_pParentWnd->m_nDragPosOrgX - xPos;
int nNewPosX = nNowPosX + nMoveX;
if( nNewPosX < 0 ){
nNewPosX = 0;
}else
if( nNewPosX > (int)(siH.nMax - siH.nPage + 1) ){
nNewPosX = (int)(siH.nMax - siH.nPage + 1);
}
nMoveX = nNowPosX - nNewPosX;
SetScrollPos( m_hwndHScrollBar, SB_CTL, nNewPosX, TRUE );
m_nPreviewHScrollPos = nNewPosX;
}else{
nMoveX = 0;
}
m_pParentWnd->m_nDragPosOrgX = xPos;
m_pParentWnd->m_nDragPosOrgY = yPos;
/* 描画 */
ScrollWindowEx( m_pParentWnd->m_hWnd, nMoveX, nMoveY, NULL, NULL, NULL , NULL, SW_ERASE | SW_INVALIDATE );
return 0;
}
LRESULT CPrintPreview::OnMouseWheel( WPARAM wParam, LPARAM lParam )
{
// WORD fwKeys = LOWORD(wParam); // key flags
short zDelta = (short) HIWORD(wParam); // wheel rotation
// short xPos = (short) LOWORD(lParam); // horizontal position of pointer
// short yPos = (short) HIWORD(lParam); // vertical position of pointer
int nScrollCode;
if( 0 < zDelta ){
nScrollCode = SB_LINEUP;
}else{
nScrollCode = SB_LINEDOWN;
}
int i;
for( i = 0; i < 3; ++i ){
/* 印刷プレビュー 垂直スクロールバーメッセージ処理 WM_VSCROLL */
::PostMessage( m_pParentWnd->m_hWnd, WM_VSCROLL, MAKELONG( nScrollCode, 0 ), (LPARAM)m_hwndVScrollBar );
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( NULL ) ){
return -1;
}
}
return 0;
}
void CPrintPreview::OnChangePrintSetting( void )
{
HDC hdc = ::GetDC( m_pParentWnd->m_hWnd );
::SetMapMode( hdc, MM_LOMETRIC ); //MM_HIMETRIC それぞれの論理単位は、0.01 mm にマップされます
::SetMapMode( hdc, MM_ANISOTROPIC );
::EnumFontFamilies(
hdc,
NULL,
(FONTENUMPROC)CPrintPreview::MyEnumFontFamProc,
(LPARAM)this
);
/* 印刷プレビュー表示情報 */
m_nPreview_LineNumberColmns = 0; /* 行番号エリアの幅(文字数) */
/* 行番号を表示するか */
if( m_pPrintSetting->m_bPrintLineNumber ){
/* 行番号表示に必要な桁数を計算 */
m_nPreview_LineNumberColmns = m_pParentWnd->m_cEditDoc.m_cEditViewArr[0].DetectWidthOfLineNumberArea_calculate();
}
/* 現在のページ設定の、用紙サイズと用紙方向を反映させる */
m_pPrintSetting->m_mdmDevMode.dmPaperSize = m_pPrintSetting->m_nPrintPaperSize;
m_pPrintSetting->m_mdmDevMode.dmOrientation = m_pPrintSetting->m_nPrintPaperOrientation;
// 用紙サイズ、用紙方向は変更したのでビットを立てる
m_pPrintSetting->m_mdmDevMode.dmFields |= ( DM_ORIENTATION | DM_PAPERSIZE );
// 用紙の長さ、幅は決まっていないので、ビットを下ろす
m_pPrintSetting->m_mdmDevMode.dmFields &= (~DM_PAPERLENGTH );
m_pPrintSetting->m_mdmDevMode.dmFields &= (~DM_PAPERWIDTH);
/* 印刷/プレビューに必要な情報を取得 */
char szErrMsg[1024];
if( FALSE == m_cPrint.GetPrintMetrics(
&m_pPrintSetting->m_mdmDevMode, /* プリンタ設定 DEVMODE用*/
&m_nPreview_PaperAllWidth, /* 用紙幅 */
&m_nPreview_PaperAllHeight, /* 用紙高さ */
&m_nPreview_PaperWidth, /* 用紙印刷有効幅 */
&m_nPreview_PaperHeight, /* 用紙印刷有効高さ */
&m_nPreview_PaperOffsetLeft, /* 印刷可能位置左端 */
&m_nPreview_PaperOffsetTop, /* 印刷可能位置上端 */
szErrMsg /* エラーメッセージ格納場所 */
) ){
/* エラーの場合、A4縦(210mm×297mm)で初期化 */
m_nPreview_PaperAllWidth = 210 * 10; /* 用紙幅 */
m_nPreview_PaperAllHeight = 297 * 10; /* 用紙高さ */
m_nPreview_PaperWidth = 210 * 10; /* 用紙印刷有効幅 */
m_nPreview_PaperHeight = 297 * 10; /* 用紙印刷有効高さ */
m_nPreview_PaperOffsetLeft = 0; /* 印刷可能位置左端 */
m_nPreview_PaperOffsetTop = 0; /* 印刷可能位置上端 */
// DEVMODE構造体もA4縦で初期化 2003.07.03 かろと
m_pPrintSetting->m_mdmDevMode.dmPaperSize = DMPAPER_A4;
m_pPrintSetting->m_mdmDevMode.dmOrientation = DMORIENT_PORTRAIT;
m_pPrintSetting->m_mdmDevMode.dmPaperLength = m_nPreview_PaperHeight;
m_pPrintSetting->m_mdmDevMode.dmPaperWidth = m_nPreview_PaperWidth;
m_pPrintSetting->m_mdmDevMode.dmFields |= ( DM_ORIENTATION | DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH);
}else{
if( m_pPrintSetting->m_nPrintPaperSize != m_pPrintSetting->m_mdmDevMode.dmPaperSize ){
char szPaperNameOld[256];
char szPaperNameNew[256];
/* 用紙の名前を取得 */
m_cPrint.GetPaperName( m_pPrintSetting->m_nPrintPaperSize , (char*)szPaperNameOld );
m_cPrint.GetPaperName( m_pPrintSetting->m_mdmDevMode.dmPaperSize , (char*)szPaperNameNew );
::MYMESSAGEBOX( m_pParentWnd->m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"現在のプリンタ %s では、\n指定された用紙 %s は使用できません。\n利用可能な用紙 %s に変更しました。",
m_pPrintSetting->m_mdmDevMode.m_szPrinterDeviceName,
szPaperNameOld, szPaperNameNew
);
}
}
/* 現在のページ設定の、用紙サイズと用紙方向を反映させる(エラーでA4縦になった場合も考慮してif文の外へ移動 2003.07.03 かろと) */
m_pPrintSetting->m_nPrintPaperSize = m_pPrintSetting->m_mdmDevMode.dmPaperSize;
m_pPrintSetting->m_nPrintPaperOrientation = m_pPrintSetting->m_mdmDevMode.dmOrientation; // 用紙方向の反映忘れを修正 2003/07/03 かろと
m_nPreview_ViewMarginLeft = 8 * 10; /* 印刷プレビュー:ビュー左端と用紙の間隔(1/10mm単位) */
m_nPreview_ViewMarginTop = 8 * 10; /* 印刷プレビュー:ビュー左端と用紙の間隔(1/10mm単位) */
m_bPreview_EnableColms =
( m_nPreview_PaperAllWidth - m_pPrintSetting->m_nPrintMarginLX - m_pPrintSetting->m_nPrintMarginRX
- ( m_pPrintSetting->m_nPrintDansuu - 1 ) * m_pPrintSetting->m_nPrintDanSpace
- ( m_pPrintSetting->m_nPrintDansuu ) * ( ( m_nPreview_LineNumberColmns /*+ (m_nPreview_LineNumberColmns?1:0)*/ ) * m_pPrintSetting->m_nPrintFontWidth )
) / m_pPrintSetting->m_nPrintFontWidth / m_pPrintSetting->m_nPrintDansuu; /* 印字可能桁数/ページ */
m_bPreview_EnableLines = ( m_nPreview_PaperAllHeight - m_pPrintSetting->m_nPrintMarginTY - m_pPrintSetting->m_nPrintMarginBY ) / ( m_pPrintSetting->m_nPrintFontHeight + ( m_pPrintSetting->m_nPrintFontHeight * m_pPrintSetting->m_nPrintLineSpacing / 100 ) ) - 4; /* 印字可能行数/ページ */
/* 印刷用のレイアウト管理情報の初期化 */
m_pLayoutMgr_Print->Create( &m_pParentWnd->m_cEditDoc, &m_pParentWnd->m_cEditDoc.m_cDocLineMgr );
/* 印刷用のレイアウト情報の変更 */
// Types& ref = m_pParentWnd->m_cEditDoc.GetDocumentAttribute();
Types ref = m_pParentWnd->m_cEditDoc.GetDocumentAttribute();
ref.m_nMaxLineSize = m_bPreview_EnableColms;
ref.m_bWordWrap = m_pPrintSetting->m_bPrintWordWrap; /* 英文ワードラップをする */
// Sep. 23, 2002 genta LayoutMgrの値を使う
ref.m_nTabSpace = m_pParentWnd->m_cEditDoc.m_cLayoutMgr.GetTabSpace();
//@@@ 2002.09.22 YAZAKI
ref.m_cLineComment.CopyTo(0, "", -1); /* 行コメントデリミタ */
ref.m_cLineComment.CopyTo(1, "", -1); /* 行コメントデリミタ2 */
ref.m_cLineComment.CopyTo(2, "", -1); /* 行コメントデリミタ3 */ //Jun. 01, 2001 JEPRO 追加
ref.m_cBlockComment.CopyTo(0, "", ""); /* ブロックコメントデリミタ */
ref.m_cBlockComment.CopyTo(1, "", ""); /* ブロックコメントデリミタ2 */
ref.m_nStringType = 0; /* 文字列区切り記号エスケープ方法 0=[\"][\'] 1=[""][''] */
ref.m_ColorInfoArr[COLORIDX_SSTRING].m_bDisp = FALSE;
ref.m_ColorInfoArr[COLORIDX_WSTRING].m_bDisp = FALSE;
ref.m_bKinsokuHead = m_pPrintSetting->m_bPrintKinsokuHead, /* 行頭禁則する */ //@@@ 2002.04.08 MIK
ref.m_bKinsokuTail = m_pPrintSetting->m_bPrintKinsokuTail, /* 行末禁則する */ //@@@ 2002.04.08 MIK
ref.m_bKinsokuRet = m_pPrintSetting->m_bPrintKinsokuRet, /* 改行文字をぶら下げる */ //@@@ 2002.04.13 MIK
ref.m_bKinsokuKuto = m_pPrintSetting->m_bPrintKinsokuKuto, /* 句読点をぶら下げる */ //@@@ 2002.04.17 MIK
m_pLayoutMgr_Print->SetLayoutInfo(
TRUE,
NULL,
ref
);
m_nAllPageNum = m_pLayoutMgr_Print->GetLineCount() / ( m_bPreview_EnableLines * m_pPrintSetting->m_nPrintDansuu ); /* 全ページ数 */
if( 0 < m_pLayoutMgr_Print->GetLineCount() % ( m_bPreview_EnableLines * m_pPrintSetting->m_nPrintDansuu ) ){
m_nAllPageNum++;
}
if( m_nAllPageNum <= m_nCurPageNum ){ /* 現在のページ */
m_nCurPageNum = 0;
}
int i;
for( i = 0; i < ( sizeof( m_pnDx ) / sizeof( m_pnDx[0]) ); ++i ){
m_pnDx[i] = m_pPrintSetting->m_nPrintFontWidth;
}
/* WM_SIZE 処理 */
RECT rc;
::GetClientRect( m_pParentWnd->m_hWnd, &rc );
OnSize( SIZE_RESTORED, MAKELONG( rc.right - rc.left, rc.bottom - rc.top ) );
::ReleaseDC( m_pParentWnd->m_hWnd, hdc );
/* プレビュー ページ指定 */
OnPreviewGoPage( m_nCurPageNum );
return;
}
void CPrintPreview::OnPreviewGoPage( int nPage )
{
if( m_nAllPageNum <= nPage ){ /* 現在のページ */
nPage = m_nAllPageNum - 1;
}
if( 0 > nPage ){ /* 現在のページ */
nPage = 0;
}
m_nCurPageNum = nPage;
if( 0 == m_nCurPageNum ){
// 最初のページのときは、前のページボタンをオフ。
// Jul. 18, 2001 genta FocusのあるWindowをDisableにすると操作できなくなるのを回避
::SetFocus( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_NEXTPAGE ));
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_PREVPAGE ), FALSE );
}else{
// 前のページボタンをオン
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_PREVPAGE ), TRUE );
}
if( m_nAllPageNum <= m_nCurPageNum + 1 ){
// 最後のページのときは、次のページボタンをオフ。
// Jul. 18, 2001 genta FocusのあるWindowをDisableにすると操作できなくなるのを回避
// Mar. 9, 2003 genta 1ページしか無いときは「前へ」ボタンもDisableされているので、
// 最後のページまで達したら「戻る」にフォーカスを移すように
::SetFocus( ::GetDlgItem( m_hwndPrintPreviewBar, IDCANCEL ));
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_NEXTPAGE ), FALSE );
}else{
// 次のページボタンをオン。
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_NEXTPAGE ), TRUE );
}
char szEdit[1024];
wsprintf( szEdit, "%d/%d頁", m_nCurPageNum + 1, m_nAllPageNum );
::SetDlgItemText( m_hwndPrintPreviewBar, IDC_STATIC_PAGENUM, szEdit );
wsprintf( szEdit, "%d %%", m_nPreview_Zoom );
::SetDlgItemText( m_hwndPrintPreviewBar, IDC_STATIC_ZOOM, szEdit );
::InvalidateRect( m_pParentWnd->m_hWnd, NULL, TRUE );
return;
}
void CPrintPreview::OnPreviewZoom( BOOL bZoomUp )
{
if( bZoomUp ){
m_nPreview_Zoom += 10; /* 印刷プレビュー倍率 */
if( MAX_PREVIEW_ZOOM < m_nPreview_Zoom ){
m_nPreview_Zoom = MAX_PREVIEW_ZOOM;
}
}else{
/* スクロール位置を調整 */
m_nPreviewVScrollPos = 0;
m_nPreviewHScrollPos = 0;
m_nPreview_Zoom -= 10; /* 印刷プレビュー倍率 */
if( MIN_PREVIEW_ZOOM > m_nPreview_Zoom ){
m_nPreview_Zoom = MIN_PREVIEW_ZOOM;
}
}
// 縮小ボタンのON/OFF
if( MIN_PREVIEW_ZOOM == m_nPreview_Zoom ){
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_ZOOMDOWN ), FALSE );
}else{
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_ZOOMDOWN ), TRUE );
}
// 拡大ボタンのON/OFF
if( MAX_PREVIEW_ZOOM == m_nPreview_Zoom ){
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_ZOOMUP ), FALSE );
}else{
::EnableWindow( ::GetDlgItem( m_hwndPrintPreviewBar, IDC_BUTTON_ZOOMUP ), TRUE );
}
char szEdit[1024];
wsprintf( szEdit, "%d %%", m_nPreview_Zoom );
::SetDlgItemText( m_hwndPrintPreviewBar, IDC_STATIC_ZOOM, szEdit );
/* WM_SIZE 処理 */
RECT rc1;
::GetClientRect( m_pParentWnd->m_hWnd, &rc1 );
OnSize( SIZE_RESTORED, MAKELONG( rc1.right - rc1.left, rc1.bottom - rc1.top ) );
/* 印刷プレビュー スクロールバー初期化 */
InitPreviewScrollBar();
/* 再描画 */
::InvalidateRect( m_pParentWnd->m_hWnd, NULL, TRUE );
return;
}
void CPrintPreview::OnPrint( void )
{
HDC hdc;
char szJobName[256 + 1];
char szProgress[100];
char szErrMsg[1024];
int nDirectY = -1;
int i;
HFONT hFontOld; // OnPrint以前のフォント
HFONT hFontHan; // 印刷用半角フォント
HFONT hFontZen; // 印刷用全角フォント
if( 0 == m_nAllPageNum ){
::MYMESSAGEBOX( m_pParentWnd->m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"印刷するページがありません。"
);
return;
}
/* プリンタに渡すジョブ名を生成 */
if( ! m_pParentWnd->m_cEditDoc.IsFilePathAvailable() ){ /* 現在編集中のファイルのパス */
strcpy( szJobName, "無題" );
}else{
char szFileName[_MAX_FNAME];
char szExt[_MAX_EXT];
_splitpath( m_pParentWnd->m_cEditDoc.GetFilePath(), NULL, NULL, szFileName, szExt );
wsprintf( szJobName, "%s%s", szFileName, szExt );
}
/* 印刷範囲を指定できるプリンタダイアログを作成 */
// 2003.05.02 かろと
PRINTDLG pd;
memset( &pd, 0, sizeof(PRINTDLG) );
#ifndef _DEBUG
// Debugモードで、hwndOwnerを指定すると、Win2000では落ちるので???
pd.hwndOwner = m_pParentWnd->m_hWnd;
#endif
pd.nMinPage = 1;
pd.nMaxPage = m_nAllPageNum;
pd.nFromPage = 1;
pd.nToPage = m_nAllPageNum;
pd.Flags = PD_ALLPAGES | PD_NOSELECTION | PD_USEDEVMODECOPIESANDCOLLATE;
if (FALSE == m_cPrint.PrintDlg( &pd, &m_pPrintSetting->m_mdmDevMode )) {
return;
}
// 印刷開始ページと、印刷ページ数を確認
int nFrom;
int nNum;
if( 0 != (pd.Flags & PD_PAGENUMS) ){ // 2003.05.02 かろと
nFrom = pd.nFromPage - 1;
nNum = pd.nToPage - nFrom;
}else{
nFrom = 0;
nNum = m_nAllPageNum;
}
/* 印刷過程を表示して、キャンセルするためのダイアログを作成 */
CDlgCancel cDlgPrinting;
cDlgPrinting.DoModeless( m_pParentWnd->m_hInstance, m_pParentWnd->m_hWnd, IDD_PRINTING );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -