📄 padview.cpp
字号:
void CPadView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// get string to show as "filename" in header/footer
LPCTSTR pszFileName = GetDocument()->GetPathName();
if (pszFileName[0] == 0)
pszFileName = GetDocument()->GetTitle();
// go thru global CPageSetupDlg to format the header and footer
CString strHeader;
dlgPageSetup.FormatHeader(strHeader, m_timeHeader, pszFileName,
pInfo->m_nCurPage);
CString strFooter;
dlgPageSetup.FormatFooter(strFooter, m_timeFooter, pszFileName,
pInfo->m_nCurPage);
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int cyChar = tm.tmHeight;
CRect rectPage = pInfo->m_rectDraw;
// draw and exclude space for header
if (!strHeader.IsEmpty())
{
pDC->TextOut(rectPage.left, rectPage.top, strHeader);
rectPage.top += cyChar + cyChar / 4;
pDC->MoveTo(rectPage.left, rectPage.top);
pDC->LineTo(rectPage.right, rectPage.top);
rectPage.top += cyChar / 4;
}
// allow space for footer
pInfo->m_rectDraw = rectPage;
if (!strFooter.IsEmpty())
pInfo->m_rectDraw.bottom -= cyChar + cyChar/4 + cyChar/4;
// draw body text
CEditView::OnPrint(pDC, pInfo);
// draw footer
if (!strFooter.IsEmpty())
{
rectPage.bottom -= cyChar;
pDC->TextOut(rectPage.left, rectPage.bottom, strFooter);
rectPage.bottom -= cyChar / 4;
pDC->MoveTo(rectPage.left, rectPage.bottom);
pDC->LineTo(rectPage.right, rectPage.bottom);
rectPage.bottom -= cyChar / 4;
}
}
void CPadView::OnScrollTo(CDC*, CPrintInfo* pInfo, POINT)
{
UINT nPage = pInfo->m_nCurPage;
ASSERT(nPage < (UINT)m_aPageStart.GetSize());
if (nPage != m_nPreviewPage)
{
UINT nIndex = m_aPageStart[nPage];
GetEditCtrl().SetSel((int)nIndex, (int)nIndex);
}
}
/////////////////////////////////////////////////////////////////////////////
// CPadView Font Handling
void CPadView::OnChooseFont()
{
// get current font description
CFont* pFont = GetFont();
LOGFONT lf;
if (pFont != NULL)
pFont->GetObject(sizeof(LOGFONT), &lf);
else
::GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
CFontDialog dlg(&lf, CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT);
if (dlg.DoModal() == IDOK)
{
// switch to new font.
m_font.DeleteObject();
if (m_font.CreateFontIndirect(&lf))
{
CWaitCursor wait;
SetFont(&m_font);
m_lfDefFont = lf;
if (GetPrinterFont() == NULL)
{
// notify container that content has changed
GetDocument()->UpdateAllItems(NULL);
}
}
}
}
static void ScaleLogFont(LPLOGFONT plf, const CDC& dcFrom, const CDC& dcTo)
// helper to scale log font member from one DC to another!
{
plf->lfHeight = MulDiv(plf->lfHeight,
dcTo.GetDeviceCaps(LOGPIXELSY), dcFrom.GetDeviceCaps(LOGPIXELSY));
plf->lfWidth = MulDiv(plf->lfWidth,
dcTo.GetDeviceCaps(LOGPIXELSX), dcFrom.GetDeviceCaps(LOGPIXELSX));
}
void CPadView::OnChoosePrintFont()
{
CWaitCursor wait;
CFont* pFont = GetPrinterFont();
LOGFONT lf;
LPLOGFONT plf = NULL;
if (pFont != NULL)
{
pFont->GetObject(sizeof(LOGFONT), &lf);
plf = &lf;
}
// magic to get printer dialog that would be used if we were printing!
CPrintDialog dlgPrint(FALSE);
if (!AfxGetApp()->GetPrinterDeviceDefaults(&dlgPrint.m_pd))
{
AfxMessageBox(IDP_ERR_GET_DEVICE_DEFAULTS);
return;
}
wait.Restore();
HDC hdcPrint = dlgPrint.CreatePrinterDC();
if (hdcPrint == NULL)
{
AfxMessageBox(IDP_ERR_GET_PRINTER_DC);
return;
}
CDC dcScreen;
dcScreen.Attach(::GetDC(NULL));
CDC dcPrint;
dcPrint.Attach(hdcPrint);
if (plf != NULL)
{
// need to map initial logfont to screen metrics.
::ScaleLogFont(plf, dcPrint, dcScreen);
}
// now bring up the dialog since we know the printer DC
CFontDialog dlg(plf, CF_PRINTERFONTS, &dcPrint);
if (dlg.DoModal() == IDOK)
{
// map the resulting logfont back to printer metrics.
lf = dlg.m_lf;
::ScaleLogFont(&lf, dcScreen, dcPrint);
SetPrinterFont(NULL);
m_fontPrint.DeleteObject();
if (m_fontPrint.CreateFontIndirect(&lf))
{
SetPrinterFont(&m_fontPrint);
m_lfDefPrintFont = lf;
// notify container that content has changed
GetDocument()->UpdateAllItems(NULL);
}
}
//NOTE: destructor will call dcPrint.DeleteDC
::ReleaseDC(NULL, dcScreen.Detach());
}
void CPadView::OnMirrorDisplayFont()
{
if (GetPrinterFont() != NULL)
{
SetPrinterFont(NULL);
m_lfDefPrintFont.lfHeight = 0;
// notify container that content changed
GetDocument()->UpdateAllItems(NULL);
}
}
void CPadView::OnUpdateChoosePrintFont(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetPrinterFont() != NULL);
}
void CPadView::OnUpdateMirrorDisplayFont(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetPrinterFont() == NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CPadView Tab Stops
#ifndef _MAC // CEditView::SetTabStops is not supported on the MAC
void CPadView::OnSetTabStops()
{
CSetTabStops dlg;
dlg.m_nTabStops = m_nTabStops/4;
if (dlg.DoModal() == IDOK)
{
CWaitCursor wait;
SetTabStops(dlg.m_nTabStops*4);
m_nDefTabStops = m_nTabStops;
// notify container that content changed
GetDocument()->UpdateAllItems(NULL);
}
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CPadView Word Wrap
void CPadView::OnUpdateWordWrap(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(IsWordWrap());
}
void CPadView::OnWordWrap()
{
CWaitCursor wait;
SetWordWrap(!IsWordWrap());
m_bDefWordWrap = IsWordWrap();
}
/////////////////////////////////////////////////////////////////////////////
// CPadView commands
void CPadView::OnRButtonDown(UINT, CPoint)
{
GetParentFrame()->BringWindowToTop();
}
void CPadView::OnSize(UINT nType, int cx, int cy)
{
CWaitCursor wait;
CEditView::OnSize(nType, cx, cy);
CFrameWnd* pFrameWnd = GetParentFrame();
ASSERT_VALID(pFrameWnd);
if ((pFrameWnd->GetStyle() & WS_VISIBLE) &&
pFrameWnd->IsKindOf(RUNTIME_CLASS(COleIPFrameWnd)))
{
// update the cx part of the extent to the width of the control
COleServerItem* pItem = GetDocument()->GetEmbeddedItem();
// only update if it has actually changed
if ((int)pItem->m_sizeExtent.cx != cx)
{
pItem->m_sizeExtent.cx = cx;
OnEditChange();
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CPadView OLE support
void CPadView::OnEditChange()
{
CEditView::OnEditChange();
if (m_uTimerID != 0) // if outstanding timer kill it
KillTimer(m_uTimerID);
m_uTimerID = SetTimer(1, 200, NULL); //set a timer for 200 milliseconds
if (m_uTimerID == 0) // no timer available so force update now
GetDocument()->UpdateAllItems(NULL);
}
void CPadView::OnEditCopy()
{
CWaitCursor wait;
// get the current selection
UINT nFrom, nTo;
GetEditCtrl().GetSel((int&)nFrom, (int&)nTo);
// what gets copied depends on partial vs. full selection
if ((nFrom == 0 && nTo == (UINT)GetWindowTextLength()))
{
// copy entire document to the clipboard
GetDocument()->GetEmbeddedItem()->CopyToClipboard(TRUE);
}
else
{
// copy linked item to clipboard
CPadLinkItem item(GetDocument(), nFrom, nTo);
item.CopyToClipboard(TRUE);
}
}
void CPadView::OnEditCut()
{
OnEditCopy();
CEditView::OnEditCut();
}
void CPadView::OnTimer(UINT nIDEvent)
{
if (m_uTimerID != nIDEvent) // not our timer
{
CEditView::OnTimer(nIDEvent);
return;
}
KillTimer(m_uTimerID); // kill one-shot timer
m_uTimerID = 0;
GetDocument()->UpdateAllItems(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CPadView diagnostics
#ifdef _DEBUG
void CPadView::AssertValid() const
{
CEditView::AssertValid();
}
void CPadView::Dump(CDumpContext& dc) const
{
CEditView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -