📄 wordpvw.cpp
字号:
GetRichEditCtrl().GetParaFormat(m_defParaFormat);
m_defParaFormat.cTabCount = 0;
return 0;
}
void CWordPadView::GetDefaultFont(CCharFormat& cf, UINT nFontNameID)
{
USES_CONVERSION;
CString strDefFont;
VERIFY(strDefFont.LoadString(nFontNameID));
//ASSERT(cf.cbSize == sizeof(CHARFORMAT));
cf.dwMask = CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_SIZE|
CFM_COLOR|CFM_OFFSET|CFM_PROTECTED;
cf.dwEffects = CFE_AUTOCOLOR;
cf.yHeight = 240; //12pt
cf.yOffset = 0;
cf.crTextColor = RGB(0, 0, 0);
cf.bCharSet = 0;
cf.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
ASSERT(strDefFont.GetLength() < LF_FACESIZE);
#if _MFC_VER > 0x700
_tcsncpy(cf.szFaceName, strDefFont, LF_FACESIZE);
#else
lstrcpynA(cf.szFaceName, T2A((LPTSTR) (LPCTSTR) strDefFont), LF_FACESIZE);
#endif
cf.dwMask |= CFM_FACE;
}
void CWordPadView::OnInsertDateTime()
{
CDateDialog dlg;
if (dlg.DoModal() == IDOK)
GetRichEditCtrl().ReplaceSel(dlg.m_strSel);;
}
void CWordPadView::OnFormatParagraph()
{
CFormatParaDlg dlg(GetParaFormatSelection());
dlg.m_nWordWrap = m_nWordWrap;
if (dlg.DoModal() == IDOK)
SetParaFormat(dlg.m_pf);
}
void CWordPadView::OnFormatTabs()
{
CFormatTabDlg dlg(GetParaFormatSelection());
if (dlg.DoModal() == IDOK)
SetParaFormat(dlg.m_pf);
}
void CWordPadView::OnTextNotFound(LPCTSTR lpStr)
{
ASSERT_VALID(this);
MessageBeep(0);
AfxMessageBox(IDS_FINISHED_SEARCH,MB_OK|MB_ICONINFORMATION);
CRichEditView::OnTextNotFound(lpStr);
}
void CWordPadView::SetColor(COLORREF rgb)
{
CRichEditView::OnColorPick(rgb);
}
void CWordPadView::OnColorPick(UINT nID)
{
CRichEditView::OnColorPick(CColorMenu::GetColor(nID));
}
void CWordPadView::OnTimer(UINT nIDEvent)
{
if (m_uTimerID != nIDEvent) // not our timer
CRichEditView::OnTimer(nIDEvent);
else
{
KillTimer(m_uTimerID); // kill one-shot timer
m_uTimerID = 0;
if (m_bDelayUpdateItems)
GetDocument()->UpdateAllItems(NULL);
m_bDelayUpdateItems = FALSE;
}
}
void CWordPadView::OnEditChange()
{
SetUpdateTimer();
}
void CWordPadView::OnDestroy()
{
POSITION pos = theApp.m_listPrinterNotify.Find(m_hWnd);
ASSERT(pos != NULL);
theApp.m_listPrinterNotify.RemoveAt(pos);
CRichEditView::OnDestroy();
if (m_uTimerID != 0) // if outstanding timer kill it
OnTimer(m_uTimerID);
ASSERT(m_uTimerID == 0);
}
void CWordPadView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
// int nOldWidth = lpClientRect->right - lpClientRect->left;
CRichEditView::CalcWindowRect(lpClientRect, nAdjustType);
if (theApp.m_bWin4 && nAdjustType != 0 && (GetStyle() & WS_VSCROLL))
lpClientRect->right--;
// if the ruler is visible then slide the view up under the ruler to avoid
// showing the top border of the view
if (GetExStyle() & WS_EX_CLIENTEDGE)
{
CFrameWnd* pFrame = GetParentFrame();
if (pFrame != NULL)
{
CRulerBar* pBar = (CRulerBar*)pFrame->GetControlBar(ID_VIEW_RULER);
if (pBar != NULL)
{
BOOL bVis = pBar->IsVisible();
if (pBar->m_bDeferInProgress)
bVis = !bVis;
if (bVis)
lpClientRect->top -= 2;
}
}
}
}
void CWordPadView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemID = (UINT)(WORD)lpMIS->itemID;
CRichEditView::OnMeasureItem(nIDCtl, lpMIS);
}
void CWordPadView::OnPenBackspace()
{
SendMessage(WM_KEYDOWN, VK_BACK, 0);
SendMessage(WM_KEYUP, VK_BACK, 0);
}
void CWordPadView::OnPenNewline()
{
SendMessage(WM_CHAR, '\n', 0);
}
void CWordPadView::OnPenPeriod()
{
SendMessage(WM_CHAR, '.', 0);
}
void CWordPadView::OnPenSpace()
{
SendMessage(WM_CHAR, ' ', 0);
}
void CWordPadView::OnPenTab()
{
SendMessage(WM_CHAR, VK_TAB, 0);
}
void CWordPadView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_F10 && GetKeyState(VK_SHIFT) < 0)
{
long nStart, nEnd;
GetRichEditCtrl().GetSel(nStart, nEnd);
CPoint pt = GetRichEditCtrl().GetCharPos(nEnd);
SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, MAKELPARAM(pt.x, pt.y));
}
CRichEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
HRESULT CWordPadView::GetClipboardData(CHARRANGE* lpchrg, DWORD /*reco*/,
LPDATAOBJECT lpRichDataObj, LPDATAOBJECT* lplpdataobj)
{
CHARRANGE& cr = *lpchrg;
if ((cr.cpMax - cr.cpMin == 1) &&
GetRichEditCtrl().GetSelectionType() == SEL_OBJECT)
{
return E_NOTIMPL;
}
BeginWaitCursor();
//create the data source
COleDataSource* pDataSource = new COleDataSource;
// put the formats into the data source
LPENUMFORMATETC lpEnumFormatEtc;
lpRichDataObj->EnumFormatEtc(DATADIR_SET, &lpEnumFormatEtc);
if (lpEnumFormatEtc != NULL)
{
FORMATETC etc;
while (lpEnumFormatEtc->Next(1, &etc, NULL) == S_OK)
{
STGMEDIUM stgMedium;
lpRichDataObj->GetData(&etc, &stgMedium);
pDataSource->CacheData(etc.cfFormat, &stgMedium, &etc);
}
lpEnumFormatEtc->Release();
}
CEmbeddedItem item(GetDocument(), cr.cpMin, cr.cpMax);
item.m_lpRichDataObj = lpRichDataObj;
// get wordpad formats
item.GetClipboardData(pDataSource);
// get the IDataObject from the data source
*lplpdataobj = (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);
EndWaitCursor();
return S_OK;
}
HRESULT CWordPadView::QueryAcceptData(LPDATAOBJECT lpdataobj,
CLIPFORMAT* lpcfFormat, DWORD reco, BOOL bReally,
HGLOBAL hMetaPict)
{
if (bReally && *lpcfFormat == 0 && (m_nPasteType == 0))
{
COleDataObject dataobj;
dataobj.Attach(lpdataobj, FALSE);
if (!dataobj.IsDataAvailable(cfRTO)) // native avail, let richedit do as it wants
{
if (dataobj.IsDataAvailable(cfEmbeddedObject))
{
if (PasteNative(lpdataobj))
return S_FALSE;
}
}
}
return CRichEditView::QueryAcceptData(lpdataobj, lpcfFormat, reco, bReally,
hMetaPict);
}
BOOL CWordPadView::PasteNative(LPDATAOBJECT lpdataobj)
{
// check data object for wordpad object
// if true, suck out RTF directly
FORMATETC etc = {NULL, NULL, DVASPECT_CONTENT, -1, TYMED_ISTORAGE};
etc.cfFormat = (CLIPFORMAT)cfEmbeddedObject;
STGMEDIUM stgMedium = {TYMED_ISTORAGE, 0, NULL};
// create an IStorage to transfer the data in
LPLOCKBYTES lpLockBytes;
if (FAILED(::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes)))
return FALSE;
ASSERT(lpLockBytes != NULL);
HRESULT hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &stgMedium.pstg);
lpLockBytes->Release(); //storage addref'd
if (FAILED(hr))
return FALSE;
ASSERT(stgMedium.pstg != NULL);
CLSID clsid;
BOOL bRes = FALSE; //let richedit do what it wants
if (SUCCEEDED(lpdataobj->GetDataHere(&etc, &stgMedium)) &&
SUCCEEDED(ReadClassStg(stgMedium.pstg, &clsid)) &&
clsid == GetDocument()->GetClassID())
{
//suck out RTF now
// open Contents stream
COleStreamFile file;
CFileException fe;
if (file.OpenStream(stgMedium.pstg, szContents,
CFile::modeReadWrite|CFile::shareExclusive, &fe))
{
// load it with CArchive (loads from Contents stream)
CArchive loadArchive(&file, CArchive::load |
CArchive::bNoFlushOnDelete);
Stream(loadArchive, TRUE); //stream in selection
hr = TRUE; // don't let richedit do anything
}
}
::ReleaseStgMedium(&stgMedium);
return bRes;
}
// things to fix
// if format==0 we are doing a straight EM_PASTE
// look for native formats
// richedit specific -- allow richedit to handle (these will be first)
// look for RTF, CF_TEXT. If there paste special as these
// Do standard OLE scenario
// if pasting a particular format (format != 0)
// if richedit specific, allow through
// if RTF, CF_TEXT. paste special
// if OLE format, do standard OLE scenario
void CWordPadView::OnFilePrint()
{
// don't allow winini changes to occur while printing
m_bInPrint = TRUE;
CRichEditView::OnFilePrint();
// printer may have changed
theApp.NotifyPrinterChanged(); // this will cause a GetDocument()->PrinterChanged();
m_bInPrint = FALSE;
}
int CWordPadView::OnMouseActivate(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_bOnBar)
{
SetFocus();
return MA_ACTIVATEANDEAT;
}
else
return CRichEditView::OnMouseActivate(pWnd, nHitTest, message);
}
typedef BOOL (WINAPI *PCWPROC)(HWND, LPSTR, UINT, LPVOID, DWORD, DWORD);
void CWordPadView::OnPenLens()
{
USES_CONVERSION;
HINSTANCE hLib = LoadLibrary(_T("PENWIN32.DLL"));
if (hLib == NULL)
return;
PCWPROC pCorrectWriting = (PCWPROC)GetProcAddress(hLib, "CorrectWriting");
ASSERT(pCorrectWriting != NULL);
if (pCorrectWriting != NULL)
{
CHARRANGE cr;
GetRichEditCtrl().GetSel(cr);
int nCnt = 2*(cr.cpMax-cr.cpMin);
BOOL bSel = (nCnt != 0);
nCnt = max(1024, nCnt);
char* pBuf = new char[nCnt];
pBuf[0] = NULL;
if (bSel)
GetRichEditCtrl().GetSelText(pBuf);
if (pCorrectWriting(m_hWnd, pBuf, nCnt, 0, bSel ? 0 : CWR_INSERT, 0))
GetRichEditCtrl().ReplaceSel(A2T(pBuf));
delete [] pBuf;
}
FreeLibrary(hLib);
}
LONG CWordPadView::OnPrinterChangedMsg(UINT, LONG)
{
CDC dc;
AfxGetApp()->CreatePrinterDC(dc);
OnPrinterChanged(dc);
return 0;
}
static void ForwardPaletteChanged(HWND hWndParent, HWND hWndFocus)
{
// this is a quick and dirty hack to send the WM_QUERYNEWPALETTE to a window that is interested
HWND hWnd = NULL;
for (hWnd = ::GetWindow(hWndParent, GW_CHILD); hWnd != NULL; hWnd = ::GetWindow(hWnd, GW_HWNDNEXT))
{
if (hWnd != hWndFocus)
{
::SendMessage(hWnd, WM_PALETTECHANGED, (WPARAM)hWndFocus, 0L);
ForwardPaletteChanged(hWnd, hWndFocus);
}
}
}
void CWordPadView::OnPaletteChanged(CWnd* pFocusWnd)
{
ForwardPaletteChanged(m_hWnd, pFocusWnd->GetSafeHwnd());
// allow the richedit control to realize its palette
// remove this if if richedit fixes their code so that
// they don't realize their palette into foreground
if (::GetWindow(m_hWnd, GW_CHILD) == NULL)
CRichEditView::OnPaletteChanged(pFocusWnd);
}
static BOOL FindQueryPalette(HWND hWndParent)
{
// this is a quick and dirty hack to send the WM_QUERYNEWPALETTE to a window that is interested
HWND hWnd = NULL;
for (hWnd = ::GetWindow(hWndParent, GW_CHILD); hWnd != NULL; hWnd = ::GetWindow(hWnd, GW_HWNDNEXT))
{
if (::SendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0L))
return TRUE;
else if (FindQueryPalette(hWnd))
return TRUE;
}
return FALSE;
}
BOOL CWordPadView::OnQueryNewPalette()
{
if(FindQueryPalette(m_hWnd))
return TRUE;
return CRichEditView::OnQueryNewPalette();
}
void CWordPadView::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
CRichEditView::OnSettingChange(uFlags, lpszSection);
//printer might have changed
if (!m_bInPrint)
{
if (lstrcmpi(lpszSection, _T("windows")) == 0)
theApp.NotifyPrinterChanged(TRUE); // force update to defaults
}
}
void CWordPadView::OnSize(UINT nType, int cx, int cy)
{
CRichEditView::OnSize(nType, cx, cy);
CRect rect(HORZ_TEXTOFFSET, VERT_TEXTOFFSET, cx, cy);
GetRichEditCtrl().SetRect(rect);
}
void CWordPadView::OnGetCharFormat(NMHDR* pNMHDR, LRESULT* pRes)
{
ASSERT(pNMHDR != NULL);
ASSERT(pRes != NULL);
((CHARHDR*)pNMHDR)->cf = GetCharFormatSelection();
*pRes = 1;
}
void CWordPadView::OnSetCharFormat(NMHDR* pNMHDR, LRESULT* pRes)
{
ASSERT(pNMHDR != NULL);
ASSERT(pRes != NULL);
CHARHDR * pHdr = (CHARHDR *) pNMHDR;
SetCharFormat(pHdr->cf);
*pRes = 1;
}
void CWordPadView::OnBarSetFocus(NMHDR*, LRESULT*)
{
m_bOnBar = TRUE;
}
void CWordPadView::OnBarKillFocus(NMHDR*, LRESULT*)
{
m_bOnBar = FALSE;
}
void CWordPadView::OnBarReturn(NMHDR*, LRESULT* )
{
SetFocus();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -