📄 ebmedit.c
字号:
//fprint (stderr, "textOut-buffer = %s\n", dispBuffer+pLineData->wrapStartPos[wrapline]);
if (dwStyle & EES_AUTOWRAP)
{
TextOutLen (hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y,
dispBuffer+pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]],
pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline+1]]
-pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]]);
}
else
TextOut(hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y, dispBuffer);
}
EndPaint (hWnd, hdc);
}
break;
case MSG_KEYDOWN:
{
BOOL bChange = FALSE;
int i;
int line, wrapline;
RECT InvRect;
int deleted;
PEBLINEDATA temp = NULL;
char * tempP = NULL;
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
GetClientRect (hWnd, &InvRect);
InvRect.left = pMLEditData->leftMargin - 1;
switch (LOWORD (wParam))
{
case SCANCODE_ENTER:
{
if (dwStyle & EES_READONLY)
{
Ping();
return 0;
}
edtPosProc (hWnd);
if ((pMLEditData->totalLimit >= 0)
&& ((pMLEditData->curtotalLen + 1) > pMLEditData->totalLimit))
{
Ping ();
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_MAXTEXT);
return 0;
}
else
pMLEditData->curtotalLen++;
if (dwStyle & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}
else
pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->veditPos < pMLEditData->fit_chars)
tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos];
temp = pLineData->next;
pLineData->next = malloc( sizeof(EBLINEDATA) );
pLineData->next->previous = pLineData;
pLineData->next->next = temp;
if(temp)
temp->previous = pLineData->next;
temp = pLineData->next;
if(dwStyle & EES_AUTOWRAP)
temp->lineNO = line + 1;
else
temp->lineNO = pMLEditData->editLine + 1;
if(tempP)
{
memcpy(temp->buffer,tempP,strlen(tempP));
temp->dataEnd = strlen(tempP);
}
else
temp->dataEnd = 0;
temp->buffer[temp->dataEnd] = '\0';
pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos];
pLineData->buffer[pLineData->dataEnd]='\0';
temp = temp->next;
while (temp)
{
temp->lineNO++;
temp = temp->next;
}
if (dwStyle & EES_AUTOWRAP)
{
if (!((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline])
&& (wrapline)))
pMLEditData->editLine++;
pMLEditData->wraplines -= pLineData->nwrapline;
calcLineInfo (hWnd, pMLEditData, pLineData);
calcLineInfo (hWnd, pMLEditData, pLineData->next);
edtGetLineInfo (hWnd, pLineData->next);
pMLEditData->lines++;
pMLEditData->wraplines += pLineData->nwrapline + pLineData->next->nwrapline;
pMLEditData->veditPos=0;
if (pMLEditData->editLine > pMLEditData->EndlineDisp)
{
pMLEditData->EndlineDisp = pMLEditData->editLine;
if (pMLEditData->EndlineDisp >
pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp-1)
{
pMLEditData->StartlineDisp = pMLEditData->EndlineDisp
-pMLEditData->MaxlinesDisp + 1;
}
else
{
InvRect.top=(pMLEditData->editLine-pMLEditData->StartlineDisp -1)
*pMLEditData->lineHeight+pMLEditData->topMargin;
InvRect.bottom -= pMLEditData->lineHeight;
}
}
else
{
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp +
MIN (pMLEditData->wraplines - pMLEditData->StartlineDisp,
pMLEditData->MaxlinesDisp) - 1;
}
pMLEditData->linesDisp=pMLEditData->EndlineDisp-pMLEditData->StartlineDisp+1;
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_CHANGE);
InvalidateRect (hWnd, &InvRect, TRUE);
edtSetCaretPos (hWnd, TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
if (pMLEditData->editLine > pMLEditData->MaxlinesDisp)
NotifyParentPos(hWnd);
return 0;
}
// added by leon to optimize display
if ((pMLEditData->editLine - pMLEditData->StartlineDisp + 1)
< pMLEditData->MaxlinesDisp)
{
if (!(pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->leftMargin
> edtGetOutWidth (hWnd)))
{
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp -1)
* pMLEditData->lineHeight
+ pMLEditData->topMargin;
}
}
else
{
if ((pMLEditData->vdispPos == 0)
&& (pMLEditData->vdispPos == pMLEditData->veditPos))
InvRect.bottom -= pMLEditData->lineHeight;
}
// added by leon to optimize display
pMLEditData->veditPos = 0;
pMLEditData->vdispPos = 0;
if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)
{
pMLEditData->EndlineDisp++;
pMLEditData->linesDisp++;
}
else if(pMLEditData->editLine == pMLEditData->EndlineDisp)
{
pMLEditData->StartlineDisp++;
pMLEditData->EndlineDisp++;
}
pMLEditData->editLine++;
edtGetLineInfo (hWnd, GetLineData(pMLEditData,pMLEditData->editLine));
pMLEditData->lines++;
pMLEditData->dispPos = 0;
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
edtSetCaretPos (hWnd, TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
InvalidateRect (hWnd, &InvRect, TRUE); // modified by leon
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_CHANGE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case SCANCODE_HOME:
{
int line = 0, wrapline = 0;
BOOL bScroll = FALSE;
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
if (pMLEditData->veditPos == 0)
return 0;
if (dwStyle & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
pMLEditData->editLine -= wrapline;
if (pMLEditData->editLine < pMLEditData->StartlineDisp)
{
pMLEditData->StartlineDisp = pMLEditData->editLine;
pMLEditData->linesDisp = MIN (pMLEditData->wraplines
- pMLEditData->StartlineDisp,
pMLEditData->MaxlinesDisp);
pMLEditData->EndlineDisp =
pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;
bScroll = TRUE;
}
edtGetCaretValid (hWnd, pMLEditData->editLine, 0, 0);
edtSetCaretPos (hWnd, TRUE);
if (bScroll)
{
InvalidateRect(hWnd,NULL,TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
}
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
pMLEditData->veditPos = 0;
if (pMLEditData->vdispPos != 0)
{
pMLEditData->vdispPos = 0;
InvalidateRect (hWnd, NULL, TRUE);
}
pMLEditData->dispPos = 0;
edtSetCaretPos (hWnd, TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case SCANCODE_END:
{
int newStartPos, oldeditPos, line, wrapline;
BOOL bScroll = FALSE;
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
if (dwStyle & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}else
pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->veditPos == pMLEditData->fit_chars)
return 0;
if (dwStyle & EES_AUTOWRAP)
{
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->editLine += pLineData->nwrapline - 1 - wrapline;
if (pMLEditData->editLine > pMLEditData->EndlineDisp)
{
pMLEditData->EndlineDisp = pMLEditData->editLine;
pMLEditData->StartlineDisp =
pMLEditData->EndlineDisp - pMLEditData->MaxlinesDisp + 1;
bScroll = TRUE;
}
oldeditPos = pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[pLineData->wrapStartPos[pLineData->nwrapline-1]];
edtGetCaretValid (hWnd, pMLEditData->editLine, 0, oldeditPos);
edtSetCaretPos (hWnd, TRUE);
if (bScroll)
InvalidateRect(hWnd,NULL,TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
if (pMLEditData->vdispPos != newStartPos) {
pMLEditData->vdispPos = newStartPos;
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
InvalidateRect (hWnd, NULL, TRUE);
}
edtSetCaretPos (hWnd, TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
}
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
case SCANCODE_CURSORBLOCKLEFT:
{
BOOL bScroll = FALSE;
int newStartPos, line, wrapline;
PEBLINEDATA temp;
edtPosProc (hWnd);
if (dwStyle & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}
else
pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
if (dwStyle & EES_AUTOWRAP)
{
if (!pMLEditData->veditPos && !pMLEditData->editLine) return 0;
edtGetLineInfo (hWnd, pLineData);
if (!pMLEditData->veditPos)
{
if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
bScroll = TRUE;
pMLEditData->StartlineDisp--;
if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
pMLEditData->EndlineDisp--;
}
pMLEditData->editLine--;
temp = pLineData->previous;
edtGetLineInfo (hWnd, temp);
pMLEditData->veditPos = temp->wrapStartPos[temp->nwrapline];
}else if (pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]) {
if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
bScroll = TRUE;
pMLEditData->StartlineDisp--;
if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
pMLEditData->EndlineDisp--;
}
pMLEditData->editLine--;
pMLEditData->veditPos--;
}else
pMLEditData->veditPos--;
pMLEditData->linesDisp = pMLEditData->EndlineDisp
- pMLEditData->StartlineDisp + 1;
edtSetCaretPos (hWnd, TRUE);
if (bScroll)
{
InvalidateRect(hWnd,NULL,TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
}
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
if (!pMLEditData->veditPos)
{
temp = pLineData->previous;
if (!temp) return 0;
if(pMLEditData->editLine > 0 )
{
if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
bScroll = TRUE;
pMLEditData->StartlineDisp--;
if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
pMLEditData->EndlineDisp--;
}
pMLEditData->editLine --;
edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine));
pMLEditData->veditPos = pMLEditData->fit_chars;
newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
if (pMLEditData->vdispPos != newStartPos)
{
pMLEditData->vdispPos = newStartPos;
bScroll = TRUE;
}
}
}
else
{
if (pMLEditData->veditPos == pMLEditData->vdispPos){
pMLEditData->veditPos--;
if (edtGetNewvPos (hWnd,
GetLineData(pMLEditData,pMLEditData->editLine),
pMLEditData->dx_chars[pMLEditData->veditPos]
- edtGetOutWidth (hWnd)/4) == -1)
pMLEditData->vdispPos = 0;
else {
pMLEditData->vdispPos = edtGetNewvPos (hWnd,
GetLineData(pMLEditData,pMLEditData->editLine),
pMLEditData->dx_chars[pMLEditData->veditPos]
- edtGetOutWidth (hWnd)/4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -