📄 edit.c
字号:
* the 32 bit ones, so that we can 'fall through' to the
* helper functions. These are mostly 32 bit (with a few
* exceptions, clearly indicated by a '16' extension to their
* names).
*
*/
static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam, BOOL unicode )
{
EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 );
LRESULT result = 0;
TRACE("hwnd=%p msg=%x (%s) wparam=%x lparam=%lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam);
if (!es && msg != WM_NCCREATE)
return DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
if (es && (msg != WM_DESTROY)) EDIT_LockBuffer(es);
switch (msg) {
#ifndef __REACTOS__
case EM_GETSEL16:
wParam = 0;
lParam = 0;
/* fall through */
#endif
case EM_GETSEL:
result = EDIT_EM_GetSel(es, (PUINT)wParam, (PUINT)lParam);
break;
#ifndef __REACTOS__
case EM_SETSEL16:
if ((short)LOWORD(lParam) == -1)
EDIT_EM_SetSel(es, (UINT)-1, 0, FALSE);
else
EDIT_EM_SetSel(es, LOWORD(lParam), HIWORD(lParam), FALSE);
if (!wParam)
EDIT_EM_ScrollCaret(es);
result = 1;
break;
#endif
case EM_SETSEL:
EDIT_EM_SetSel(es, wParam, lParam, FALSE);
EDIT_EM_ScrollCaret(es);
result = 1;
break;
#ifndef __REACTOS__
case EM_GETRECT16:
if (lParam)
CONV_RECT32TO16(&es->format_rect, MapSL(lParam));
break;
#endif
case EM_GETRECT:
if (lParam)
CopyRect((LPRECT)lParam, &es->format_rect);
break;
#ifndef __REACTOS__
case EM_SETRECT16:
if ((es->style & ES_MULTILINE) && lParam) {
RECT rc;
CONV_RECT16TO32(MapSL(lParam), &rc);
EDIT_SetRectNP(es, &rc);
EDIT_UpdateText(es, NULL, TRUE);
}
break;
#endif
case EM_SETRECT:
if ((es->style & ES_MULTILINE) && lParam) {
EDIT_SetRectNP(es, (LPRECT)lParam);
EDIT_UpdateText(es, NULL, TRUE);
}
break;
#ifndef __REACTOS__
case EM_SETRECTNP16:
if ((es->style & ES_MULTILINE) && lParam) {
RECT rc;
CONV_RECT16TO32(MapSL(lParam), &rc);
EDIT_SetRectNP(es, &rc);
}
break;
#endif
case EM_SETRECTNP:
if ((es->style & ES_MULTILINE) && lParam)
EDIT_SetRectNP(es, (LPRECT)lParam);
break;
#ifndef __REACTOS__
case EM_SCROLL16:
#endif
case EM_SCROLL:
result = EDIT_EM_Scroll(es, (INT)wParam);
break;
#ifndef __REACTOS__
case EM_LINESCROLL16:
wParam = (WPARAM)(INT)(SHORT)HIWORD(lParam);
lParam = (LPARAM)(INT)(SHORT)LOWORD(lParam);
/* fall through */
#endif
case EM_LINESCROLL:
result = (LRESULT)EDIT_EM_LineScroll(es, (INT)wParam, (INT)lParam);
break;
#ifndef __REACTOS__
case EM_SCROLLCARET16:
#endif
case EM_SCROLLCARET:
EDIT_EM_ScrollCaret(es);
result = 1;
break;
#ifndef __REACTOS__
case EM_GETMODIFY16:
#endif
case EM_GETMODIFY:
result = ((es->flags & EF_MODIFIED) != 0);
break;
#ifndef __REACTOS__
case EM_SETMODIFY16:
#endif
case EM_SETMODIFY:
if (wParam)
es->flags |= EF_MODIFIED;
else
es->flags &= ~(EF_MODIFIED | EF_UPDATE); /* reset pending updates */
break;
#ifndef __REACTOS__
case EM_GETLINECOUNT16:
#endif
case EM_GETLINECOUNT:
result = (es->style & ES_MULTILINE) ? es->line_count : 1;
break;
#ifndef __REACTOS__
case EM_LINEINDEX16:
if ((INT16)wParam == -1)
wParam = (WPARAM)-1;
/* fall through */
#endif
case EM_LINEINDEX:
result = (LRESULT)EDIT_EM_LineIndex(es, (INT)wParam);
break;
#ifndef __REACTOS__
case EM_SETHANDLE16:
EDIT_EM_SetHandle16(es, (HLOCAL16)wParam);
break;
#endif
case EM_SETHANDLE:
EDIT_EM_SetHandle(es, (HLOCAL)wParam);
break;
#ifndef __REACTOS__
case EM_GETHANDLE16:
result = (LRESULT)EDIT_EM_GetHandle16(es);
break;
#endif
case EM_GETHANDLE:
result = (LRESULT)EDIT_EM_GetHandle(es);
break;
#ifndef __REACTOS__
case EM_GETTHUMB16:
#endif
case EM_GETTHUMB:
result = EDIT_EM_GetThumb(es);
break;
/* these messages missing from specs */
case WM_USER+15:
case 0x00bf:
case WM_USER+16:
case 0x00c0:
case WM_USER+19:
case 0x00c3:
case WM_USER+26:
case 0x00ca:
FIXME("undocumented message 0x%x, please report\n", msg);
result = DefWindowProcW(hwnd, msg, wParam, lParam);
break;
#ifndef __REACTOS__
case EM_LINELENGTH16:
#endif
case EM_LINELENGTH:
result = (LRESULT)EDIT_EM_LineLength(es, (INT)wParam);
break;
#ifndef __REACTOS__
case EM_REPLACESEL16:
lParam = (LPARAM)MapSL(lParam);
unicode = FALSE; /* 16-bit message is always ascii */
/* fall through */
#endif
case EM_REPLACESEL:
{
LPWSTR textW;
if(unicode)
textW = (LPWSTR)lParam;
else
{
LPSTR textA = (LPSTR)lParam;
INT countW = MultiByteToWideChar(CP_ACP, 0, textA, -1, NULL, 0);
if((textW = HeapAlloc(GetProcessHeap(), 0, countW * sizeof(WCHAR))))
MultiByteToWideChar(CP_ACP, 0, textA, -1, textW, countW);
}
EDIT_EM_ReplaceSel(es, (BOOL)wParam, textW, TRUE, TRUE);
result = 1;
if(!unicode)
HeapFree(GetProcessHeap(), 0, textW);
break;
}
#ifndef __REACTOS__
case EM_GETLINE16:
lParam = (LPARAM)MapSL(lParam);
unicode = FALSE; /* 16-bit message is always ascii */
/* fall through */
#endif
case EM_GETLINE:
result = (LRESULT)EDIT_EM_GetLine(es, (INT)wParam, (LPWSTR)lParam, unicode);
break;
#ifndef __REACTOS__
case EM_LIMITTEXT16:
#endif
case EM_SETLIMITTEXT:
EDIT_EM_SetLimitText(es, (INT)wParam);
break;
#ifndef __REACTOS__
case EM_CANUNDO16:
#endif
case EM_CANUNDO:
result = (LRESULT)EDIT_EM_CanUndo(es);
break;
#ifndef __REACTOS__
case EM_UNDO16:
#endif
case EM_UNDO:
case WM_UNDO:
result = (LRESULT)EDIT_EM_Undo(es);
break;
#ifndef __REACTOS__
case EM_FMTLINES16:
#endif
case EM_FMTLINES:
result = (LRESULT)EDIT_EM_FmtLines(es, (BOOL)wParam);
break;
#ifndef __REACTOS__
case EM_LINEFROMCHAR16:
#endif
case EM_LINEFROMCHAR:
result = (LRESULT)EDIT_EM_LineFromChar(es, (INT)wParam);
break;
#ifndef __REACTOS__
case EM_SETTABSTOPS16:
result = (LRESULT)EDIT_EM_SetTabStops16(es, (INT)wParam, MapSL(lParam));
break;
#endif
case EM_SETTABSTOPS:
result = (LRESULT)EDIT_EM_SetTabStops(es, (INT)wParam, (LPINT)lParam);
break;
#ifndef __REACTOS__
case EM_SETPASSWORDCHAR16:
unicode = FALSE; /* 16-bit message is always ascii */
/* fall through */
#endif
case EM_SETPASSWORDCHAR:
{
WCHAR charW = 0;
if(unicode)
charW = (WCHAR)wParam;
else
{
CHAR charA = wParam;
MultiByteToWideChar(CP_ACP, 0, &charA, 1, &charW, 1);
}
EDIT_EM_SetPasswordChar(es, charW);
break;
}
#ifndef __REACTOS__
case EM_EMPTYUNDOBUFFER16:
#endif
case EM_EMPTYUNDOBUFFER:
EDIT_EM_EmptyUndoBuffer(es);
break;
#ifndef __REACTOS__
case EM_GETFIRSTVISIBLELINE16:
result = es->y_offset;
break;
#endif
case EM_GETFIRSTVISIBLELINE:
result = (es->style & ES_MULTILINE) ? es->y_offset : es->x_offset;
break;
#ifndef __REACTOS__
case EM_SETREADONLY16:
#endif
case EM_SETREADONLY:
if (wParam) {
SetWindowLongW( hwnd, GWL_STYLE,
GetWindowLongW( hwnd, GWL_STYLE ) | ES_READONLY );
es->style |= ES_READONLY;
} else {
SetWindowLongW( hwnd, GWL_STYLE,
GetWindowLongW( hwnd, GWL_STYLE ) & ~ES_READONLY );
es->style &= ~ES_READONLY;
}
result = 1;
break;
#ifndef __REACTOS__
case EM_SETWORDBREAKPROC16:
EDIT_EM_SetWordBreakProc16(es, (EDITWORDBREAKPROC16)lParam);
break;
#endif
case EM_SETWORDBREAKPROC:
EDIT_EM_SetWordBreakProc(es, (void *)lParam);
break;
#ifndef __REACTOS__
case EM_GETWORDBREAKPROC16:
result = (LRESULT)es->word_break_proc16;
break;
#endif
case EM_GETWORDBREAKPROC:
result = (LRESULT)es->word_break_proc;
break;
#ifndef __REACTOS__
case EM_GETPASSWORDCHAR16:
unicode = FALSE; /* 16-bit message is always ascii */
/* fall through */
#endif
case EM_GETPASSWORDCHAR:
{
if(unicode)
result = es->password_char;
else
{
WCHAR charW = es->password_char;
CHAR charA = 0;
WideCharToMultiByte(CP_ACP, 0, &charW, 1, &charA, 1, NULL, NULL);
result = charA;
}
break;
}
/* The following EM_xxx are new to win95 and don't exist for 16 bit */
case EM_SETMARGINS:
EDIT_EM_SetMargins(es, (INT)wParam, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case EM_GETMARGINS:
result = MAKELONG(es->left_margin, es->right_margin);
break;
case EM_GETLIMITTEXT:
result = es->buffer_limit;
break;
case EM_POSFROMCHAR:
result = strlenW(es->text);
if ((INT)wParam >= result) result = -1;
else result = EDIT_EM_PosFromChar(es, (INT)wParam, FALSE);
break;
case EM_CHARFROMPOS:
result = EDIT_EM_CharFromPos(es, (short)LOWORD(lParam), (short)HIWORD(lParam));
break;
/* End of the EM_ messages which were in numerical order; what order
* are these in? vaguely alphabetical?
*/
case WM_NCCREATE:
result = EDIT_WM_NCCreate(hwnd, (LPCREATESTRUCTW)lParam, unicode);
break;
case WM_DESTROY:
result = EDIT_WM_Destroy(es);
es = NULL;
break;
case WM_GETDLGCODE:
result = DLGC_HASSETSEL | DLGC_WANTCHARS | DLGC_WANTARROWS;
if (es->style & ES_MULTILINE)
{
result |= DLGC_WANTALLKEYS;
break;
}
if (lParam && (((LPMSG)lParam)->message == WM_KEYDOWN))
{
int vk = (int)((LPMSG)lParam)->wParam;
if (es->hwndListBox && (vk == VK_RETURN || vk == VK_ESCAPE))
{
if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0))
result |= DLGC_WANTMESSAGE;
}
}
break;
case WM_IME_CHAR:
if (!unicode)
{
WCHAR charW;
CHAR strng[2];
strng[0] = wParam >> 8;
strng[1] = wParam & 0xff;
if (strng[0]) MultiByteToWideChar(CP_ACP, 0, strng, 2, &charW, 1);
else MultiByteToWideChar(CP_ACP, 0, &strng[1], 1, &charW, 1);
EDIT_WM_Char(es, charW);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -