📄 ebedit.c
字号:
default:
break;
}
}
}
SetTextColor (hdc, pEBEditData->textcolor);
dispLen = edtGetDispLen (hWnd);
if (dispLen == 0)
{
EndPaint (hWnd, hdc);
break;
}
dispBuffer = alloca (dispLen + 1);
if (dwStyle & EES_PASSWORD)
memset (dispBuffer, '*', dispLen);
else
memcpy (dispBuffer, pEBEditData->buffer + pEBEditData->startPos, dispLen);
dispBuffer [dispLen] = '\0';
// only implemented ES_LEFT align format for single line edit.
#if 1 //edit by tjb 2005-7-18 修改原因:文字不能居中、不能垂直居中
uFormat = DT_SINGLELINE | DT_LEFT | DT_TOP;
GetClientRect(hWnd, &rect);
rect.left += pEBEditData->leftMargin;
rect.top += pEBEditData->topMargin;
rect.right -= pEBEditData->rightMargin;
rect.bottom -= pEBEditData->bottomMargin;
if (dwStyle & EES_VCENTER)
uFormat |= DT_VCENTER;
else if(dwStyle & EES_BOTTOM)
uFormat |= DT_BOTTOM;
if(dwStyle & EES_CENTER)
uFormat |= DT_CENTER;
else if(dwStyle & EES_RIGHT)
uFormat |= DT_RIGHT;
DrawText (hdc, dispBuffer, -1, &rect, uFormat);
#else
rect.left += pEBEditData->leftMargin;
rect.top += pEBEditData->topMargin;
rect.right -= pEBEditData->rightMargin;
rect.bottom -= pEBEditData->bottomMargin;
ClipRectIntersect (hdc, &rect);
if ((dwStyle&EES_ALIGNSMASK) == EES_VCENTER)
{
int topoff;
RECT rc;
GetWindowRect(hWnd, &rc);
topoff = (RECTH(rc) - GetFontHeight(hdc))/2;
TextOut (hdc,pEBEditData->leftMargin, topoff, dispBuffer);
}
else
TextOut (hdc, pEBEditData->leftMargin, pEBEditData->topMargin, dispBuffer);
#endif
EndPaint (hWnd, hdc);
}
break;
case MSG_KEYDOWN:
{
BOOL bChange = FALSE;
int i;
RECT InvRect;
int deleted;
switch (LOWORD (wParam))
{
case SCANCODE_ENTER:
NotifyParent (hWnd, id, EEN_ENTER);
return 0;
case SCANCODE_HOME:
{
if (pEBEditData->editPos == 0)
return 0;
pEBEditData->editPos = 0;
pEBEditData->caretOff = 0;
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
POINT oldpos;
GetCaretPos(hWnd, &oldpos);
SetCaretPos (hWnd, pEBEditData->leftMargin, oldpos.y);
}
else
SetCaretPos (hWnd, pEBEditData->leftMargin, pEBEditData->topMargin);
if (pEBEditData->startPos != 0)
InvalidateRect (hWnd, NULL, TRUE);
pEBEditData->startPos = 0;
}
return 0;
case SCANCODE_END:
{
int newStartPos;
int fontsize = GetSysCharWidth();
/*PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
fontsize = GetFontCharWidth(pfont);
*/
if (pEBEditData->editPos == pEBEditData->dataEnd)
return 0;
newStartPos = edtGetStartDispPosAtEnd (hWnd, pEBEditData);
pEBEditData->editPos = pEBEditData->dataEnd;
pEBEditData->caretOff = pEBEditData->editPos - newStartPos;
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
POINT oldpos;
GetCaretPos(hWnd, &oldpos);
SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
}
else
SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, pEBEditData->topMargin);
if (pEBEditData->startPos != newStartPos)
InvalidateRect (hWnd, NULL, TRUE);
pEBEditData->startPos = newStartPos;
}
return 0;
case SCANCODE_CURSORBLOCKLEFT:
{
BOOL bScroll = FALSE;
int scrollStep;
int fontsize = GetSysCharWidth();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
fontsize = GetFontCharWidth(pfont);
if (pEBEditData->editPos == 0)
return 0;
if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos))
{
scrollStep = 2;
pEBEditData->editPos -= 2;
}
else
{
scrollStep = 1;
pEBEditData->editPos --;
}
pEBEditData->caretOff -= scrollStep;
if (pEBEditData->caretOff == 0 && pEBEditData->editPos != 0)
{
bScroll = TRUE;
if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos))
{
pEBEditData->startPos -= 2;
pEBEditData->caretOff = 2;
}
else
{
pEBEditData->startPos --;
pEBEditData->caretOff = 1;
}
}
else if (pEBEditData->caretOff < 0)
{
pEBEditData->startPos = 0;
pEBEditData->caretOff = 0;
}
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
//pEBEditData->caretOff * fontsize
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
POINT oldpos;
GetCaretPos(hWnd, &oldpos);
SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
}
else
SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin,pEBEditData->topMargin);
if (bScroll)
InvalidateRect (hWnd, NULL, TRUE);
}
return 0;
case SCANCODE_CURSORBLOCKRIGHT:
{
BOOL bScroll = FALSE;
int scrollStep, moveStep;
int fontsize = GetSysCharWidth();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
fontsize = GetFontCharWidth(pfont);
if (pEBEditData->editPos == pEBEditData->dataEnd)
return 0;
if (edtIsACCharAtPosition (pEBEditData->buffer,
pEBEditData->dataEnd, pEBEditData->startPos))
{
if (edtIsACCharAtPosition (pEBEditData->buffer,
pEBEditData->dataEnd, pEBEditData->editPos))
{
scrollStep = 2;
moveStep = 2;
pEBEditData->editPos += 2;
}
else
{
scrollStep = 2;
moveStep = 1;
pEBEditData->editPos ++;
}
}
else
{
if (edtIsACCharAtPosition (pEBEditData->buffer,
pEBEditData->dataEnd, pEBEditData->editPos))
{
if (edtIsACCharAtPosition (pEBEditData->buffer,
pEBEditData->dataEnd, pEBEditData->startPos + 1))
scrollStep = 3;
else
scrollStep = 2;
moveStep = 2;
pEBEditData->editPos += 2;
}
else
{
scrollStep = 1;
moveStep = 1;
pEBEditData->editPos ++;
}
}
pEBEditData->caretOff += moveStep;
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
//pEBEditData->caretOff * fontsize
if ( fontsize > edtGetOutWidth (hWnd,pEBEditData))
{
bScroll = TRUE;
pEBEditData->startPos += scrollStep;
pEBEditData->caretOff =
pEBEditData->editPos - pEBEditData->startPos;
}
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
//pEBEditData->caretOff * fontsize
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
POINT oldpos;
GetCaretPos(hWnd, &oldpos);
SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
}
else
SetCaretPos(hWnd, fontsize+pEBEditData->leftMargin, pEBEditData->topMargin);
if (bScroll)
InvalidateRect (hWnd, NULL, TRUE);
}
return 0;
case SCANCODE_INSERT:
pEBEditData->status ^= EEST_REPLACE;
break;
case SCANCODE_REMOVE:
{
RECT rect;
int fontsize = GetSysCharWidth();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
fontsize = GetFontCharWidth(pfont);
if ((dwStyle & EES_READONLY) || (pEBEditData->editPos == pEBEditData->dataEnd))
{
return 0;
}
if (edtIsACCharAtPosition (pEBEditData->buffer,
pEBEditData->dataEnd, pEBEditData->editPos))
deleted = 2;
else
deleted = 1;
for (i = pEBEditData->editPos; i < pEBEditData->dataEnd - deleted; i++)
pEBEditData->buffer [i] = pEBEditData->buffer [i + deleted];
pEBEditData->dataEnd -= deleted;
bChange = TRUE;
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
InvRect.left = pEBEditData->leftMargin + fontsize;
//+ pEBEditData->caretOff * fontsize;
InvRect.top = pEBEditData->topMargin;
GetClientRect(hWnd,&rect);
InvRect.right = rect.right - rect.left;
InvRect.bottom = rect.bottom- rect.top;
InvalidateRect (hWnd, &InvRect, TRUE);
}
break;
case SCANCODE_BACKSPACE:
{
RECT rect;
int fontsize = GetSysCharWidth();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
fontsize = GetFontCharWidth(pfont);
if ((dwStyle & EES_READONLY) || (pEBEditData->editPos == 0))
{
return 0;
}
if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos))
deleted = 2;
else
deleted = 1;
for (i = pEBEditData->editPos; i < pEBEditData->dataEnd; i++)
pEBEditData->buffer[i-deleted] = pEBEditData->buffer [i];
pEBEditData->dataEnd -= deleted;
pEBEditData->editPos -= deleted;
bChange = TRUE;
GetClientRect(hWnd,&rect);
pEBEditData->caretOff -= deleted;
if (pEBEditData->caretOff == 0 && pEBEditData->editPos != 0)
{
if (edtIsACCharBeforePosition (pEBEditData->buffer,
pEBEditData->editPos))
{
pEBEditData->startPos -= 2;
pEBEditData->caretOff = 2;
}
else
{
pEBEditData->startPos --;
pEBEditData->caretOff = 1;
}
InvRect.left = pEBEditData->leftMargin;
InvRect.top = pEBEditData->topMargin;
InvRect.right = rect.right - rect.left;
InvRect.bottom = rect.bottom - rect.top;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -