⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editor.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 + -