📄 wordpvw.cpp
字号:
// wordpvw.cpp : implementation of the CWordPadView class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "wordpad.h"
#include "cntritem.h"
#include "srvritem.h"
#include "wordpdoc.h"
#include "wordpvw.h"
#include "formatta.h"
#include "datedial.h"
#include "formatpa.h"
#include "formatba.h"
#include "ruler.h"
#include "strings.h"
#include "colorlis.h"
#include "pageset.h"
#include <penwin.h>
#pragma warning(disable : 4996) // disable bogus deprecation warning
extern CLIPFORMAT cfEmbeddedObject;
extern CLIPFORMAT cfRTO;
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
BOOL CCharFormat::operator==(CCharFormat& cf)
{
return
dwMask == cf.dwMask
&& dwEffects == cf.dwEffects
&& yHeight == cf.yHeight
&& yOffset == cf.yOffset
&& crTextColor == cf.crTextColor
&& bPitchAndFamily == cf.bPitchAndFamily
#if _MFC_VER > 0x700
&& (_tcscmp(szFaceName, cf.szFaceName) == 0);
#else
&& (lstrcmpA(szFaceName, cf.szFaceName) == 0);
#endif
}
BOOL CParaFormat::operator==(PARAFORMAT& pf)
{
if(
dwMask != pf.dwMask
|| wNumbering != pf.wNumbering
|| wReserved != pf.wReserved
|| dxStartIndent != pf.dxStartIndent
|| dxRightIndent != pf.dxRightIndent
|| dxOffset != pf.dxOffset
|| cTabCount != pf.cTabCount
)
{
return FALSE;
}
for (int i=0;i<pf.cTabCount;i++)
{
if (rgxTabs[i] != pf.rgxTabs[i])
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CWordPadView
IMPLEMENT_DYNCREATE(CWordPadView, CRichEditView)
//WM_SETTINGCHANGE -- default printer might have changed
//WM_FONTCHANGE -- pool of fonts changed
//WM_DEVMODECHANGE -- printer settings changes
BEGIN_MESSAGE_MAP(CWordPadView, CRichEditView)
ON_COMMAND(ID_CANCEL_EDIT_CNTR, OnCancelEditCntr)
ON_COMMAND(ID_CANCEL_EDIT_SRVR, OnCancelEditSrvr)
//{{AFX_MSG_MAP(CWordPadView)
ON_COMMAND(ID_PAGE_SETUP, OnPageSetup)
ON_COMMAND(ID_CHAR_BOLD, OnCharBold)
ON_UPDATE_COMMAND_UI(ID_CHAR_BOLD, OnUpdateCharBold)
ON_COMMAND(ID_CHAR_ITALIC, OnCharItalic)
ON_UPDATE_COMMAND_UI(ID_CHAR_ITALIC, OnUpdateCharItalic)
ON_COMMAND(ID_CHAR_UNDERLINE, OnCharUnderline)
ON_UPDATE_COMMAND_UI(ID_CHAR_UNDERLINE, OnUpdateCharUnderline)
ON_COMMAND(ID_PARA_CENTER, OnParaCenter)
ON_UPDATE_COMMAND_UI(ID_PARA_CENTER, OnUpdateParaCenter)
ON_COMMAND(ID_PARA_LEFT, OnParaLeft)
ON_UPDATE_COMMAND_UI(ID_PARA_LEFT, OnUpdateParaLeft)
ON_COMMAND(ID_PARA_RIGHT, OnParaRight)
ON_UPDATE_COMMAND_UI(ID_PARA_RIGHT, OnUpdateParaRight)
ON_WM_CREATE()
ON_COMMAND(ID_INSERT_DATE_TIME, OnInsertDateTime)
ON_COMMAND(ID_FORMAT_PARAGRAPH, OnFormatParagraph)
ON_COMMAND(ID_FORMAT_TABS, OnFormatTabs)
ON_COMMAND(ID_COLOR16, OnColorDefault)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_MEASUREITEM()
ON_COMMAND(ID_PEN_BACKSPACE, OnPenBackspace)
ON_COMMAND(ID_PEN_NEWLINE, OnPenNewline)
ON_COMMAND(ID_PEN_PERIOD, OnPenPeriod)
ON_COMMAND(ID_PEN_SPACE, OnPenSpace)
ON_WM_SIZE()
ON_WM_KEYDOWN()
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, OnFilePrint)
ON_WM_DROPFILES()
ON_COMMAND(ID_PEN_LENS, OnPenLens)
ON_COMMAND(ID_PEN_TAB, OnPenTab)
ON_WM_PALETTECHANGED()
ON_WM_QUERYNEWPALETTE()
ON_WM_SETTINGCHANGE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_INSERT_BULLET, CRichEditView::OnBullet)
ON_UPDATE_COMMAND_UI(ID_INSERT_BULLET, CRichEditView::OnUpdateBullet)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRichEditView::OnFilePrintPreview)
ON_COMMAND_RANGE(ID_COLOR0, ID_COLOR16, OnColorPick)
ON_EN_CHANGE(AFX_IDW_PANE_FIRST, OnEditChange)
ON_WM_MOUSEACTIVATE()
ON_REGISTERED_MESSAGE(CWordPadApp::m_nPrinterChangedMsg, OnPrinterChangedMsg)
ON_NOTIFY(FN_GETFORMAT, ID_VIEW_FORMATBAR, OnGetCharFormat)
ON_NOTIFY(FN_SETFORMAT, ID_VIEW_FORMATBAR, OnSetCharFormat)
ON_NOTIFY(NM_SETFOCUS, ID_VIEW_FORMATBAR, OnBarSetFocus)
ON_NOTIFY(NM_KILLFOCUS, ID_VIEW_FORMATBAR, OnBarKillFocus)
ON_NOTIFY(NM_RETURN, ID_VIEW_FORMATBAR, OnBarReturn)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWordPadView construction/destruction
CWordPadView::CWordPadView()
{
m_bSyncCharFormat = m_bSyncParaFormat = TRUE;
m_uTimerID = 0;
m_bDelayUpdateItems = FALSE;
m_bOnBar = FALSE;
m_bInPrint = FALSE;
m_nPasteType = 0;
m_rectMargin = theApp.m_rectPageMargin;
}
BOOL CWordPadView::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bRes = CRichEditView::PreCreateWindow(cs);
cs.style |= ES_SELECTIONBAR;
return bRes;
}
/////////////////////////////////////////////////////////////////////////////
// CWordPadView attributes
BOOL CWordPadView::IsFormatText()
{
// this function checks to see if any formatting is not default text
BOOL bRes = FALSE;
CHARRANGE cr;
CCharFormat cf;
CParaFormat pf;
GetRichEditCtrl().GetSel(cr);
GetRichEditCtrl().HideSelection(TRUE, FALSE);
GetRichEditCtrl().SetSel(0,-1);
if (!(GetRichEditCtrl().GetSelectionType() & (SEL_OBJECT|SEL_MULTIOBJECT)))
{
GetRichEditCtrl().GetSelectionCharFormat(cf);
if (cf == m_defTextCharFormat)
{
GetRichEditCtrl().GetParaFormat(pf);
if (pf == m_defParaFormat) //compared using CParaFormat::operator==
bRes = TRUE;
}
}
GetRichEditCtrl().SetSel(cr);
GetRichEditCtrl().HideSelection(FALSE, FALSE);
return bRes;
}
HMENU CWordPadView::GetContextMenu(WORD, LPOLEOBJECT, CHARRANGE* )
{
CRichEditCntrItem* pItem = GetSelectedItem();
if (pItem == NULL || !pItem->IsInPlaceActive())
{
CMenu menuText;
menuText.LoadMenu(IDR_TEXT_POPUP);
CMenu* pMenuPopup = menuText.GetSubMenu(0);
menuText.RemoveMenu(0, MF_BYPOSITION);
if (!GetSystemMetrics(SM_PENWINDOWS))
{
//delete pen specific stuff
// remove Insert Keystrokes
pMenuPopup->DeleteMenu(ID_PEN_LENS, MF_BYCOMMAND);
int nIndex = pMenuPopup->GetMenuItemCount()-1; //index of last item
// remove Edit Text...
pMenuPopup->DeleteMenu(nIndex, MF_BYPOSITION);
// remove separator
pMenuPopup->DeleteMenu(nIndex-1, MF_BYPOSITION);
}
return pMenuPopup->Detach();
}
return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CWordPadView operations
void CWordPadView::WrapChanged()
{
CWaitCursor wait;
CFrameWnd* pFrameWnd = GetParentFrame();
ASSERT(pFrameWnd != NULL);
pFrameWnd->SetMessageText(IDS_FORMATTING);
CWnd* pBarWnd = pFrameWnd->GetMessageBar();
if (pBarWnd != NULL)
pBarWnd->UpdateWindow();
CRichEditView::WrapChanged();
pFrameWnd->SetMessageText(AFX_IDS_IDLEMESSAGE);
if (pBarWnd != NULL)
pBarWnd->UpdateWindow();
}
void CWordPadView::SetUpdateTimer()
{
if (m_uTimerID != 0) // if outstanding timer kill it
KillTimer(m_uTimerID);
m_uTimerID = SetTimer(1, 1000, NULL); //set a timer for 1000 milliseconds
if (m_uTimerID == 0) // no timer available so force update now
GetDocument()->UpdateAllItems(NULL);
else
m_bDelayUpdateItems = TRUE;
}
void CWordPadView::DeleteContents()
{
ASSERT_VALID(this);
ASSERT(m_hWnd != NULL);
CRichEditView::DeleteContents();
SetDefaultFont(IsTextType(GetDocument()->m_nNewDocType));
}
void CWordPadView::SetDefaultFont(BOOL bText)
{
ASSERT_VALID(this);
ASSERT(m_hWnd != NULL);
m_bSyncCharFormat = m_bSyncParaFormat = TRUE;
CHARFORMAT* pCharFormat = bText ? &m_defTextCharFormat : &m_defCharFormat;
// set the default character format -- the FALSE makes it the default
GetRichEditCtrl().SetSel(0,-1);
GetRichEditCtrl().SetDefaultCharFormat(*pCharFormat);
GetRichEditCtrl().SetSelectionCharFormat(*pCharFormat);
GetRichEditCtrl().SetParaFormat(m_defParaFormat);
GetRichEditCtrl().SetSel(0,0);
GetRichEditCtrl().EmptyUndoBuffer();
GetRichEditCtrl().SetModify(FALSE);
ASSERT_VALID(this);
}
/////////////////////////////////////////////////////////////////////////////
// CWordPadView drawing
/////////////////////////////////////////////////////////////////////////////
// CWordPadView printing
void CWordPadView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CRichEditView::OnPrint(pDC, pInfo);
if (pInfo != NULL && pInfo->m_bPreview)
DrawMargins(pDC);
}
void CWordPadView::DrawMargins(CDC* pDC)
{
if (pDC->m_hAttribDC != NULL)
{
CRect rect;
rect.left = m_rectMargin.left;
rect.right = m_sizePaper.cx - m_rectMargin.right;
rect.top = m_rectMargin.top;
rect.bottom = m_sizePaper.cy - m_rectMargin.bottom;
//rect in twips
int logx = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSX);
int logy = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY);
rect.left = MulDiv(rect.left, logx, 1440);
rect.right = MulDiv(rect.right, logx, 1440);
rect.top = MulDiv(rect.top, logy, 1440);
rect.bottom = MulDiv(rect.bottom, logy, 1440);
CPen pen(PS_DOT, 0, pDC->GetTextColor());
CPen* ppen = pDC->SelectObject(&pen);
pDC->MoveTo(0, rect.top);
pDC->LineTo(10000, rect.top);
pDC->MoveTo(rect.left, 0);
pDC->LineTo(rect.left, 10000);
pDC->MoveTo(0, rect.bottom);
pDC->LineTo(10000, rect.bottom);
pDC->MoveTo(rect.right, 0);
pDC->LineTo(rect.right, 10000);
pDC->SelectObject(ppen);
}
}
BOOL CWordPadView::OnPreparePrinting(CPrintInfo* pInfo)
{
return DoPreparePrinting(pInfo);
}
/////////////////////////////////////////////////////////////////////////////
// OLE Client support and commands
inline int roundleast(int n)
{
int mod = n%10;
n -= mod;
if (mod >= 5)
n += 10;
else if (mod <= -5)
n -= 10;
return n;
}
static void RoundRect(LPRECT r1)
{
r1->left = roundleast(r1->left);
r1->right = roundleast(r1->right);
r1->top = roundleast(r1->top);
r1->bottom = roundleast(r1->bottom);
}
static void MulDivRect(LPRECT r1, LPRECT r2, int num, int div)
{
r1->left = MulDiv(r2->left, num, div);
r1->top = MulDiv(r2->top, num, div);
r1->right = MulDiv(r2->right, num, div);
r1->bottom = MulDiv(r2->bottom, num, div);
}
void CWordPadView::OnPageSetup()
{
CPageSetupDialog dlg;
PAGESETUPDLG& psd = dlg.m_psd;
BOOL bMetric = theApp.GetUnits() == 1; //centimeters
psd.Flags |= PSD_MARGINS | (bMetric ? PSD_INHUNDREDTHSOFMILLIMETERS :
PSD_INTHOUSANDTHSOFINCHES);
int nUnitsPerInch = bMetric ? 2540 : 1000;
MulDivRect(&psd.rtMargin, m_rectMargin, nUnitsPerInch, 1440);
RoundRect(&psd.rtMargin);
// get the current device from the app
PRINTDLG pd;
pd.hDevNames = NULL;
pd.hDevMode = NULL;
theApp.GetPrinterDeviceDefaults(&pd);
psd.hDevNames = pd.hDevNames;
psd.hDevMode = pd.hDevMode;
if (dlg.DoModal() == IDOK)
{
RoundRect(&psd.rtMargin);
MulDivRect(m_rectMargin, &psd.rtMargin, 1440, nUnitsPerInch);
theApp.m_rectPageMargin = m_rectMargin;
theApp.SelectPrinter(psd.hDevNames, psd.hDevMode);
theApp.NotifyPrinterChanged();
}
// PageSetupDlg failed
if (CommDlgExtendedError() != 0)
{
CPageSetupDlg dlg;
dlg.m_nBottomMargin = m_rectMargin.bottom;
dlg.m_nLeftMargin = m_rectMargin.left;
dlg.m_nRightMargin = m_rectMargin.right;
dlg.m_nTopMargin = m_rectMargin.top;
if (dlg.DoModal() == IDOK)
{
m_rectMargin.SetRect(dlg.m_nLeftMargin, dlg.m_nTopMargin,
dlg.m_nRightMargin, dlg.m_nBottomMargin);
// m_page will be changed at this point
theApp.m_rectPageMargin = m_rectMargin;
theApp.NotifyPrinterChanged();
}
}
}
/////////////////////////////////////////////////////////////////////////////
// OLE Server support
// The following command handler provides the standard keyboard
// user interface to cancel an in-place editing session. Here,
// the server (not the container) causes the deactivation.
void CWordPadView::OnCancelEditSrvr()
{
GetDocument()->OnDeactivateUI(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// CWordPadView diagnostics
#ifdef _DEBUG
void CWordPadView::AssertValid() const
{
CRichEditView::AssertValid();
}
void CWordPadView::Dump(CDumpContext& dc) const
{
CRichEditView::Dump(dc);
}
CWordPadDoc* CWordPadView::GetDocument() // non-debug version is inline
{
return (CWordPadDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CWordPadView message helpers
/////////////////////////////////////////////////////////////////////////////
// CWordPadView message handlers
int CWordPadView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CRichEditView::OnCreate(lpCreateStruct) == -1)
return -1;
theApp.m_listPrinterNotify.AddTail(m_hWnd);
if (theApp.m_bWordSel)
GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_AUTOWORDSELECTION);
else
GetRichEditCtrl().SetOptions(ECOOP_AND, ~(DWORD)ECO_AUTOWORDSELECTION);
// GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_SELECTIONBAR);
GetDefaultFont(m_defTextCharFormat, IDS_DEFAULTTEXTFONT);
GetDefaultFont(m_defCharFormat, IDS_DEFAULTFONT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -