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

📄 edit.c

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 C
📖 第 1 页 / 共 3 页
字号:
}
*/

static int sleMouseMove (HWND hWnd, PSLEDITDATA sled, LPARAM lParam)
{
    int mouseX, mouseY;
    RECT rcClient;
    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 int
sleInsertText (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;

⌨️ 快捷键说明

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