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

📄 editbox.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 3 页
字号:
                case DF_FWD:
                case DF_CTRL_FWD:
                    KeyBoardMarking = TextMarking = TRUE;
                    SetAnchor(wnd, wnd->CurrCol, wnd->CurrLine);
                    break;
                default:
                    break;
            }
        }
    }
}
/* ---------- page/scroll keys ----------- */
static int DoScrolling(DFWINDOW wnd, int c, DF_PARAM p2)
{
    switch (c)    {
        case DF_PGUP:
        case DF_PGDN:
            if (DfIsMultiLine(wnd))
                DfBaseWndProc(DF_EDITBOX, wnd, DFM_KEYBOARD, c, p2);
            break;
        case DF_CTRL_PGUP:
        case DF_CTRL_PGDN:
            DfBaseWndProc(DF_EDITBOX, wnd, DFM_KEYBOARD, c, p2);
            break;
        case DF_HOME:
            Home(wnd);
            break;
        case DF_END:
            End(wnd);
            break;
        case DF_CTRL_FWD:
            NextWord(wnd);
            break;
        case DF_CTRL_BS:
            PrevWord(wnd);
            break;
        case DF_CTRL_HOME:
            if (DfIsMultiLine(wnd))    {
                DfSendMessage(wnd, DFM_SCROLLDOC, TRUE, 0);
                wnd->CurrLine = 0;
                wnd->WndRow = 0;
            }
            Home(wnd);
            break;
        case DF_CTRL_END:
			if (DfIsMultiLine(wnd) &&
					wnd->WndRow+wnd->wtop+1 < wnd->wlines
						&& wnd->wlines > 0) {
                DfSendMessage(wnd, DFM_SCROLLDOC, FALSE, 0);
                SetLinePointer(wnd, wnd->wlines-1);
                wnd->WndRow =
                    min(DfClientHeight(wnd)-1, wnd->wlines-1);
                Home(wnd);
            }
            End(wnd);
            break;
        case DF_UP:
            if (DfIsMultiLine(wnd))
                Upward(wnd);
            break;
        case DF_DN:
            if (DfIsMultiLine(wnd))
                Downward(wnd);
            break;
        case DF_FWD:
            Forward(wnd);
            break;
        case DF_BS:
            Backward(wnd);
            break;
        default:
            return FALSE;
    }
    if (!KeyBoardMarking && DfTextBlockMarked(wnd))    {
        DfClearTextBlock(wnd);
        DfSendMessage(wnd, DFM_PAINT, 0, 0);
    }
    DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
    return TRUE;
}
/* -------------- Del key ---------------- */
static void DelKey(DFWINDOW wnd)
{
    char *currchar = DfCurrChar;
    int repaint = *currchar == '\n';
    if (DfTextBlockMarked(wnd))    {
        DfSendMessage(wnd, DFM_COMMAND, DF_ID_DELETETEXT, 0);
        DfSendMessage(wnd, DFM_PAINT, 0, 0);
        return;
    }
    if (DfIsMultiLine(wnd) && *currchar == '\n' && *(currchar+1) == '\0')
        return;
    strcpy(currchar, currchar+1);
    if (repaint)    {
        DfBuildTextPointers(wnd);
        DfSendMessage(wnd, DFM_PAINT, 0, 0);
    }
    else    {
        ModTextPointers(wnd, wnd->CurrLine+1, -1);
        DfWriteTextLine(wnd, NULL, wnd->WndRow+wnd->wtop, FALSE);
    }
    wnd->TextChanged = TRUE;
}
/* ------------ Tab key ------------ */
static void TabKey(DFWINDOW wnd, DF_PARAM p2)
{
    if (DfIsMultiLine(wnd))    {
        int insmd = wnd->InsertMode;
        do  {
            char *cc = DfCurrChar+1;
            if (!insmd && *cc == '\0')
                break;
            if (wnd->textlen == wnd->MaxTextLength)
                break;
            DfSendMessage(wnd,DFM_KEYBOARD,insmd ? ' ' : DF_FWD,0);
        } while (wnd->CurrCol % DfCfg.Tabs);
    }
	else
	    DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, '\t', p2);
}
/* ------------ Shift+Tab key ------------ */
static void ShiftTabKey(DFWINDOW wnd, DF_PARAM p2)
{
    if (DfIsMultiLine(wnd))    {
        do  {
            if (DfCurrChar == DfGetText(wnd))
                break;
            DfSendMessage(wnd,DFM_KEYBOARD,DF_BS,0);
        } while (wnd->CurrCol % DfCfg.Tabs);
    }
	else
	    DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, DF_SHIFT_HT, p2);
}
/* --------- All displayable typed keys ------------- */
static void KeyTyped(DFWINDOW wnd, int c)
{
    char *currchar = DfCurrChar;
    if ((c != '\n' && c < ' ') || (c & 0x1000))
        /* ---- not recognized by editor --- */
        return;
    if (!DfIsMultiLine(wnd) && DfTextBlockMarked(wnd))    {
		DfSendMessage(wnd, DFM_CLEARTEXT, 0, 0);
        currchar = DfCurrChar;
    }
    /* ---- test typing at end of text ---- */
    if (currchar == (char*)(wnd->text+wnd->MaxTextLength))    {
        /* ---- typing at the end of maximum buffer ---- */
        DfBeep();
        return;
    }
    if (*currchar == '\0')    {
        /* --- insert a newline at end of text --- */
        *currchar = '\n';
        *(currchar+1) = '\0';
        DfBuildTextPointers(wnd);
    }
    /* --- displayable char or newline --- */
    if (c == '\n' || wnd->InsertMode || *currchar == '\n') {
        /* ------ inserting the keyed character ------ */
        if (wnd->text[wnd->textlen-1] != '\0')    {
            /* --- the current text buffer is full --- */
            if (wnd->textlen == wnd->MaxTextLength)    {
                /* --- text buffer is at maximum size --- */
                DfBeep();
                return;
            }
            /* ---- increase the text buffer size ---- */
            wnd->textlen += DF_GROWLENGTH;
            /* --- but not above maximum size --- */
            if (wnd->textlen > wnd->MaxTextLength)
                wnd->textlen = wnd->MaxTextLength;
            wnd->text = DfRealloc(wnd->text, wnd->textlen+2);
            wnd->text[wnd->textlen-1] = '\0';
            currchar = DfCurrChar;
        }
        memmove(currchar+1, currchar, strlen(currchar)+1);
        ModTextPointers(wnd, wnd->CurrLine+1, 1);
        if (DfIsMultiLine(wnd) && wnd->wlines > 1)
            wnd->textwidth = max(wnd->textwidth,
                (int) (DfTextLine(wnd, wnd->CurrLine+1)-
                DfTextLine(wnd, wnd->CurrLine)));
        else
            wnd->textwidth = max((int)wnd->textwidth,
                (int)strlen(wnd->text));
        DfWriteTextLine(wnd, NULL,
            wnd->wtop+wnd->WndRow, FALSE);
    }
    /* ----- put the char in the buffer ----- */
    *currchar = c;
    wnd->TextChanged = TRUE;
    if (c == '\n')    {
        wnd->wleft = 0;
        DfBuildTextPointers(wnd);
        End(wnd);
        Forward(wnd);
        DfSendMessage(wnd, DFM_PAINT, 0, 0);
        return;
    }
    /* ---------- test end of window --------- */
    if (DfWndCol == DfClientWidth(wnd)-1)    {
        if (!DfIsMultiLine(wnd))	{
			if (!(currchar == (char*)(wnd->text+wnd->MaxTextLength-2)))
            DfSendMessage(wnd, DFM_HORIZSCROLL, TRUE, 0);
		}
		else	{
			char *cp = currchar;
	        while (*cp != ' ' && cp != (char*)DfTextLine(wnd, wnd->CurrLine))
	            --cp;
	        if (cp == (char*)DfTextLine(wnd, wnd->CurrLine) ||
	                !wnd->WordWrapMode)
	            DfSendMessage(wnd, DFM_HORIZSCROLL, TRUE, 0);
	        else    {
	            int dif = 0;
	            if (c != ' ')    {
	                dif = (int) (currchar - cp);
	                wnd->CurrCol -= dif;
	                DfSendMessage(wnd, DFM_KEYBOARD, DF_DEL, 0);
	                --dif;
	            }
	            DfSendMessage(wnd, DFM_KEYBOARD, '\n', 0);
	            currchar = DfCurrChar;
	            wnd->CurrCol = dif;
	            if (c == ' ')
	                return;
	        }
	    }
	}
    /* ------ display the character ------ */
    DfSetStandardColor(wnd);
    DfPutWindowChar(wnd, c, DfWndCol, wnd->WndRow);
    /* ----- advance the pointers ------ */
    wnd->CurrCol++;
}
/* ------------ screen changing key strokes ------------- */
static void DoKeyStroke(DFWINDOW wnd, int c, DF_PARAM p2)
{
    switch (c)    {
        case DF_RUBOUT:
			if (wnd->CurrCol == 0 && wnd->CurrLine == 0)
				break;
            Backward(wnd);
        case DF_DEL:
            DelKey(wnd);
            break;
        case DF_SHIFT_HT:
            ShiftTabKey(wnd, p2);
            break;
        case '\t':
            TabKey(wnd, p2);
            break;
        case '\r':
            if (!DfIsMultiLine(wnd))    {
                DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, c, p2);
                break;
            }
            c = '\n';
        default:
            if (DfTextBlockMarked(wnd))    {
                DfSendMessage(wnd, DFM_COMMAND, DF_ID_DELETETEXT, 0);
                DfSendMessage(wnd, DFM_PAINT, 0, 0);
            }
            KeyTyped(wnd, c);
            break;
    }
}
/* ----------- DFM_KEYBOARD Message ---------- */
static int KeyboardMsg(DFWINDOW wnd, DF_PARAM p1, DF_PARAM p2)
{
	int c = (int) p1;

	if (DfWindowMoving || DfWindowSizing || ((int)p2 & DF_ALTKEY))
		return FALSE;

	switch (c)
	{
		/* these keys get processed by lower classes */
		case DF_ESC:
		case DF_F1:
		case DF_F2:
		case DF_F3:
		case DF_F4:
		case DF_F5:
		case DF_F6:
		case DF_F7:
		case DF_F8:
		case DF_F9:
		case DF_F10:
		case DF_INS:
		case DF_SHIFT_INS:
		case DF_SHIFT_DEL:
			return FALSE;

		/* these keys get processed here */
		case DF_CTRL_FWD:
		case DF_CTRL_BS:
		case DF_CTRL_HOME:
		case DF_CTRL_END:
		case DF_CTRL_PGUP:
		case DF_CTRL_PGDN:
			break;

		default:
			/* other ctrl keys get processed by lower classes */
			if ((int)p2 & DF_CTRLKEY)
				return FALSE;
			/* all other keys get processed here */
			break;
	}

	DoMultiLines(wnd, c, p2);
	if (DoScrolling(wnd, c, p2))
	{
		if (KeyBoardMarking)
			ExtendBlock(wnd, DfWndCol, wnd->WndRow);
	}
	else if (!DfTestAttribute(wnd, DF_READONLY))
	{
		DoKeyStroke(wnd, c, p2);
		DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
	}
	else
		DfBeep();

	return TRUE;
}

/* ----------- DFM_SHIFT_CHANGED Message ---------- */
static void ShiftChangedMsg(DFWINDOW wnd, DF_PARAM p1)
{
    if (!((int)p1 & (DF_LEFTSHIFT | DF_RIGHTSHIFT)) &&
                                   KeyBoardMarking)    {
        StopMarking(wnd);
        KeyBoardMarking = FALSE;
    }
}
/* ----------- DF_ID_DELETETEXT Command ---------- */
static void DeleteTextCmd(DFWINDOW wnd)
{
    if (DfTextBlockMarked(wnd))    {
        char *bbl=DfTextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
        char *bel=DfTextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
        int len = (int) (bel - bbl);
        SaveDeletedText(wnd, bbl, len);
        wnd->TextChanged = TRUE;
        strcpy(bbl, bel);
        wnd->CurrLine = DfTextLineNumber(wnd, bbl-wnd->BlkBegCol);
        wnd->CurrCol = wnd->BlkBegCol;
        wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
        if (wnd->WndRow < 0)    {
            wnd->wtop = wnd->BlkBegLine;
            wnd->WndRow = 0;
        }
        DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
        DfClearTextBlock(wnd);
        DfBuildTextPointers(wnd);
    }
}
/* ----------- DF_ID_CLEAR Command ---------- */
static void ClearCmd(DFWINDOW wnd)
{
    if (DfTextBlockMarked(wnd))    {
        char *bbl=DfTextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
        char *bel=DfTextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
        int len = (int) (bel - bbl);
        SaveDeletedText(wnd, bbl, len);
        wnd->CurrLine = DfTextLineNumber(wnd, bbl);
        wnd->CurrCol = wnd->BlkBegCol;
        wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
        if (wnd->WndRow < 0)    {
            wnd->WndRow = 0;
            wnd->wtop = wnd->BlkBegLine;
        }

⌨️ 快捷键说明

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