📄 medit.c
字号:
{
int i;
char dispBuffer [LEN_MLEDIT_BUFFER+1];
RECT rect;
DWORD dwStyle = GetWindowStyle(hWnd);
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
HDC hdc;
PLINEDATA pLineData;
hdc = BeginPaint (hWnd);
GetClientRect (hWnd, &rect);
if (dwStyle & ES_BASELINE) {
SetPenColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF));
for (i = 0; i < pMLEditData->MaxlinesDisp; i++)
DrawHDotLine (hdc,
pMLEditData->leftMargin,
pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1,
RECTW (rect) - pMLEditData->leftMargin - pMLEditData->rightMargin);
}
rect.left += pMLEditData->leftMargin;
rect.top += pMLEditData->topMargin ;
rect.right -= pMLEditData->rightMargin;
rect.bottom -= pMLEditData->bottomMargin;
ClipRectIntersect (hdc, &rect);
if (dwStyle & WS_DISABLED)
SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DIS));
else
SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF));
SetBkMode (hdc, BM_TRANSPARENT);
for (i = pMLEditData->StartlineDisp;
i <= pMLEditData->EndlineDisp; i++) {
int y, line=i, wrapline=0;
if (dwStyle & ES_AUTOWRAP)
edtGetLineNums (pMLEditData, i, &line, &wrapline);
pLineData= GetLineData(pMLEditData, line);
if (pLineData == NULL)
break;
edtGetLineInfo (hWnd, pLineData);
if (dwStyle & ES_AUTOWRAP) {
if (pMLEditData->fit_chars == 0 &&
pMLEditData->EndlineDisp >= pMLEditData->wraplines) {
//FIXME
continue;
}
}
else {
if (pMLEditData->fit_chars == 0 &&
pMLEditData->EndlineDisp >= pMLEditData->lines) {
//FIXME
continue;
}
}
if (dwStyle & ES_PASSWORD)
memset (dispBuffer, pMLEditData->passwdChar, pLineData->dataEnd);
memcpy (dispBuffer,
pLineData->buffer,
pLineData->dataEnd);
dispBuffer[pLineData->dataEnd] = '\0';
y = pMLEditData->lineHeight*
(i - pMLEditData->StartlineDisp)
+ pMLEditData->topMargin;
//fprint (stderr, "textOut-buffer = %s\n", dispBuffer+pLineData->wrapStartPos[wrapline]);
if (dwStyle & ES_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);
}
/* ----------------------------------- key process --------------------------------------- */
static int edtKeyEnter (HWND hWnd)
{
DWORD dwStyle = GetWindowStyle(hWnd);
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
PLINEDATA pLineData;
int line, wrapline;
char * tempP = NULL;
PLINEDATA temp = NULL;
RECT InvRect;
GetClientRect (hWnd, &InvRect);
InvRect.left = pMLEditData->leftMargin - 1;
if (dwStyle & ES_READONLY) {
Ping();
return 0;
}
edtPosProc (hWnd);
if ((pMLEditData->totalLimit >= 0)
&& ((pMLEditData->curtotalLen + 1) > pMLEditData->totalLimit)) {
Ping ();
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);
return 0;
}else
pMLEditData->curtotalLen++;
if (dwStyle & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}else
pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
if (dwStyle & ES_AUTOWRAP)
{
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->veditPos < pMLEditData->fit_chars)
tempP = pLineData->buffer +
pMLEditData->pos_chars[pMLEditData->veditPos];
temp = pLineData->next;
pLineData->next = malloc( sizeof(LINEDATA) );
pLineData->next->previous = pLineData;
pLineData->next->next = temp;
if(temp)
temp->previous = pLineData->next;
temp = pLineData->next;
temp->lineNO = line + 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 (!((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), EN_CHANGE);
InvalidateRect (hWnd, &InvRect, TRUE);
edtSetCaretPos (hWnd);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->veditPos < pMLEditData->fit_chars)
tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos];
temp = pLineData->next;
pLineData->next = malloc( sizeof(LINEDATA) );
pLineData->next->previous = pLineData;
pLineData->next->next = temp;
if(temp)
temp->previous = pLineData->next;
temp = pLineData->next;
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;
}
// 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);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
InvalidateRect (hWnd, &InvRect, TRUE); // modified by leon
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
static int edtKeyCursorblockLeft (HWND hWnd)
{
DWORD dwStyle = GetWindowStyle(hWnd);
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
BOOL bScroll = FALSE;
int newStartPos, line, wrapline;
PLINEDATA temp;
PLINEDATA pLineData;
edtPosProc (hWnd);
if (dwStyle & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}
else
pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
if (dwStyle & ES_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);
if (bScroll)
{
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
InvalidateRect(hWnd,NULL,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]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -