📄 reitp.c
字号:
if(predoc->preole->lpVtbl->GetObject(predoc->preole, REO_IOB_SELECTION,
&reobj,
REO_GETOBJ_POLESITE |
REO_GETOBJ_POLEOBJ))
{
AssertSz(FALSE, "DoVerb without object");
}
SendMessage(predoc->hwndRE, EM_POSFROMCHAR, (WPARAM) &pt, reobj.cp);
XformSizeInHimetricToPixels(NULL, &reobj.sizel, &reobj.sizel);
rc.right = (INT) reobj.sizel.cx;
rc.bottom = (INT) reobj.sizel.cy;
OffsetRect(&rc, pt.x, pt.y);
reobj.poleobj->lpVtbl->DoVerb(reobj.poleobj, ioleverb, NULL,
reobj.polesite, 0, predoc->hwndRE, &rc);
reobj.poleobj->lpVtbl->Release(reobj.poleobj);
reobj.polesite->lpVtbl->Release(reobj.polesite);
}
#ifdef DEBUG
LOCAL VOID IgnoreLeftClick(REDOC *predoc)
{
HMENU hmenu = GetMenu(hwndMain);
UINT uiMenuFlags;
DWORD dwMask;
Assert(predoc->hwndRE);
dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
uiMenuFlags = GetMenuState(hmenu, IDM_IGNORELEFTCLICK, MF_BYCOMMAND);
if(uiMenuFlags & MF_CHECKED)
dwMask &= ~ENM_MOUSEEVENTS;
else
dwMask |= ENM_MOUSEEVENTS;
uiMenuFlags ^= MF_CHECKED;
CheckMenuItem(hmenu, IDM_IGNORELEFTCLICK, MF_BYCOMMAND |
(uiMenuFlags & MF_CHECKED));
SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
}
LOCAL VOID EatEs(REDOC *predoc)
{
HMENU hmenu = GetMenu(hwndMain);
UINT uiMenuFlags;
DWORD dwMask;
Assert(predoc->hwndRE);
dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
uiMenuFlags = GetMenuState(hmenu, IDM_EATES, MF_BYCOMMAND);
if(uiMenuFlags & MF_CHECKED)
dwMask &= ~ENM_KEYEVENTS;
else
dwMask |= ENM_KEYEVENTS;
uiMenuFlags ^= MF_CHECKED;
CheckMenuItem(hmenu, IDM_EATES, MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));
SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
}
LOCAL VOID Bottomless(REDOC *predoc)
{
HMENU hmenu = GetMenu(hwndMain);
UINT uiMenuFlags;
DWORD dwMask;
Assert(predoc->hwndRE);
dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
uiMenuFlags = GetMenuState(hmenu, IDM_BOTTOMLESS, MF_BYCOMMAND);
if(uiMenuFlags & MF_CHECKED)
dwMask &= ~ENM_REQUESTRESIZE;
else
dwMask |= ENM_REQUESTRESIZE;
uiMenuFlags ^= MF_CHECKED;
CheckMenuItem(hmenu, IDM_BOTTOMLESS,
MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));
SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
if(dwMask & ENM_REQUESTRESIZE)
{
SendMessage(predoc->hwndRE, EM_REQUESTRESIZE, 0, 0);
}
else
{
RECT rc;
GetClientRect(predoc->hwndParent, &rc);
ResizeRedoc(predoc, rc);
}
}
#endif // DEBUG
LOCAL BOOL ToggleCheck(REDOC *predoc, UINT uiMenuid)
{
HMENU hmenu = GetMenu(hwndMain);
UINT uiMenuFlags;
Assert(predoc->hwndRE);
uiMenuFlags = GetMenuState(hmenu, uiMenuid, MF_BYCOMMAND);
uiMenuFlags ^= MF_CHECKED;
CheckMenuItem(hmenu, uiMenuid, MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));
return !!(uiMenuFlags & MF_CHECKED);
}
LOCAL BOOL QueryCheck(REDOC *predoc, UINT uiMenuid)
{
HMENU hmenu = GetMenu(hwndMain);
UINT uiMenuFlags;
Assert(predoc->hwndRE);
if(!hmenu)
return fFalse;
uiMenuFlags = GetMenuState(hmenu, uiMenuid, MF_BYCOMMAND);
return !!(uiMenuFlags & MF_CHECKED);
}
LOCAL LRESULT NewREDoc(REDOC *predoc, BOOL fPrompt, BOOL fUpdateUI)
{
RECT rc;
DWORD dwStyle;
if(predoc->hwndRE)
{
PARAFORMAT pf = {0};
pf.cbSize = sizeof(PARAFORMAT);
if(fPrompt && CheckSave(predoc) < 0)
return -1;
predoc->szFile[0] = TEXT('\0');
lstrcpy(predoc->szTitle, szUntitled);
SetWindowText(predoc->hwndRE, TEXT(""));
pf.wAlignment = PFA_LEFT;
pf.cTabCount = 1;
pf.rgxTabs[0] = lDefaultTab;
pf.dwMask = PFM_STARTINDENT | PFM_RIGHTINDENT | PFM_OFFSET |
PFM_ALIGNMENT | PFM_TABSTOPS | PFM_NUMBERING;
SendMessage(predoc->hwndRE, EM_SETPARAFORMAT, 0, (LPARAM) &pf);
SendMessage(predoc->hwndRE, EM_SETCHARFORMAT, 0,
(LPARAM) (LPVOID) &cfDefault);
goto done;
}
else
{
predoc->szFile[0] = TEXT('\0');
lstrcpy(predoc->szTitle, szUntitled);
}
GetClientRect(predoc->hwndParent, &rc);
InflateRect(&rc, dxRESize, dyRESize);
// Create and display the format bar
if(predoc->hwndFormatBar = HwndCreateFormatBar(predoc->hwndParent,
FBR_FormatBar, NULL))
{
RECT rcFormatBar;
ShowWindow(predoc->hwndFormatBar, SW_SHOW);
GetClientRect(predoc->hwndFormatBar, &rcFormatBar);
rc.top += rcFormatBar.bottom;
}
#ifdef SUNKENRICHEDIT
dwStyle =
ES_AUTOHSCROLL |
ES_AUTOVSCROLL |
// ES_DISABLENOSCROLL |
ES_MULTILINE |
// ES_NOHIDESEL |
ES_SAVESEL |
ES_SELECTIONBAR |
ES_SUNKEN |
// WS_BORDER |
WS_CHILD |
WS_CLIPCHILDREN |
WS_HSCROLL |
WS_VISIBLE |
WS_VSCROLL |
0; // zero gets or'd with above
predoc->hwndRE = CreateWindow(szClassRE, TEXT(""),
dwStyle,
rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, predoc->hwndParent,
NULL, HinstFromHwnd(predoc->hwndParent), NULL);
#else // SUNKENRICHEDIT
ES_AUTOHSCROLL |
ES_AUTOVSCROLL |
// ES_DISABLENOSCROLL |
ES_MULTILINE |
// ES_NOHIDESEL |
ES_SAVESEL |
ES_SELECTIONBAR |
// ES_SUNKEN |
// WS_BORDER |
WS_CHILD |
WS_CLIPCHILDREN |
WS_HSCROLL |
WS_VISIBLE |
WS_VSCROLL |
0; // zero gets or'd with above
predoc->hwndRE = CreateWindow(szClassRE, TEXT(""),
dwStyle,
rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, predoc->hwndParent,
NULL, HinstFromHwnd(predoc->hwndParent), NULL);
#endif // SUNKENRICHEDIT, else
if(!predoc->hwndRE)
{
MessageBoxA(hwndMain, "Unable to create a new document", NULL, MB_ICONSTOP | MB_OK);
return -1;
}
if(cchTextMost)
SendMessage(predoc->hwndRE, EM_EXLIMITTEXT, 0, cchTextMost);
#ifndef NO_OLE
DragAcceptFiles(predoc->hwndRE, TRUE);
#endif // !NO_OLE
// request EN_SELCHANGE, EN_CHANGE, EN_PROTECTED, and EN_DROPFILES
SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0,
ENM_SELCHANGE | ENM_CHANGE | ENM_PROTECTED | EN_DROPFILES |
ENM_CORRECTTEXT);
SetFocus(predoc->hwndRE);
predoc->scf = SCF_SELECTION;
if(GetMenu(hwndMain) && QueryCheck(predoc, IDM_APPLYTOWORD))
predoc->scf |= SCF_WORD;
#ifndef NO_OLE
if(!SendMessage(predoc->hwndRE, EM_GETOLEINTERFACE, 0, (LPARAM) &predoc->preole))
{
MessageBoxA(hwndMain, "No OLE interface!", NULL, MB_OK);
DestroyWindow(predoc->hwndRE);
predoc->hwndRE = 0;
return -1;
}
if(!(predoc->pstg = OleStdCreateRootStorage(NULL, STGM_SHARE_EXCLUSIVE)))
{
MessageBoxA(hwndMain, "No Storage!", NULL, MB_OK);
DestroyWindow(predoc->hwndRE);
predoc->hwndRE = 0;
return -1;
}
if(!(predoc->pitpcall = ITPCALL_New(predoc)))
{
MessageBoxA(hwndMain, "No callback object!", NULL, MB_OK);
DestroyWindow(predoc->hwndRE);
predoc->hwndRE = 0;
return -1;
}
SendMessage(predoc->hwndRE, EM_SETOLECALLBACK, 0, (LPARAM) predoc->pitpcall);
#endif // !NO_OLE
done:
if(fUpdateUI)
{
TCHAR szT[64];
wsprintf(szT, szFmtTitle, predoc->szTitle);
SetWindowText(predoc->hwndParent, szT);
SetMenu(hwndMain, hmenuFull);
DrawMenuBar(hwndMain);
}
predoc->fReadOnly = fFalse;
EnableWindow(predoc->hwndFormatBar, TRUE);
// illegal values to force SetWordWrap() to do something
predoc->fWrap = fFalse;
predoc->fWysiwyg = fTrue;
SetWordWrap(predoc, fWysiwygDefault, fWrapDefault);
// if we don't have a default font, use the windows variable width font
// otherwise, use the default font
if(cfDefault.dwMask == 0)
{
SendMessage(predoc->hwndRE, WM_SETFONT,
(WPARAM) GetStockObject(ANSI_VAR_FONT), 0);
SendMessage(predoc->hwndRE, EM_GETCHARFORMAT, FALSE,
(LPARAM) (LPVOID) &cfDefault);
}
else
{
SendMessage(predoc->hwndRE, EM_SETCHARFORMAT, 0,
(LPARAM) (LPVOID) &cfDefault);
}
SendMessage(predoc->hwndRE, EM_SETMODIFY, (WPARAM) fFalse, 0);
SendMessage(predoc->hwndRE, EM_SETREADONLY, (WPARAM) fFalse, 0);
UpdateFormatBar(predoc);
return 0;
}
LOCAL LONG CheckSave(REDOC *predoc)
{
int iMbid;
TCHAR szT[128];
#ifdef NO_SAVE_PROMPT
return 0;
#endif // NO_SAVE_PROMPT
if(!SendMessage(predoc->hwndRE, EM_GETMODIFY, 0, 0))
return 0;
wsprintf(szT, TEXT("Save changes to %s?"), predoc->szTitle);
iMbid = MessageBox(hwndMain, szT, szAppName, MB_APPLMODAL |
MB_ICONQUESTION | MB_YESNOCANCEL);
switch(iMbid)
{
case IDYES:
if(SaveREDoc(predoc) < 0)
return -1;
break;
case IDCANCEL:
return -1;
}
return 0;
}
// returns 0 if no changes have been made
// returns > 0 if revert should continue
// returns < 0 if revert should be aborted
LOCAL INT CheckRevert(REDOC *predoc)
{
int iMbid;
TCHAR szT[128];
if(!SendMessage(predoc->hwndRE, EM_GETMODIFY, 0, 0))
return 0;
#ifdef NO_SAVE_PROMPT
return 1;
#endif // NO_SAVE_PROMPT
wsprintf(szT, TEXT("Revert %s to last saved changes?"), predoc->szTitle);
iMbid = MessageBox(hwndMain, szT, szAppName, MB_APPLMODAL |
MB_ICONQUESTION | MB_YESNO);
return iMbid == IDYES ? 1 : -1;
}
LOCAL LRESULT CloseREDoc(REDOC *predoc, BOOL fPrompt, BOOL fUpdateUI)
{
if(fPrompt && CheckSave(predoc) < 0)
return -1;
if(predoc->hdcTarget)
{
DeleteDC(predoc->hdcTarget);
predoc->hdcTarget = 0;
}
#ifndef NO_OLE
// Deactivate any existing in place object
//$ FUTURE: This might be some generic I'm gonna close you call
predoc->preole->lpVtbl->InPlaceDeactivate(predoc->preole);
ITPCALL_Release((LPUNKNOWN) predoc->pitpcall);
predoc->pitpcall = NULL;
predoc->pstg->lpVtbl->Release(predoc->pstg);
predoc->pstg = NULL;
predoc->preole->lpVtbl->Release(predoc->preole);
predoc->preole = NULL;
predoc->cItem = 0;
#endif // !NO_OLE
DestroyWindow(predoc->hwndRE);
DestroyWindow(predoc->hwndFormatBar);
predoc->hwndRE = 0;
predoc->szFile[0] = TEXT('\0');
lstrcpy(predoc->szTitle, szUntitled);
predoc->dwFormat = SF_TEXT;
predoc->fReadOnly = fFalse;
EnableWindow(predoc->hwndFormatBar, TRUE);
#ifdef DEBUG
CheckMenuItem(hmenuFull, IDM_IGNORELEFTCLICK, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(hmenuFull, IDM_EATES, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(hmenuFull, IDM_IGNOREDROPS, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(hmenuFull, IDM_BOTTOMLESS, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(hmenuFull, IDM_TEXTONLY, MF_BYCOMMAND | MF_UNCHECKED);
if(hwndGT)
{
DestroyWindow(hwndGT);
hwndGT = 0;
}
#endif // DEBUG
if(fUpdateUI)
{
SetWindowText(predoc->hwndParent, szClosedName);
SetMenu(hwndMain, hmenuLoaded);
DrawMenuBar(hwndMain);
}
return 1;
}
DWORD CALLBACK MyRead(DWORD dwCookie, LPBYTE pbBuffer, LONG cb, LONG *pcb)
{
HFILE hf = (HFILE) dwCookie;
if(hf == HFILE_ERROR)
return (DWORD) E_FAIL;
*pcb = _lread(hf, pbBuffer, cb);
return (DWORD) (*pcb >= 0 ? NOERROR : (*pcb = 0, E_FAIL));
}
// This function gives the Mac version the ability to open and print
// files via Apple Events.
LRESULT DoOpen(predoc, szT, szTitle, fInsert)
REDOC *predoc;
LPSTR szT, szTitle;
BOOL fInsert;
{
DWORD dwError;
if((dwError = ReadREDoc(predoc, szT, szTitle, 0, fInsert)))
goto err;
wsprintf(szT, szFmtTitle, szTitle);
SetWindowText(predoc->hwndParent, szT);
EnableWindow(predoc->hwndFormatBar, !predoc->fReadOnly);
SendMessage(predoc->hwndRE, EM_SETREADONLY, (WPARAM) predoc->fReadOnly, 0);
SetMenu(hwndMain, hmenuFull);
SetupWordWrapMenu(predoc);
DrawMenuBar(hwndMain);
return 0;
err:
wsprintf(szT, TEXT("Error opening document. [%ld]"), dwError);
MessageBox(hwndMain, szT, NULL, MB_OK);
return -1;
}
LOCAL LRESULT OpenREDoc(REDOC *predoc, BOOL fInsert)
{
DWORD dwError;
OPENFILENAME ofn;
TCHAR szTitle[64];
TCHAR szT[256];
if(predoc->hwndRE && !fInsert && CheckSave(predoc) < 0)
return -1;
if(fInsert && predoc->fReadOnly)
return -1;
ofn.lStructSize = sizeof(ofn);
ofn.hInstance = 0;
ofn.lpstrFilter = szFilterLoad;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = szTitle;
ofn.nMaxFileTitle = sizeof(szTitle);
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = fInsert ? "Insert from File" : NULL;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = NULL;
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
ofn.hwndOwner = hwndMain;
ofn.lpstrFile = szT;
ofn.nMaxFile = sizeof(szT);
ofn.Flags = OFN_FILEMUSTEXIST;
szTitle[0] = TEXT('\0');
szT[0] = TEXT('\0');
// Query user for filename for input
if(!GetOpenFileName(&ofn))
{
if((dwError = CommDlgExtendedError()) != 0)
{
wsprintf(szT, TEXT("Error opening document. [%ld]"), dwError);
MessageBox(hwndMain, szT, NULL, MB_OK);
return -1;
}
return 0;
}
predoc->fReadOnly = (ofn.Flags & OFN_READONLY) ? fTrue : fFalse;
EnableWindow(predoc->hwndFormatBar, !predoc->fReadOnly);
return(DoOpen(predoc, szT, szTitle, fInsert));
}
LOCAL LRESULT RevertREDoc(REDOC *predoc)
{
DWORD dwError;
TCHAR szT[256];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -