📄 textserv.cpp
字号:
// Make sure the changes to the caret can be seen.
psel->Update_iFormat(-1);
psel->Update(FALSE);
}
}
}
}
#endif // PWD_JUPITER
// Post IME char processing.
if ( SUCCEEDED(hr) && WM_IME_CHAR == msg )
PostIMECharGlue( *this );
break;
case EM_CHARFROMPOS:
hr = TxCharFromPos((LPPOINT)lparam, &lres);
break;
#ifndef PEGASUS
case WM_INPUTLANGCHANGE:
if (_fSingleCodePage)
{
wparam =_pDocInfo && wparam == GetCharSet(_pDocInfo->wCpg);
}
// fall through to WM_INPUTLANGCHANGEREQUEST
case WM_INPUTLANGCHANGEREQUEST:
// if the SingleCodePage option is set, then we must
// have a "good" code page to go to; if not, just
// eat this message.
//
// This will prevent folks from typing French and Greek
// on the same edit control, which is useful for certain
// kinds of backward compatibility scenarios.
//
// HACK ALERT! the documentation on WM_INPUTLANGCHANGEREQUEST
// is wrong. It turns out that _only_ the low bit of wparam
// indicates whether or not the new keyboard can be considered
// as the same code page.
if( (_fSingleCodePage && (wparam & 0x1) ) ||
!_fSingleCodePage)
{
GetSel()->CheckChangeFont ( this, FALSE, LOWORD(lparam),
ConvertLanguageIDtoCodePage(LOWORD(lparam)) );
hr = S_FALSE; // cause default window to allow kb switch.
}
break;
#endif
case WM_CLEAR:
OnClear(&undobldr);
break;
case WM_CONTEXTMENU:
hr = OnContextMenu(lparam);
break;
case WM_COPY:
case WM_CUT:
lres = hr = CutOrCopySelection(msg, wparam, lparam, &undobldr);
break;
case WM_RENDERFORMAT:
lres = hr = _ldte.RenderClipboardFormat(wparam);
break;
case WM_RENDERALLFORMATS:
lres = hr = _ldte.RenderAllClipboardFormats();
break;
case WM_DESTROYCLIPBOARD:
lres = hr = _ldte.DestroyClipboard();
break;
case EM_DISPLAYBAND:
if (fInplaceActive())
{
OnDisplayBand((const RECT *) lparam, FALSE);
lres = 1;
}
else
{
hr = OLE_E_INVALIDRECT;
}
break;
#ifndef NODROPFILES
case WM_DROPFILES:
OnDropFiles((HANDLE) wparam);
break;
#endif
case EM_EMPTYUNDOBUFFER:
ClearUndo(&undobldr);
break;
case WM_ERASEBKGND:
lres = 1; // We handle background erase during painting
break;
case EM_EXGETSEL:
OnExGetSel((CHARRANGE *)lparam);
break;
case EM_EXLINEFROMCHAR:
hr = TxLineFromCp((LONG)lparam, &lres);
break;
case EM_FINDTEXT:
case EM_FINDTEXTEX:
case EM_FINDTEXTW:
case EM_FINDTEXTEXW:
lres = OnFindText(msg, (DWORD)wparam, (FINDTEXTEX *)lparam);
break;
case EM_FINDWORDBREAK:
hr = TxFindWordBreak((INT)wparam, (LONG)lparam, &lres);
break;
case EM_FORMATRANGE:
if (fInplaceActive())
{
SPrintControl prtcon;
prtcon._fDoPrint = (wparam) ? TRUE : FALSE;
lres = OnFormatRange((FORMATRANGE *) lparam, prtcon);
}
else
{
hr = OLE_E_INVALIDRECT;
}
break;
case EM_GETCHARFORMAT:
{
// ensure that all CCharFormat manipulated internally are
// not CHARFORMAT's or CHARFORMAT2's
CCharFormat cfInt;
CHARFORMAT *pcfExt = (CHARFORMAT *)lparam;
cfInt.cbSize = pcfExt->cbSize;
lres = OnGetCharFormat(&cfInt, wparam);
CopyMemory(pcfExt, &cfInt, min(pcfExt->cbSize,sizeof(cfInt)));
break;
}
case EM_GETFIRSTVISIBLELINE:
if (fInplaceActive())
{
lres = _pdp->GetFirstVisibleLine();
}
else
{
hr = OLE_E_INVALIDRECT;
}
break;
case EM_GETLIMITTEXT:
lres = TxGetMaxLength();
break;
case EM_GETLINE:
if (fInplaceActive())
{
lres = _pdp->GetLineText((LONG)wparam, (TCHAR *)lparam,
(LONG) (*(WORD *) lparam));
}
else
{
hr = OLE_E_INVALIDRECT;
}
break;
case EM_GETLINECOUNT:
hr = TxGetLineCount(&lres);
break;
case EM_GETMODIFY: // RichEdit 1.0 returned -1 if _fModified
lres = -(LONG)_fModified; // is TRUE (go figure). So for backward
break; // compatibility, we do too :-(
case EM_GETOLEINTERFACE:
if( lparam )
{
*(IRichEditOle **)lparam = (IRichEditOle *)this;
AddRef();
}
lres = TRUE;
break;
case EM_GETSCROLLPOS:
{
POINT *point = (POINT *)lparam;
point->x = _pdp->GetXScroll();
point->y = _pdp->GetYScroll();
point->y = _pdp->ConvertYPosToScrollPos(point->y);
lres = 1;
}
break;
case EM_SETOLECALLBACK:
hr = E_FAIL;
if( lparam )
{
pobjmgr = GetObjectMgr();
if( pobjmgr )
{
pobjmgr->SetRECallback((IRichEditOleCallback *)lparam);
lres = TRUE;
hr = NOERROR;
}
}
break;
case EM_GETPARAFORMAT:
{
// Use CParaFormat for all internal operations
CParaFormat PF;
PARAFORMAT *pPF = (PARAFORMAT *)lparam;
PF.cbSize = pPF->cbSize;
lres = OnGetParaFormat(&PF);
// PREFIX WCEP 31825
if (IsValidParaFormat(&PF))
{
CopyMemory(pPF, &PF, pPF->cbSize);
}
}
break;
case EM_GETSEL:
lres = OnGetSel((LONG*)wparam, (LONG*)lparam);
break;
case EM_GETSELTEXT:
lres = OnGetSelText((TCHAR *)lparam);
break;
case WM_GETTEXT:
{
GETTEXTEX gt;
gt.cb = wparam * 2;
gt.flags = GT_USECRLF;
gt.codepage = 1200;
gt.lpDefaultChar = NULL;
gt.lpUsedDefChar = NULL;
lres = GetTextEx(>, (TCHAR *)lparam);
}
break;
case WM_GETTEXTLENGTH:
{
GETTEXTLENGTHEX gtl;
gtl.flags = GTL_NUMCHARS | GTL_PRECISE | GTL_USECRLF;
gtl.codepage = 1200;
lres = GetTextLengthEx(>l);
}
break;
case EM_GETTEXTEX:
lres = GetTextEx((GETTEXTEX *)wparam, (TCHAR *)lparam);
break;
case EM_GETTEXTLENGTHEX:
lres = GetTextLengthEx((GETTEXTLENGTHEX *)wparam);
break;
case EM_GETTEXTRANGE:
{
TEXTRANGE * const ptr = (TEXTRANGE *) lparam;
LONG cch = ValidateTextRange(ptr);
if (cch < 0) // Get text character count because
cch = GetTextLength(); // caller wants it all
cch++; // Bump count by terminating '\0'
// Only copy if we need to copy anything and destination is valid
if (cch > 1 &&
!IsBadWritePtr(ptr->lpstrText, cch * sizeof(TCHAR)))
{
lres = GetTextRange(ptr->chrg.cpMin, cch, ptr->lpstrText);
}
}
break;
case EM_GETWORDBREAKPROC:
lres = OnGetWordBreakProc();
break;
case EM_GETZOOM:
*(WORD *)wparam = GetZoomNumerator();
*(WORD *)lparam = GetZoomDenominator();
lres = 1;
break;
case EM_HIDESELECTION:
lres = OnTxHideSelectionChange((BOOL)wparam);
break;
case WM_HSCROLL:
hr = TxHScroll(LOWORD(wparam), HIWORD(wparam));
break;
case WM_KEYDOWN:
hr = OnTxKeyDown((WORD) wparam, (DWORD) lparam, &undobldr);
break;
case WM_KEYUP:
// GuyBark JupiterJ IME:
// Have we frozen the display while we force an ime caret move?
if(_fDisplayFrozen)
{
// Do we have undetermined text?
if(!IsIMEComposition())
{
// No! Somehow we determined the text without getting the
// key up, so thaw now!
_pdp->Thaw();
_fDisplayFrozen = FALSE;
}
else
{
MSG msgPeek;
HWND hWndRE;
// We have some undetermined text. So check if we need to thaw the display now.
if((TxGetWindow(&hWndRE) != S_OK) ||
!PeekMessage(&msgPeek, hWndRE, WM_KEYUP, WM_KEYUP, PM_NOREMOVE))
{
// Looks like we've got the last of our forced caret moves.
// Before thawing the display, make sure any candidate
// list is positioned beneath the final caret position.
if(_ime->_dwIndex != 0xFFFF)
{
_ime->IMESetCandidateWindowPos(*this);
}
// Now thaw!
_pdp->Thaw();
_fDisplayFrozen = FALSE;
}
}
}
// Start v-holee
// VK_JANJI == VK_HANJA in KOREAN
if( (WORD)wparam == VK_KANJI )
{
if(_KOREAN_CP == GetKeyboardCodePage() &&
IsntProtectedOrReadOnly(WM_KEYUP, VK_KANJI, lparam))
{
IUndoBuilder *publdr = &undobldr;
IMEHangeulToHanja ( *this, *publdr );
}
}
// Finish v-holee
if( (WORD)wparam == VK_APPS )
{
HandleKbdContextMenu();
}
else
{
// otherwise, we don't process this message.
hr = S_FALSE;
}
break;
case WM_KILLFOCUS:
lres = OnKillFocus();
break;
case WM_LBUTTONDBLCLK:
#ifdef PWD_JUPITER // GuyBark 81387: Allow undo of expand/collapse operation
hr = OnTxLButtonDblClk(MOUSEX, MOUSEY, (WORD) wparam, &undobldr);
#else
hr = OnTxLButtonDblClk(MOUSEX, MOUSEY, (WORD) wparam);
#endif
break;
case WM_LBUTTONDOWN:
if(_fEatLeftDown)
{
TxSetFocus();
_fEatLeftDown = FALSE;
}
else
{
hr = OnTxLButtonDown(MOUSEX, MOUSEY, (WORD) wparam);
}
break;
case WM_LBUTTONUP:
hr = OnTxLButtonUp(MOUSEX, MOUSEY, (WORD) wparam, TRUE);
break;
#if !defined(NOMAGELLAN)
case WM_MBUTTONDBLCLK: // Magellan zmouse scroll
case WM_NCMBUTTONDOWN: // support commandeers middle
case WM_MBUTTONDOWN: // button.
OnTxMButtonDown(MOUSEX, MOUSEY, (WORD) wparam);
break;
case WM_MBUTTONUP:
OnTxMButtonUp(MOUSEX, MOUSEY, (WORD) wparam);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -