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

📄 edit.c

📁 libminigui-1.3.0.tar.gz。 miniGUI的库函数源代码!
💻 C
📖 第 1 页 / 共 2 页
字号:
                case SCANCODE_HOME:                    if (sled->editPos == 0)                        return 0;                    sled->editPos  = 0;                    if (sled->startPos != 0) {                        sled->startPos = 0;                        InvalidateRect (hWnd, NULL, TRUE);                    }                    SetCaretPos (hWnd, sled->leftMargin, sled->topMargin);                return 0;                           case SCANCODE_END:                {                    int newStartPos;                                       if (sled->editPos == sled->nr_chars)                        return 0;                    sled->editPos = sled->nr_chars;                    newStartPos = edtGetStartDispPosAtEnd (hWnd, sled);                    if (sled->startPos != newStartPos) {                        sled->startPos = newStartPos;                        InvalidateRect (hWnd, NULL, TRUE);                    }                    SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                     sled->topMargin);                }                return 0;                case SCANCODE_CURSORBLOCKLEFT:                {                    BOOL bScroll = FALSE;                                        if (sled->editPos == 0)                        return 0;                    if (sled->editPos == sled->startPos) {                        sled->editPos --;                        sled->startPos = edtGetPosByX (sled,                                         DX_CHARS(editPos) - edtGetOutWidth (hWnd, sled)/4);                        bScroll = TRUE;                    }                    else                        sled->editPos --;                    SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                  sled->topMargin);                    if (bScroll)                        InvalidateRect (hWnd, NULL, TRUE);                }                return 0;                                case SCANCODE_CURSORBLOCKRIGHT:                {                    BOOL bScroll = FALSE;                    int  out_width = edtGetOutWidth (hWnd, sled);                    if (sled->editPos == sled->nr_chars)                        return 0;                    if ((DX_CHARS(editPos) - DX_CHARS(startPos) <= out_width)                                     && (sled->dx_chars[sled->editPos + 1] - DX_CHARS(startPos) > out_width)) {                            bScroll = TRUE;                            sled->editPos ++;                                sled->startPos = edtGetPosByX (sled, (DX_CHARS(editPos) - out_width /4));                        if ((DX_CHARS(startPos) + out_width) > sled->extent.cx)                             sled->startPos = edtGetStartDispPosAtEnd (hWnd, sled);                    }                    else                         sled->editPos ++;                    SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                  sled->topMargin);                    if (bScroll)                        InvalidateRect (hWnd, NULL, TRUE);                }                return 0;                                case SCANCODE_INSERT:                    sled = (PSLEDITDATA) (pCtrl->dwAddData2);                    sled->status ^= EST_REPLACE;                break;                case SCANCODE_REMOVE:                {                    int deleted, i;                                    sled = (PSLEDITDATA) (pCtrl->dwAddData2);                    if ((dwStyle & ES_READONLY) || (sled->editPos == sled->nr_chars))                        return 0;                                        deleted = sled->pos_chars[sled->editPos + 1] - POS_CHARS(editPos);                    for (i = POS_CHARS(editPos); i < sled->dataEnd - deleted; i++)                        sled->buffer [i] = sled->buffer [i + deleted];                    sled->dataEnd -= deleted;                    edtGetLineInfo (hWnd, sled);                    bChange = TRUE;                    SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                     sled->topMargin);                    InvRect.left = (DX_CHARS(editPos) - DX_CHARS(startPos)) + sled->leftMargin - 1;                    InvalidateRect (hWnd, &InvRect, TRUE);                }                break;                case SCANCODE_BACKSPACE:                {                    int deleted, i;                    sled = (PSLEDITDATA) (pCtrl->dwAddData2);                                if ((dwStyle & ES_READONLY)                            || (sled->editPos == 0)) {                        return 0;                    }                    deleted = POS_CHARS(editPos) - sled->pos_chars[sled->editPos - 1];                    for (i = POS_CHARS(editPos); i < sled->dataEnd; i++)                        sled->buffer [i - deleted] = sled->buffer [i];                    sled->dataEnd -= deleted;                    if (sled->startPos == sled->editPos) {                        sled->editPos --;                        sled->startPos = edtGetPosByX (sled,                                         DX_CHARS(editPos) - edtGetOutWidth (hWnd, sled)/4);                    }                    else {                        sled->editPos --;                        InvRect.left = (DX_CHARS(editPos) - DX_CHARS(startPos))                                       + sled->leftMargin - 1;                    }                    bChange = TRUE;                                        edtGetLineInfo (hWnd, sled);                                        SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                     sled->topMargin);                    InvalidateRect (hWnd, &InvRect, TRUE);                }                break;                default:                break;            }                   if (bChange)                NotifyParent (hWnd, pCtrl->id, EN_CHANGE);            return 0;        }        case MSG_CHAR:        {            unsigned char charBuffer [2];            int  i, chars, inserting, olddispLen, out_width;            RECT InvRect;            BOOL bScroll = FALSE;            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            InvRect.left = sled->leftMargin - 1;            InvRect.top = sled->topMargin;            InvRect.right = pCtrl->cr - pCtrl->cl;            InvRect.bottom = pCtrl->cb - pCtrl->ct;            if (dwStyle & ES_READONLY) {                return 0;            }                        if (HIBYTE (wParam)) {                charBuffer [0] = LOBYTE (wParam);                charBuffer [1] = HIBYTE (wParam);                chars = 2;            }            else {                chars = 1;                if (dwStyle & ES_UPPERCASE) {                    charBuffer [0] = toupper (LOBYTE (wParam));                }                else if (dwStyle & ES_LOWERCASE) {                    charBuffer [0] = tolower (LOBYTE (wParam));                }                else                    charBuffer [0] = LOBYTE (wParam);            }                        if (chars == 1) {                if (charBuffer [0] < 0x20 || charBuffer [0] == 0x7F)                    return 0;            }            if (sled->status & EST_REPLACE) {                if (sled->nr_chars == sled->editPos)                    inserting = chars;                else                     inserting = chars - ( sled->pos_chars[sled->editPos + 1] - POS_CHARS(editPos) );            }            else                inserting = chars;            // check space            if (sled->dataEnd + inserting > sled->bufferLen) {                Ping ();                NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);                return 0;            }            else if ((sled->hardLimit >= 0) && ((sled->dataEnd + inserting) > sled->hardLimit)) {                Ping ();                NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);                return 0;            }            olddispLen = DX_CHARS(editPos) - DX_CHARS(startPos);            if (inserting == -1) {                for (i = POS_CHARS(editPos); i < sled->dataEnd - 1; i++)                    sled->buffer [i] = sled->buffer [i + 1];            }            else if (inserting > 0) {                for (i = sled->dataEnd + inserting - 1; i > POS_CHARS(editPos) + inserting - 1; i--)                    sled->buffer [i] = sled->buffer [i - inserting];            }            for (i = 0; i < chars; i++)                sled->buffer [POS_CHARS(editPos) + i] = charBuffer [i];                        sled->editPos += 1;            sled->dataEnd += inserting;            edtGetLineInfo (hWnd, sled);            out_width = edtGetOutWidth (hWnd, sled);            if (((DX_CHARS(editPos) - DX_CHARS(startPos)) >= out_width)                    && ((sled->dx_chars[sled->editPos - 1] - DX_CHARS(startPos)) < out_width)) {                bScroll = TRUE;                sled->startPos = edtGetPosByX (sled, DX_CHARS(editPos) - out_width * 3 / 4);            }                        SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                             sled->topMargin);            if (!bScroll)                InvRect.left = sled->leftMargin + olddispLen - 1;            InvalidateRect (hWnd, &InvRect, TRUE);            NotifyParent (hWnd, pCtrl->id, EN_CHANGE);            return 0;        }        case MSG_GETTEXTLENGTH:            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            return sled->dataEnd;                case MSG_GETTEXT:        {            char*   buffer = (char*)lParam;            int     len;            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            len = MIN ((int)wParam, sled->dataEnd);            memcpy (buffer, sled->buffer, len);            buffer [len] = '\0';            return len;        }        case MSG_SETTEXT:        {            int len;            sled = (PSLEDITDATA) (pCtrl->dwAddData2);                        if (lParam == 0)                return -1;            len = strlen ((char*)lParam);            len = MIN (len, sled->bufferLen);                        if (sled->hardLimit >= 0)                len = MIN (len, sled->hardLimit);                       sled->dataEnd  = len;            memcpy (sled->buffer, (char*)lParam, len);            edtGetLineInfo (hWnd, sled);            sled->editPos  = 0;            sled->startPos = 0;            if (sled->status & EST_FOCUSED)                SetCaretPos (hWnd, sled->leftMargin, sled->topMargin);            InvalidateRect (hWnd, NULL, TRUE);            return 0;        }        case MSG_LBUTTONDBLCLK:            NotifyParent (hWnd, pCtrl->id, EN_DBLCLK);            break;                case MSG_LBUTTONDOWN:        {            sled = (PSLEDITDATA) (pCtrl->dwAddData2);                        sled->editPos = edtGetPosByX (sled, LOSWORD (lParam) + DX_CHARS(startPos));            SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                             sled->topMargin);            NotifyParent (hWnd, pCtrl->id, EN_CLICKED);            break;        }#if 0        case MSG_LBUTTONUP:        case MSG_MOUSEMOVE:            break;#endif                case MSG_GETDLGCODE:            return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTENTER;        case MSG_DOESNEEDIME:            if (dwStyle & ES_READONLY)                return FALSE;            return TRUE;                case EM_GETCARETPOS:        {            int* line_pos = (int *)wParam;            int* char_pos = (int *)lParam;            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            if (line_pos) *line_pos = 0;            if (char_pos) *char_pos = sled->editPos;            return sled->editPos;        }        case EM_SETCARETPOS:        {            int char_pos = (int)lParam;            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            if (char_pos >= 0 && char_pos <= sled->nr_chars) {                sled->editPos = char_pos;                if (sled->status & EST_FOCUSED)                    SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin,                                     sled->topMargin);                return 0;            }            return -1;        }        case EM_SETREADONLY:            if (wParam)                pCtrl->dwStyle |= ES_READONLY;            else                pCtrl->dwStyle &= ~ES_READONLY;            return 0;                case EM_SETPASSWORDCHAR:            sled = (PSLEDITDATA) (pCtrl->dwAddData2);            if (sled->passwdChar != (int)wParam) {                if (dwStyle & ES_PASSWORD) {                    sled->passwdChar = (int)wParam;                    InvalidateRect (hWnd, NULL, TRUE);                }            }            return 0;            case EM_GETPASSWORDCHAR:        {            int* passwdchar;                        sled = (PSLEDITDATA) (pCtrl->dwAddData2);            passwdchar = (int*) lParam;            *passwdchar = sled->passwdChar;            return 0;        }            case EM_LIMITTEXT:        {            int newLimit = (int)wParam;                        if (newLimit >= 0) {                sled = (PSLEDITDATA) (pCtrl->dwAddData2);                if (sled->bufferLen < newLimit)                    sled->hardLimit = -1;                else                    sled->hardLimit = newLimit;            }            return 0;        }            default:            break;    }     return DefaultControlProc (hWnd, message, wParam, lParam);}#endif /* _CTRL_SLEDIT */

⌨️ 快捷键说明

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