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

📄 edit.c

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 C
📖 第 1 页 / 共 3 页
字号:
    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:
        return 0;

    case MSG_FONTCHANGED:
    {
        int starty;

        starty  = sled->topMargin + ( sled->rcCont.bottom - sled->rcCont.top - 
                    GetWindowFont (hWnd)->size - 1 ) / 2;

        sled->editPos = 0;

        DestroyCaret (hWnd);
        CreateCaret (hWnd, NULL, 1, GetWindowFont (hWnd)->size);
        SetCaretPos (hWnd, sled->leftMargin, starty);
        InvalidateRect (hWnd, NULL, TRUE);
        return 0;
    }

    case MSG_SETCURSOR:
        if (dwStyle & WS_DISABLED) {
            SetCursor (GetSystemCursor (IDC_ARROW));
            return 0;
        }
        break;

    case MSG_KILLFOCUS:
        if (sled->status & EST_FOCUSED) {
            BOOL refresh = FALSE;

            sled->status &= ~EST_FOCUSED;
            HideCaret (hWnd);
            if ( sled->selStart != sled->selEnd || (dwStyle & ES_TIP && sled->content.txtlen <= 0)) {
                refresh = TRUE;
            }
            if (sled->selStart != sled->selEnd && !(dwStyle & ES_NOHIDESEL))
                sled->selStart = sled->selEnd = sled->editPos;

            if (refresh)
                InvalidateRect (hWnd, NULL, TRUE);

            NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_KILLFOCUS);
        }
        break;
 
    case MSG_SETFOCUS:
        if (sled->status & EST_FOCUSED)
            break;
        
        sled->status |= EST_FOCUSED;

        ActiveCaret (hWnd);
        ShowCaret(hWnd);

        if (dwStyle & ES_AUTOSELECT) {
            if (sleSetSel (hWnd, sled, 0, sled->content.txtlen) <= 0 && dwStyle & ES_TIP)
                InvalidateRect (hWnd, NULL, TRUE);
            if (lParam == 1)
                sled->status |= EST_TMP;
        }
        else if ( (dwStyle & ES_NOHIDESEL && sled->selStart != sled->selEnd)
                    || (dwStyle & ES_TIP && sled->content.txtlen <= 0)) {
            InvalidateRect (hWnd, NULL, TRUE);
        }

        NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_SETFOCUS);
        break;
        
    case MSG_ENABLE:
        if ( (!(dwStyle & WS_DISABLED) && !wParam)
                || ((dwStyle & WS_DISABLED) && wParam) ) {
            if (wParam)
                ExcludeWindowStyle(hWnd,WS_DISABLED);
            else
                IncludeWindowStyle(hWnd,WS_DISABLED);

            InvalidateRect (hWnd, NULL, TRUE);
        }
        return 0;

    case MSG_GETTEXTLENGTH:
        return sled->content.txtlen;
    
    case MSG_GETTEXT:
    {
        char*   buffer = (char*)lParam;
        int     len;

        len = MIN ((int)wParam, sled->content.txtlen);
        memcpy (buffer, sled->content.string, len);
        buffer [len] = '\0';
        return len;
    }

    case MSG_SETTEXT:
    {
        if (lParam == 0)
            return -1;

        sledit_settext (sled, (const char*)lParam);

        sled->editPos  = 0;
        sled->selStart = sled->selEnd = 0;

        SetCaretPos (hWnd, sled->leftMargin, sled->starty);

        InvalidateRect (hWnd, NULL, TRUE);
        return 0;
    }

    case MSG_KEYDOWN:
    {
        return sleKeyDown (hWnd, wParam, lParam);
    }

    case MSG_CHAR:
    {
        unsigned char charBuffer [2];
        int chars;

        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) //FIXME
                return 0;
        }

        sleInsertText (hWnd, sled, charBuffer, chars);
        return 0;
    }

    case MSG_LBUTTONDBLCLK:
        sleSetSel (hWnd, sled, 0, sled->content.txtlen);
        NotifyParent (hWnd,  GetDlgCtrlID(hWnd), EN_DBLCLK);
        break;
        
    case MSG_LBUTTONDOWN:
    {
        if ( sled->status & EST_TMP) {
            sled->status &= ~EST_TMP;
            break;
        }

        if (HISWORD(lParam) < sled->rcCont.top || HISWORD(lParam) > sled->rcCont.bottom)
            break;

        set_caret_pos (hWnd, sled, LOSWORD(lParam), FALSE);

        ActiveCaret (hWnd);
        ShowCaret(hWnd);
        SetCapture(hWnd);

        InvalidateRect(hWnd, NULL, TRUE);
        NotifyParent (hWnd,  GetDlgCtrlID(hWnd), EN_CLICKED);

        break;
    }
 
    case MSG_NCLBUTTONUP:
    case MSG_LBUTTONUP:
        if (GetCapture() == hWnd)
            ReleaseCapture();
        break;

    case MSG_MOUSEMOVE:
    {
        if (GetCapture () == hWnd)
            sleMouseMove (hWnd, sled, lParam);
        return 0;
    }
        
    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:
    case EM_GETSELPOS:
    {
        int nr_chars, pos;
        int* line_pos = (int *)wParam;
        int* char_pos = (int *)lParam;

        if (message == EM_GETSELPOS)
            pos = (sled->editPos == sled->selStart) ? sled->selEnd : sled->selStart;
        else
            pos = sled->editPos;
        nr_chars = GetTextMCharInfo (GetWindowFont (hWnd), 
                                     sled->content.string, pos, NULL);

        if (line_pos) *line_pos = 0;
        if (char_pos) *char_pos = nr_chars;

        return pos;
    }

    case EM_SETCARETPOS:
    case EM_SETSEL:
    {
        int char_pos = (int)lParam;
        int nr_chars, pos;
        int *pos_chars;

        if (char_pos < 0)
            return -1;

        pos_chars = ALLOCATE_LOCAL (sled->content.txtlen * sizeof(int));
        nr_chars = GetTextMCharInfo (GetWindowFont (hWnd), 
                        sled->content.string, sled->content.txtlen, pos_chars);

        if (char_pos > nr_chars) {
            DEALLOCATE_LOCAL (pos_chars);
            return -1;
        }

        if (char_pos == nr_chars)
            pos = sled->content.txtlen;
        else
            pos = pos_chars[char_pos];

        DEALLOCATE_LOCAL (pos_chars);

        if (message == EM_SETCARETPOS) {
            sled->editPos = pos;
            sled->selStart = sled->selEnd = 0;
            edtSetCaretPos (hWnd, sled);
            return sled->editPos;
        }
        else {
            int start, end;
            if (sled->editPos < pos) {
                start = sled->editPos;
                end = pos;
            }
            else {
                start = pos;
                end = sled->editPos;
            }
            return sleSetSel (hWnd, sled, start, end);
        }
    }

    case EM_SETREADONLY:
        if (wParam)
            IncludeWindowStyle (hWnd, ES_READONLY);
        else
            ExcludeWindowStyle (hWnd, ES_READONLY);
        return 0;
 
    case EM_SETPASSWORDCHAR:
        if (sled->passwdChar != (int)wParam) {
            if (dwStyle & ES_PASSWORD) {
                sled->passwdChar = (int)wParam;
                InvalidateRect (hWnd, NULL, TRUE);
            }
        }
        return 0;
 
    case EM_GETPASSWORDCHAR:
    {
        if (lParam)
            *((int*)lParam) = sled->passwdChar;
        return 0;
    }
    
    case EM_LIMITTEXT:
    {
        int newLimit = (int)wParam;
        
        if (newLimit >= 0) {
            if (sled->content.buffsize < newLimit)
                sled->hardLimit = -1;
            else
                sled->hardLimit = newLimit;
        }
        return 0;
    }
    
    case EM_GETTIPTEXT:
    {
        int len, tip_len;
        char *buffer = (char *)lParam;

        if (!(dwStyle & ES_TIP))
            return -1;

        tip_len = strlen (sled->tiptext);

        if (!buffer)
            return tip_len;

        if (wParam >= 0)
            len = (wParam > DEF_TIP_LEN) ? DEF_TIP_LEN : wParam;
        else
            len = DEF_TIP_LEN;

        strncpy (buffer, sled->tiptext, len);
        buffer[len] = '\0';

        return tip_len;
    }

    case EM_SETTIPTEXT:
    {
        int len;

        if (!(dwStyle & ES_TIP) || !lParam)
            return -1;

        if (wParam >= 0)
            len = (wParam > DEF_TIP_LEN) ? DEF_TIP_LEN : wParam;
        else
            len = DEF_TIP_LEN;
        strncpy (sled->tiptext, (char *)lParam, len);
        sled->tiptext[len] = '\0';

        if (sled->content.txtlen <= 0)
            InvalidateRect (hWnd, NULL, TRUE);

        return strlen(sled->tiptext);
    }

    case EM_GETSEL:
    {
        char *buffer = (char *)lParam;
        int len;

        if (!buffer || sled->selEnd - sled->selStart <= 0)
            return 0;

        if (wParam < 0)
            len = sled->selEnd - sled->selStart;
        else
            len = MIN(sled->selEnd - sled->selStart, (int)wParam);

        strncpy (buffer, sled->content.string + sled->selStart, len); 

        return len;
    }

    case EM_INSERTCBTEXT:
    {
        return sleInsertCbText (hWnd, sled);
    }

    case EM_COPYTOCB:
    case EM_CUTTOCB:
    {
        if (sled->selEnd - sled->selStart > 0) {
            SetClipBoardData (CBNAME_TEXT, sled->content.string + sled->selStart, 
                        sled->selEnd - sled->selStart, CBOP_NORMAL);
            if (message == EM_CUTTOCB && !(GetWindowStyle(hWnd) & ES_READONLY)) {
                sleInsertText (hWnd, sled, NULL, 0);
            }
            return sled->selEnd - sled->selStart;
        }
        return 0;
    }

    default:
        break;

    } // end switch

    return DefaultControlProc (hWnd, message, wParam, lParam);
}

#endif /* _CTRL_SLEDIT */

⌨️ 快捷键说明

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