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

📄 edit.c

📁 TN-kernel内核针对LPC系列ARM7处理器和S3C44B0X重新定制好的源代码包。内含Nano-X GUI。
💻 C
📖 第 1 页 / 共 3 页
字号:
            pSLEditData->hardLimit      = -1;

            /* undo information */
            pSLEditData->lastOp         = EDIT_OP_NONE;
            pSLEditData->lastPos        = 0;
            pSLEditData->affectedLen    = 0;
            pSLEditData->undoBufferLen  = LEN_SLEDIT_UNDOBUFFER;
            pSLEditData->undoBuffer [0] = '\0';

            pSLEditData->dataEnd        = strlen (pCtrl->szTitle);
            memcpy (pSLEditData->buffer, pCtrl->szTitle,
                    min (LEN_SLEDIT_BUFFER, pSLEditData->dataEnd));

            pCtrl->userdata2 = (DWORD) pSLEditData;

            pCtrl->userdata  = 0;
        break;

        case WM_DESTROY:
            DestroyCaret ();

            free ((void*)pCtrl->userdata2);
        break;
#if 0
        case WM_CHANGESIZE:
        {
            pCtrl->cl = pCtrl->left   + WIDTH_EDIT_BORDER;
            pCtrl->ct = pCtrl->top    + WIDTH_EDIT_BORDER;
            pCtrl->cr = pCtrl->right  - WIDTH_EDIT_BORDER;
            pCtrl->cb = pCtrl->bottom - WIDTH_EDIT_BORDER;
        }
        break;
#endif

#if 1        /* jmt: for edit: chinese support */
        case WM_SETFONT:
        {
                pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
                pSLEditData->hFont = (HFONT)wParam;

                ShowWindow(hWnd, SW_HIDE);
                ShowWindow(hWnd, SW_SHOWNA);

                if(LOWORD(lParam))
                            InvalidateRect(hWnd,NULL,TRUE);
        }
        return (LRESULT)0;

        case WM_GETFONT:
                pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
                return (LRESULT)pSLEditData->hFont;
#endif

#if 0
        case WM_SETCURSOR:
            if (dwStyle & WS_DISABLED)
            {
                SetCursor (GetSystemCursor (IDC_ARROW));
                return 0;
            }
        break;
#endif
        case WM_KILLFOCUS:
            pCtrl->userdata &= ~EST_FOCUSED;

            HideCaret (hWnd);
            DestroyCaret ();

            SendMessage (GetParent (hWnd), WM_COMMAND,
                 (WPARAM) MAKELONG (pCtrl->id, EN_KILLFOCUS), (LPARAM)hWnd);
        break;

        case WM_SETFOCUS:
            if (pCtrl->userdata & EST_FOCUSED)
                return 0;

            pCtrl->userdata |= EST_FOCUSED;

            pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
            /* only implemented for ES_LEFT align format. */

            CreateCaret (hWnd, NULL, 1 /*+ GetSysCharWidth(hWnd)*/,
                    hWnd->clirect.bottom-hWnd->clirect.top-2);
            SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                    + pSLEditData->leftMargin, pSLEditData->topMargin);
            ShowCaret (hWnd);

            SendMessage (GetParent (hWnd), WM_COMMAND,
               (WPARAM) MAKELONG (pCtrl->id, EN_SETFOCUS), (LPARAM) hWnd);
        break;

        case WM_ENABLE:
            if ( (!(dwStyle & WS_DISABLED) && !wParam)
                    || ((dwStyle & WS_DISABLED) && wParam) ) {
                if (wParam)
                    pCtrl->style &= ~WS_DISABLED;
                else
                    pCtrl->style |=  WS_DISABLED;

                InvalidateRect (hWnd, NULL, FALSE);
            }
        break;

        case WM_NCCALCSIZE:
        {
                LPNCCALCSIZE_PARAMS lpnc;

                /* calculate client rect from passed window rect in rgrc[0]*/
                lpnc = (LPNCCALCSIZE_PARAMS)lParam;
                if(GetWindowLong(hWnd, GWL_STYLE) & WS_BORDER)
                        InflateRect(&lpnc->rgrc[0], -2, -2);
        }
                break;

        case WM_NCPAINT:
            hdc = wParam? (HDC)wParam: GetWindowDC (hWnd);
            GetWindowRect(hWnd, &rc);

            if (dwStyle & WS_BORDER)
                Draw3dInset(hdc, rc.left, rc.top,
                        rc.right-rc.left, rc.bottom-rc.top);

            if (!wParam)
                ReleaseDC (hWnd, hdc);
            break;

        case WM_PAINT:
        {
            int     dispLen;
            char*   dispBuffer;
            RECT    rect,rc;
            PAINTSTRUCT ps;

            HGDIOBJ oldfont;
            oldfont=NULL;

            hdc = BeginPaint (hWnd,&ps);
            GetClientRect (hWnd, &rect);

            if (dwStyle & WS_DISABLED)
            {
#if 0
                SetBrushColor (hdc, LTGRAY/*COLOR_lightgray*/);
                FillBox (hdc, 0, 0, rect.right, rect.bottom);
#else
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));
#endif
                SetBkColor (hdc, LTGRAY/*COLOR_lightgray*/);
            }
            else
            {
#if 0
                SetBrushColor (hdc, WHITE/*COLOR_lightwhite*/);
                FillBox (hdc, 0, 0, rect.right, rect.bottom);
#else
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                FillRect(hdc,&rc,GetStockObject(WHITE_BRUSH));
#endif
                SetBkColor (hdc, WHITE/*COLOR_lightwhite*/);
            }

            SetTextColor (hdc, BLACK/*COLOR_black*/);
            dispLen = edtGetDispLen (pCtrl);
            if (dispLen == 0)
            {
                EndPaint (hWnd, &ps);
                break;
            }

            pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);

#ifdef _DEBUG
            if (pSLEditData->startPos > pSLEditData->dataEnd)
                fprintf (stderr, "ASSERT failure: %s.\n", "Edit Paint");
#endif

            dispBuffer = ALLOCA(dispLen + 1);

            if (dwStyle & ES_PASSWORD)
                memset (dispBuffer, '*', dispLen);
            else
                memcpy (dispBuffer,
                    pSLEditData->buffer + pSLEditData->startPos,
                    dispLen);

            dispBuffer [dispLen] = '\0';

            /* only implemented ES_LEFT align format for single line edit. */
            rect.left += pSLEditData->leftMargin;
            rect.top += pSLEditData->topMargin;
            rect.right -= pSLEditData->rightMargin;
            rect.bottom -= pSLEditData->bottomMargin;

#if 0        /* FIXME no ClipRectIntersect() */
#if 0
            ClipRectIntersect (hdc, &rect);
#else
            GdSetClipRects(hdc->psd,1,&rect);        /*??==ClipRectIntersect??*/
#endif
#endif

#ifdef USE_BIG5
            oldfont=SelectObject(hdc,CreateFont(12,
                        0,0,0,0,0,0,0,0,0,0,0,
                        FF_DONTCARE|DEFAULT_PITCH,
                        "HZXFONT"));
#else
                SelectObject(hdc, pSLEditData->hFont);
#endif
            TextOut (hdc, pSLEditData->leftMargin, pSLEditData->topMargin,
                dispBuffer,-1);

#ifdef USE_BIG5
                DeleteObject(SelectObject(hdc,oldfont));
#endif

            EndPaint (hWnd, &ps);

            FREEA(dispBuffer);
        }
        break;
#if 1        /* jmt+ */
        case WM_KEYDOWN:
        {
            BOOL    bChange = FALSE;
            int     i;
            RECT    InvRect;
            int     deleted;

            pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);

            switch ((int)(wParam))        /* (LOWORD (wParam)) */
            {
#if 0
                case SCANCODE_ENTER:
                    SendMessage (GetParent (hWnd), WM_COMMAND,
                            (WPARAM) MAKELONG (pCtrl->id, EN_ENTER), (LPARAM) hWnd);
                return 0;

                case SCANCODE_HOME:
                    if (pSLEditData->editPos == 0)
                        return 0;

                    pSLEditData->editPos  = 0;
                    pSLEditData->caretOff = 0;

                    SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                        + pSLEditData->leftMargin, pSLEditData->topMargin);
                    if (pSLEditData->startPos != 0)
                        InvalidateRect (hWnd, NULL, FALSE);

                    pSLEditData->startPos = 0;
                return 0;

                case SCANCODE_END:
                {
                    int newStartPos;

                    if (pSLEditData->editPos == pSLEditData->dataEnd)
                        return 0;

                    newStartPos = edtGetStartDispPosAtEnd (pCtrl, pSLEditData);

                    pSLEditData->editPos = pSLEditData->dataEnd;
                    pSLEditData->caretOff = pSLEditData->editPos - newStartPos;

                   SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                        + pSLEditData->leftMargin, pSLEditData->topMargin);
                   if (pSLEditData->startPos != newStartPos)
                        InvalidateRect (hWnd, NULL, FALSE);

                    pSLEditData->startPos = newStartPos;
                }
                return 0;
#endif

                case VK_LEFT: /* SCANCODE_CURSORBLOCKLEFT: */
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep;

                    if (pSLEditData->editPos == 0)
                        return 0;

                    if (edtIsACCharBeforePosition (pSLEditData->buffer,
                            pSLEditData->editPos))
                    {
                        scrollStep = 2;
                        pSLEditData->editPos -= 2;
                    }
                    else {
                        scrollStep = 1;
                        pSLEditData->editPos --;
                    }

                    pSLEditData->caretOff -= scrollStep;
                    if (pSLEditData->caretOff == 0
                            && pSLEditData->editPos != 0)
                    {
                        bScroll = TRUE;

                        if (edtIsACCharBeforePosition (pSLEditData->buffer,
                                pSLEditData->editPos))
                        {
                            pSLEditData->startPos -= 2;
                            pSLEditData->caretOff = 2;
                        }
                        else
                        {
                            pSLEditData->startPos --;
                            pSLEditData->caretOff = 1;
                        }
                    }
                    else if (pSLEditData->caretOff < 0)
                    {
                        pSLEditData->startPos = 0;
                        pSLEditData->caretOff = 0;
                    }

                    SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                            + pSLEditData->leftMargin, pSLEditData->topMargin);

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, FALSE);
                }
                return 0;

                case VK_RIGHT: /* SCANCODE_CURSORBLOCKRIGHT: */
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep, moveStep;

                    if (pSLEditData->editPos == pSLEditData->dataEnd)
                        return 0;

                    if (edtIsACCharAtPosition (pSLEditData->buffer,
                                pSLEditData->dataEnd,
                                pSLEditData->startPos))
                    {
                        if (edtIsACCharAtPosition (pSLEditData->buffer,
                                    pSLEditData->dataEnd,
                                    pSLEditData->editPos))
                        {
                            scrollStep = 2;
                            moveStep = 2;
                            pSLEditData->editPos  += 2;
                        }
                        else
                        {
                            scrollStep = 2;
                            moveStep = 1;
                            pSLEditData->editPos ++;
                        }
                    }
                    else
                    {
                        if (edtIsACCharAtPosition (pSLEditData->buffer,
                                    pSLEditData->dataEnd,
                                    pSLEditData->editPos))
                        {
                            if (edtIsACCharAtPosition (pSLEditData->buffer,
                                    pSLEditData->dataEnd,
                                    pSLEditData->startPos + 1))
                                scrollStep = 3;
                            else
                                scrollStep = 2;

                            moveStep = 2;
                            pSLEditData->editPos += 2;
                        }
                        else
                        {
                            scrollStep = 1;
                            moveStep = 1;
                            pSLEditData->editPos ++;
                        }
                    }

                    pSLEditData->caretOff += moveStep;
                    if (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                            > edtGetOutWidth (pCtrl))
                    {
                        bScroll = TRUE;
                        pSLEditData->startPos += scrollStep;

                        pSLEditData->caretOff =
                            pSLEditData->editPos - pSLEditData->startPos;
                    }

                    SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
                            + pSLEditData->leftMargin, pSLEditData->topMargin);

⌨️ 快捷键说明

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