📄 editor.c
字号:
case IDM_SAVE:
save: ptr = (DWINFO*)GetWindowLong(hwnd, 0);
rv = SendMessage(ptr->dwHandle, EM_GETMODIFY, 0, 0);
if (!rv)
break;
if (ptr->dwName[0] == 0)
goto dialog;
rv = SaveFile(hwnd, (char*)GetWindowLong(hwnd, 0));
TagLinesAdjust(ptr->dwName, TAGM_SAVEFILE);
SendMessage(ptr->dwHandle, EM_SETMODIFY, 0, 0);
drawParams(ptr, hwnd);
return rv;
break;
case IDM_CLOSE:
{
rv = SendMessage(hwnd, WM_COMMAND, ID_QUERYSAVE, 0);
switch (rv)
{
case IDYES:
if (SendMessage(hwnd, WM_COMMAND, IDM_SAVE, 0))
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case IDNO:
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
TagLinesAdjust(ptr->dwName, TAGM_DISCARDFILE);
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case IDCANCEL:
break;
}
return rv;
}
break;
case IDM_UNDO:
found = FALSE;
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_UNDO, 0, 0);
break;
case IDM_CUT:
found = FALSE;
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_CUT, 0, 0);
break;
case IDM_COPY:
found = FALSE;
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_COPY, 0, 0);
break;
case IDM_PASTE:
found = FALSE;
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_PASTE, 0, 0);
break;
case IDM_SELECTALL:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_SETSEL, 0, - 1);
break;
case IDM_FIND:
PopFindString(hwnd);
break;
case IDM_REPLACE:
PopReplaceString(hwnd);
break;
case IDM_FINDNEXT:
if (finding)
FindNextString(hwnd, &find, 0, 0);
else
ReplaceNextString(hwnd, &replace);
break;
case IDM_TOUPPER:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_TOUPPER, 0, 0);
break;
case IDM_TOLOWER:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_TOLOWER, 0, 0);
break;
case IDM_INDENT:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_SELECTINDENT, 0,
1);
break;
case IDM_UNINDENT:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_SELECTINDENT, 0,
0);
break;
default:
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
break;
case EM_CANUNDO:
return SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_CANUNDO, 0, 0)
;
case EN_SETCURSOR:
found = FALSE;
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
drawParams(ptr, hwnd);
GetClientRect(hwnd, &r);
r.right = EDITOR_OFFSET - 3;
InvalidateRect(hwnd, &r, 0);
break;
case WM_PAINT:
GetClientRect(hwnd, &r);
dc = BeginPaint(hwnd, &paint);
hpen = CreatePen(PS_SOLID, 1, 0xcccccc), oldpen;
r.right = EDITOR_OFFSET - 3;
MoveToEx(dc, EDITOR_OFFSET - 1, 0, 0);
LineTo(dc, EDITOR_OFFSET - 1, r.bottom);
oldpen = SelectObject(dc, hpen);
MoveToEx(dc, EDITOR_OFFSET - 2, 0, 0);
LineTo(dc, EDITOR_OFFSET - 2, r.bottom);
SelectObject(dc, oldpen);
DeleteObject(hpen);
PaintBreakpoints(hwnd, dc, &paint, &r);
EndPaint(hwnd, &paint);
return 0;
case WM_CREATE:
// maximized = TRUE ;
ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWINFO));
SetWindowLong(hwnd, 0, (int)ptr);
SetWindowLong(hwnd, 4, (int)EDITSIG);
memset(ptr, 0, sizeof(*ptr));
if (newInfo == (DWINFO*) - 1)
{
SetWindowText(hwnd, szUntitled);
}
else
{
strcpy(ptr->dwTitle, newInfo->dwTitle);
SetWindowText(hwnd, newInfo->dwTitle);
strcpy(ptr->dwName, newInfo->dwName);
FileTime(&ptr->time, ptr->dwName);
}
ptr->dwHandle = CreateWindowEx(0, "xedit", 0, WS_CHILD +
WS_CLIPSIBLINGS + WS_HSCROLL + WS_VSCROLL + ES_LEFT +
ES_MULTILINE + ES_NOHIDESEL + ES_AUTOVSCROLL + ES_AUTOHSCROLL,
EDITOR_OFFSET, 0, 0, 0, hwnd, (HMENU)ID_EDITCHILD, hInstance, 0)
;
ptr->self = hwnd;
ptr->dwLineNo = - 1;
if (newInfo && newInfo != (DWINFO*) - 1 && newInfo->dwLineNo != -
1)
{
ptr->dwLineNo = newInfo->dwLineNo;
newInfo->dwLineNo = - 1;
}
if (newInfo != (DWINFO*) - 1 && newInfo->logMRU)
{
InsertMRU(ptr, 0);
MRUToMenu(0);
}
// CloseHandle(CreateThread(0,0,(LPTHREAD_START_ROUTINE)asyncLoadFile,(LPVOID)ptr,0,&threadhand)) ;
recolorize(ptr);
if (ptr->dwName[0])
LoadFile(ptr->self, ptr);
else
ShowWindow(ptr->dwHandle, SW_SHOW);
children[numberofdrawwindows++] = hwnd;
if (ptr->dwLineNo != - 1)
{
PostMessage(ptr->self, WM_COMMAND, IDM_SETLINE, ptr->dwLineNo);
}
PostMessage(hwndSourceTab, WM_RESETTABS, 0, 0);
return 0;
case WM_CLOSE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
eraseParams(ptr->dwHandle);
break;
case WM_DESTROY:
for (i = 0; i < numberofdrawwindows; i++)
if (children[i] == hwnd)
break;
if (i < numberofdrawwindows - 1)
memcpy(children + i, children + i + 1, (numberofdrawwindows - i
- 1) *sizeof(HWND));
if (--numberofdrawwindows == 0 && IsWindow(hwndFind))
{
DestroyWindow(hwndFind);
hwndFind = 0;
}
SendMessage(hwndSourceTab, WM_RESETTABS, 0, 0);
HeapFree(GetProcessHeap(), 0, (void*)GetWindowLong(hwnd, 0));
PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case WM_SIZE:
MoveWindow(GetDlgItem(hwnd, ID_EDITCHILD), EDITOR_OFFSET, 0,
(lParam &65535) - EDITOR_OFFSET, lParam >> 16, 1);
break;
case WM_MDIACTIVATE:
found = FALSE;
break;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, ID_EDITCHILD));
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
drawParams(ptr, hwnd);
InvalidateRect(hwnd, 0, 0);
PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
PostMessage(hwndSourceTab, WM_SETACTIVETAB, 0, (LPARAM)hwnd);
return 0;
case WM_KILLFOCUS:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), iMessage, wParam,
lParam);
return 0;
case WM_INITMENUPOPUP:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), EM_GETSEL, (WPARAM)
&startpos, (LPARAM) &endpos);
flag = startpos < endpos;
EnableMenuItem(hMenuMain, IDM_CUT, flag);
EnableMenuItem(hMenuMain, IDM_COPY, flag);
EnableMenuItem(hMenuMain, IDM_PASTE, 1);
EnableMenuItem(hMenuMain, IDM_UNDO, SendMessage(GetDlgItem(hwnd,
ID_EDITCHILD), EM_CANUNDO, 0, 0));
EnableMenuItem(hMenuMain, IDM_BROWSE, flag);
//EnableMenuItem(hMenuMain,IDM_BROWSEBACK,flag) ;
EnableMenuItem(hMenuMain, IDM_BOOKMARK, flag);
//EnableMenuItem(hMenuMain,IDM_NEXTBOOKMARK,flag) ;
//EnableMenuItem(hMenuMain,IDM_PREVBOOKMARK,flag) ;
return 0;
case WM_WORDUNDERCURSOR:
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
return SendMessage(ptr->dwHandle, iMessage, wParam, lParam);
case WM_FILETITLE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
return ptr->dwTitle;
case WM_FILENAME:
ptr = (DWINFO*)GetWindowLong(hwnd, 0);
return ptr->dwName;
default:
if (iMessage == iFindMessage)
{
HWND edit;
if (finding)
{
edit = GetDlgItem(hwndFind, 1152);
SendMessage(edit, WM_SAVEHISTORY, 0, 0);
if (find.Flags &FR_FINDNEXT)
FindNextString(hwnd, &find, 0, 0);
// if (find.Flags & FR_DIALOGTERM)
// hwndFind = 0 ;
}
else
{
edit = GetDlgItem(hwndFind, 1152);
SendMessage(edit, WM_SAVEHISTORY, 0, 0);
edit = GetDlgItem(hwndFind, 1153);
SendMessage(edit, WM_SAVEHISTORY, 0, 0);
if (replace.Flags &(FR_FINDNEXT | FR_REPLACE |
FR_REPLACEALL))
ReplaceNextString(hwnd, &replace);
// if (replace.Flags & FR_DIALOGTERM)
// hwndFind = 0 ;
}
}
break;
}
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
void RegisterDrawWindow(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = &DrawProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(void*) * 2;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szDrawClassName;
pcBitmap = LoadBitmap(hInstance, "ID_PCBMP");
stoppcBitmap = LoadBitmap(hInstance, "ID_STOPPCBMP");
tagBmps[TAG_BP] = LoadBitmap(hInstance, "ID_STOPBMP");
tagBmps[TAG_FIF1] = LoadBitmap(hInstance, "ID_FIF1BMP");
tagBmps[TAG_FIF2] = LoadBitmap(hInstance, "ID_FIF2BMP");
tagBmps[TAG_BOOKMARK] = LoadBitmap(hInstance, "ID_BOOKMARKBMP");
tagBmps[TAG_BPGRAYED] = LoadBitmap(hInstance, "ID_STOPDISBMP");
ChangeBitmapColor(pcBitmap, 0xffffff, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(stoppcBitmap, 0xffffff, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(tagBmps[TAG_BP], 0, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(tagBmps[TAG_FIF1], 0, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(tagBmps[TAG_FIF2], 0, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(tagBmps[TAG_BOOKMARK], 0, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(tagBmps[TAG_BPGRAYED], 0, GetSysColor(COLOR_3DFACE));
RegisterClass(&wc);
findflags = ProfileToInt("FindFlags", 12);
replaceflags = ProfileToInt("ReplaceFlags", 4);
editFlags = ProfileToInt("EditFlags",editFlags) ;
}
//-------------------------------------------------------------------------
HWND openfile(DWINFO *newInfo)
{
MDICREATESTRUCT mc;
HWND rv;
BOOL maximized;
SendMessage(hwndClient, WM_MDIGETACTIVE, 0, (LPARAM) &maximized);
memset(&mc, 0, sizeof(mc));
mc.szClass = szDrawClassName;
mc.szTitle = szUntitled;
mc.hOwner = hInstance;
mc.x = childxpos;
mc.y = childypos;
mc.cx = 0;
mc.cy = 0;
mc.style = WS_VISIBLE | WS_CHILD | WS_OVERLAPPEDWINDOW | WS_SYSMENU |
WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | (maximized ? WS_MAXIMIZE
: 0);
mc.lParam = 0;
rv = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM) &mc);
childxpos += 20;
childypos += 20;
if (childxpos > 120)
childxpos = childypos = 0;
return rv;
}
//-------------------------------------------------------------------------
HWND CreateDrawWindow(DWINFO *baseinfo)
{
int i;
DWINFO temp;
OPENFILENAME ofn;
if (baseinfo && baseinfo != (DWINFO*) - 1)
for (i = 0; i < MAX_CHILDREN; i++)
if (children[i] && SendMessage(children[i], WM_COMMAND, ID_QUERYHASFILE,
(LPARAM)baseinfo))
{
BringWindowToTop(children[i]);
SetFocus(children[i]);
if (baseinfo->dwLineNo != - 1)
PostMessage(children[i], WM_COMMAND, IDM_SETLINE, baseinfo
->dwLineNo);
return children[i];
}
if (numberofdrawwindows >= MAX_CHILDREN)
{
ExtendedMessageBox("Error", MB_SETFOREGROUND | MB_SYSTEMMODAL,
"Too many edit windows open");
return 0;
}
newInfo = baseinfo;
if (!newInfo)
{
newInfo = &temp;
newInfo->dwLineNo = - 1;
newInfo->logMRU = TRUE;
if (OpenFileDialog(&ofn, 0, 0, FALSE, TRUE, szSourceFilter, "FILEDIR",
0))
{
char *q = ofn.lpstrFile, path[256];
strcpy(path, ofn.lpstrFile);
q += strlen(q) + 1;
if (! *q)
{
strcpy(newInfo->dwTitle, ofn.lpstrFileTitle);
strcpy(newInfo->dwName, ofn.lpstrFile);
}
else
{
while (*q)
{
strcpy(newInfo->dwTitle, q);
sprintf(newInfo->dwName, "%s\\%s", path, q);
openfile(newInfo);
q += strlen(q) + 1;
}
return 0;
}
}
else
{
// ExtendedMessageBox("File Open",MB_SETFOREGROUND | MB_SYSTEMMODAL,"Could not open file %s %d",newInfo->dwName,GetLastError()) ;
return 0;
}
}
return openfile(newInfo);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -