📄 x3.c
字号:
oldpen; RECT r; HBRUSH graybrush; LOGBRUSH lbrush; PAINTSTRUCT paint;
int childheight; int startpos, endpos, flag, i; HWND win; FILETIME
time; NMHDR *nm; int rv; charinfo s; switch (iMessage)
{
case EN_LINECHANGE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); TagLineChange(ptr->dwName,
wParam + 1, lParam); GetClientRect(hwnd, &r); r.right =
EDITOR_OFFSET; InvalidateRect(hwnd, &r, 0); break; case WM_NOTIFY:
nm = (NMHDR*)lParam; if (nm->code == NM_RCLICK)
{
HMENU menu = LoadMenu(hInstance, "EDITMENU"); HMENU popup =
GetSubMenu(menu, 0); POINT pos, pos1; ptr = (DWINFO*)
GetWindowLong(hwnd, 0); SendMessage(hwnd, EN_SETCURSOR, 0,
0); if (!SendMessage(ptr->dwHandle, EM_GETMODIFY, 0, 0))
EnableMenuItem(menu, IDM_SAVE, MF_GRAYED); if (uState !=
atBreakpoint && uState != atException)
{
EnableMenuItem(menu, IDM_RUNTO, MF_GRAYED); EnableMenuItem
(menu, IDM_ADDWATCHINDIRECT, MF_GRAYED);
}
GetCursorPos(&pos); pos1.x = pos.x; pos1.y = pos.y;
ScreenToClient(ptr->dwHandle, &pos1); i = SendMessage(ptr
->dwHandle, EM_CHARFROMPOS, 0, (LPARAM) &pos1); s.min = i;
s.max = i; SendMessage(ptr->dwHandle, EM_EXSETSEL, 0,
(LPARAM) &s); TrackPopupMenuEx(popup, TPM_BOTTOMALIGN |
TPM_LEFTBUTTON, pos.x, pos.y, hwndFrame, NULL); DestroyMenu
(menu);
}
return 0; case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)return SendMessage(hwnd, WM_COMMAND, IDM_CLOSE,
0); break; case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_CONTEXTHELP:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); i = SendMessage(ptr
->dwHandle, WM_COMMAND, wParam, lParam); break; case IDM_GOTO:
lParam = DialogBox(hInstance, "GOTODIALOG", hwnd, (DLGPROC)
gotoProc); if (lParam == 0)break;
// fall through
case IDM_SETLINE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); SendMessage(ptr
->dwHandle, EM_GETLINECOUNT, 0, 0);
// force update of vertical scroll range
i = SendMessage(ptr->dwHandle, EM_LINEINDEX, lParam - 1, 0); s.min
= i; s.max = i; SendMessage(ptr->dwHandle, EM_EXSETSEL, 0,
(LPARAM) &s); SendMessage(ptr->dwHandle, EM_SCROLLCARET, 0, 0);
drawParams(ptr, hwnd); found = FALSE; InvalidateRect(hwnd, 0, 0)
; break; case ID_REDRAWSTATUS:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); drawParams(ptr, hwnd);
InvalidateRect(hwnd, 0, 0); break; case ID_QUERYHASFILE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); ptr1 = (DWINFO*)lParam;
return !xstricmpz(ptr->dwName, ptr1->dwName); case ID_QUERYSAVE:
ptr = (DWINFO*)GetWindowLong(hwnd, 0); rv = SendMessage(ptr
->dwHandle, EM_GETMODIFY, 0, 0); if (rv)
{
return ExtendedMessageBox("File Has Changed",
MB_YESNOCANCEL,
"File %s has changed. Do you wish to save it?", ptr
->dwTitle);
}
else
return IDNO; case IDM_SAVEAS:
dialog: ptr = (DWINFO*)GetWindowLong(hwnd, 0); if
(!SaveFileDialog(&ofn, ptr->dwName, hwnd, TRUE,
szSourceFilter, "FILEDIR", 0))break; if (projectList && ptr
->dwName[0] == 0)
{
if (ExtendedMessageBox("Project Query", MB_TASKMODAL |
MB_YESNO, "Add file to project?") == IDYES)
{
AddFileInternal(projectList, 0, ofn.lpstrFile,
ofn.lpstrFileTitle);
}
}
strcpy(ptr->dwTitle, ofn.lpstrFileTitle); strcpy(ptr->dwName,
ofn.lpstrFile); SetWindowText(hwnd, ptr->dwTitle); recolorize
(ptr); 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:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_UNDO, 0, 0); break;
case IDM_CUT:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_CUT, 0, 0); break;
case IDM_COPY:
SendMessage(GetDlgItem(hwnd, ID_EDITCHILD), WM_COPY, 0, 0); break;
case IDM_PASTE:
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);
}
//-------------------------------------------------------------------------
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 + -