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

📄 edit.c

📁 有了操作系统、TCP/IP协议栈、文件系统
💻 C
📖 第 1 页 / 共 3 页
字号:
    BOOL refresh = TRUE;    mouseX = LOSWORD(lParam);    mouseY = HISWORD(lParam);    ScreenToClient(hWnd, &mouseX, &mouseY);    GetClientRect(hWnd, &rcClient);        if(mouseX >= 0 && mouseX < rcClient.right       && mouseY >= 0 && mouseY < rcClient.bottom) {//in edit window        set_caret_pos (hWnd, sled, mouseX, TRUE);        if (sled->editPos == sled->selStart)            make_charpos_visible (hWnd, sled, sled->selEnd, NULL);        else            make_charpos_visible (hWnd, sled, sled->selStart, NULL);    }    else if (mouseY < 0) {        sled->nContX = 0;        sled->selStart = 0;        sled->selEnd = sled->editPos;    }    else if(mouseY >= rcClient.bottom) {        sled->selStart = sled->editPos;        sled->selEnd = sled->content.txtlen;        sled->nContX = sled->nContW - (sled->rcCont.right - sled->rcCont.left);     }    else if (mouseX < 0) {        if (sled->selEnd == sled->content.txtlen) {            set_caret_pos (hWnd, sled, 0, TRUE);            make_charpos_visible (hWnd, sled, sled->selStart, NULL);            goto quit;        }        if (sled->selStart == 0)            return 0;        shift_one_char_l (selStart);        refresh = make_charpos_visible (hWnd, sled, sled->selStart, NULL);    }    else if (mouseX >= rcClient.right) {        if (sled->selStart == 0) {            set_caret_pos (hWnd, sled, rcClient.right - 1, TRUE);            //make_charpos_visible (hWnd, sled, sled->selEnd, NULL);            //goto quit;        }        if (sled->selEnd == sled->content.txtlen)            return 0;        shift_one_char_r (selEnd);        refresh = make_charpos_visible (hWnd, sled, sled->selEnd, NULL);    } quit:    check_caret();    if (refresh)        InvalidateRect(hWnd, NULL, TRUE);    return 0;}static intsleInsertText (HWND hWnd, PSLEDITDATA sled, const char *newtext, int inserting){    int  deleted;    unsigned char *pIns, *content = sled->content.string;                //delete the seleted    if(sled->selStart != sled->selEnd) {        deleted = sled->selEnd - sled->selStart;        memmove (content + sled->selStart, content + sled->selEnd,                        sled->content.txtlen - sled->selEnd);        sled->content.txtlen -= deleted;        sled->editPos = sled->selStart;        sled->selEnd = sled->selStart;        ShowCaret(hWnd);        if (!newtext)            inserting = 0;    }    if ( !(sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0 &&                     ((sled->content.txtlen + inserting) > sled->hardLimit)) {        Ping ();        NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);        inserting = sled->hardLimit - sled->content.txtlen;        //return 0;    }    else if ( (sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0               && (sled->editPos + inserting > sled->hardLimit) ) {        Ping ();        NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);        inserting = sled->hardLimit - sled->editPos;    }    if (inserting > 0) {        content = testr_realloc (&sled->content, sled->content.txtlen +                                   inserting);        pIns = content + sled->editPos;        if ( !(sled->status & EST_REPLACE) )            memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos);        memcpy (pIns, newtext, inserting);    }    else if (inserting < 0) {        pIns = content + sled->editPos;        memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos);        content = testr_realloc (&sled->content, sled->content.txtlen +                                  inserting);    }    if (inserting <= 0 || !(sled->status & EST_REPLACE))        sled->content.txtlen += inserting;    else {        int add_len = inserting - sled->content.txtlen + sled->editPos;        if (add_len > 0) {            sled->content.txtlen += add_len;            sled->content.string[sled->content.txtlen] = '\0';        }    }    sled->editPos += inserting;    sled->selStart = sled->selEnd = sled->editPos;    if (!edtSetCaretPos (hWnd, sled))        InvalidateRect (hWnd, NULL, TRUE);        InvalidateRect (hWnd, NULL, TRUE);    NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);    return 0;}static int sleInsertCbText (HWND hWnd, PSLEDITDATA sled){    int  inserting;    unsigned char *txtBuffer;    if (GetWindowStyle(hWnd) & ES_READONLY) {        return 0;    }    inserting = GetClipBoardDataLen (CBNAME_TEXT);    txtBuffer = ALLOCATE_LOCAL (inserting);    GetClipBoardData (CBNAME_TEXT, txtBuffer, inserting);    sleInsertText (hWnd, sled, txtBuffer, inserting);    DEALLOCATE_LOCAL(txtBuffer);    return 0;}static int sleKeyDown (HWND hWnd, WPARAM wParam, LPARAM lParam){    BOOL    bChange = FALSE;    DWORD   dwStyle = GetWindowStyle (hWnd);    PCONTROL pCtrl   = Control(hWnd);    PSLEDITDATA sled = (PSLEDITDATA) (pCtrl->dwAddData2);    switch (LOWORD (wParam)) {    case SCANCODE_ENTER:        NotifyParent (hWnd, pCtrl->id, EN_ENTER);        return 0;    case SCANCODE_HOME:    {        BOOL refresh = FALSE;        if(lParam & KS_SHIFT) {            make_pos_visible (hWnd, sled, 0);            sled->selStart = 0;            sled->selEnd = sled->editPos;            check_caret();            InvalidateRect (hWnd, NULL, TRUE);            return 0;        }                    if (sled->selStart != sled->selEnd) {            ShowCaret(hWnd);            refresh = TRUE;        }        sled->editPos  = 0;        sled->selStart = sled->selEnd = 0;        if (!edtSetCaretPos (hWnd, sled) && refresh)            InvalidateRect (hWnd, NULL, TRUE);        return 0;    }       case SCANCODE_END:    {        BOOL refresh = FALSE;               if(lParam & KS_SHIFT) {            sled->selStart = sled->editPos;            sled->selEnd = sled->content.txtlen;            check_caret();            if (make_charpos_visible (hWnd, sled, sled->selEnd, NULL))                InvalidateRect(hWnd, NULL, TRUE);            return 0;        }        if (sled->selStart != sled->selEnd) {            ShowCaret(hWnd);            refresh = TRUE;        }        sled->editPos = sled->content.txtlen;        sled->selStart = sled->selEnd = sled->editPos;        if (!edtSetCaretPos (hWnd, sled) && refresh)            InvalidateRect (hWnd, NULL, TRUE);        return 0;    }    case SCANCODE_CURSORBLOCKLEFT:    {        BOOL refresh = FALSE;        if(lParam & KS_SHIFT) {            if (sled->selStart == sled->selEnd) {                sled->selStart = sled->selEnd = sled->editPos;            }            if (sled->selStart < sled->editPos ||                        sled->selStart == sled->selEnd) {                if (sled->selStart > 0)                    shift_one_char_l(selStart);            }            else {                shift_one_char_l(selEnd);            }            check_caret ();            make_charpos_visible (hWnd, sled, sled->selStart, NULL);            InvalidateRect (hWnd, NULL, TRUE);            return 0;        }        if (sled->editPos > 0) {            shift_one_char_l (editPos);        }        if (sled->selStart != sled->selEnd) {            ShowCaret (hWnd);            ActiveCaret (hWnd);            refresh = TRUE;        }        sled->selStart = sled->selEnd = sled->editPos;        if (!edtSetCaretPos (hWnd, sled) && refresh)            InvalidateRect (hWnd, NULL, TRUE);        return 0;    }        case SCANCODE_CURSORBLOCKRIGHT:    {        BOOL refresh = FALSE;        if(lParam & KS_SHIFT) {            if(sled->selStart == sled->selEnd)                sled->selStart = sled->selEnd = sled->editPos;            if (sled->selStart == sled->selEnd ||                             sled->selEnd > sled->editPos) {                if (sled->selEnd < sled->content.txtlen)                    shift_one_char_r (selEnd);            }            else {                shift_one_char_r (selStart);            }            check_caret ();            make_charpos_visible (hWnd, sled, sled->selStart, NULL);            InvalidateRect (hWnd, NULL, TRUE);            return 0;        }        if (sled->editPos < sled->content.txtlen) {            shift_one_char_r (editPos);        }        if (sled->selStart != sled->selEnd) {            ShowCaret (hWnd);            ActiveCaret (hWnd);            refresh = TRUE;        }        sled->selStart = sled->selEnd = sled->editPos;        if (!edtSetCaretPos (hWnd, sled) && refresh)            InvalidateRect (hWnd, NULL, TRUE);    }    return 0;        case SCANCODE_REMOVE:    {        int oldpos = sled->editPos;        if ((dwStyle & ES_READONLY))            return 0;        if (sled->editPos == sled->content.txtlen && sled->selStart == sled->selEnd)            return 0;        if (sled->selStart == sled->selEnd &&                         sled->editPos < sled->content.txtlen) {            shift_one_char_r(editPos);        }        sleInsertText (hWnd, sled, NULL, oldpos - sled->editPos);    }    break;/*    case SCANCODE_BACKSPACE:    {        int del;        if (dwStyle & ES_READONLY)            return 0;        if (sled->editPos == 0 && sled->selStart == sled->selEnd)            return 0;        del = - CHLENPREV( sled->content.string, (sled->content.string + sled->editPos) );        sleInsertText (hWnd, sled, NULL, del);    }    break;*/    case SCANCODE_A:    {        if (lParam & KS_CTRL) {            sleSetSel (hWnd, sled, 0, sled->content.txtlen);        }        return 0;    }#ifdef _CLIPBOARD_SUPPORT    case SCANCODE_C:    case SCANCODE_X:    {        if (lParam & KS_CTRL && sled->selEnd - sled->selStart > 0) {            SetClipBoardData (CBNAME_TEXT, sled->content.string + sled->selStart,                         sled->selEnd - sled->selStart, CBOP_NORMAL);            if (wParam == SCANCODE_X && !(GetWindowStyle(hWnd) & ES_READONLY)) {                sleInsertText (hWnd, sled, NULL, 0);            }        }        return 0;    }    case SCANCODE_V:    {        if (!(lParam & KS_CTRL))            return 0;        return sleInsertCbText (hWnd, sled);    }#endif /* _CLIPBOARD_SUPPORT */    case SCANCODE_INSERT:        sled->status ^= EST_REPLACE;        break;    default:        break;    } //end switch           if (bChange)        NotifyParent (hWnd, pCtrl->id, EN_CHANGE);    return 0;}static int SLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){       DWORD       dwStyle;    HDC         hdc;    PSLEDITDATA sled = NULL;    dwStyle     = GetWindowStyle(hWnd);    if (message != MSG_CREATE)        sled = (PSLEDITDATA) GetWindowAdditionalData2 (hWnd);    switch (message) {    case MSG_CREATE:        if ( !(sled = calloc (1, sizeof (SLEDITDATA))) )            return -1;        if (sledit_init (hWnd, sled) < 0)            return -1;        break;    case MSG_DESTROY:        sledit_destroy (hWnd, sled);        free (sled);        break;    case MSG_ERASEBKGND:        EditOnEraseBackground (hWnd, (HDC)wParam, (const RECT*)lParam);        return 0;    case MSG_PAINT:    {        hdc = BeginPaint (hWnd);        slePaint (hWnd, hdc, sled);        EndPaint (hWnd, hdc);        return 0;    }    case MSG_FONTCHANGING:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -