📄 edit.c
字号:
}
*/
static int sleMouseMove (HWND hWnd, PSLEDITDATA sled, LPARAM lParam)
{
int mouseX, mouseY;
RECT rcClient;
BOOL refresh = TRUE;
mouseX = LOSWORD(lParam);
mouseY = HISWORD(lParam);
ScreenToClient(hWnd, &mouseX, &mouseY);
GetClientRect(hWnd, &rcClient);
if(mouseX >= 0 && mouseX < rcClient.right
&& mouseY >= 0 && mouseY < rcClient.bottom) {//in edit window
set_caret_pos (hWnd, sled, mouseX, TRUE);
if (sled->editPos == sled->selStart)
make_charpos_visible (hWnd, sled, sled->selEnd, NULL);
else
make_charpos_visible (hWnd, sled, sled->selStart, NULL);
}
else if (mouseY < 0) {
sled->nContX = 0;
sled->selStart = 0;
sled->selEnd = sled->editPos;
}
else if(mouseY >= rcClient.bottom) {
sled->selStart = sled->editPos;
sled->selEnd = sled->content.txtlen;
sled->nContX = sled->nContW - (sled->rcCont.right - sled->rcCont.left);
}
else if (mouseX < 0) {
if (sled->selEnd == sled->content.txtlen) {
set_caret_pos (hWnd, sled, 0, TRUE);
make_charpos_visible (hWnd, sled, sled->selStart, NULL);
goto quit;
}
if (sled->selStart == 0)
return 0;
shift_one_char_l (selStart);
refresh = make_charpos_visible (hWnd, sled, sled->selStart, NULL);
}
else if (mouseX >= rcClient.right) {
if (sled->selStart == 0) {
set_caret_pos (hWnd, sled, rcClient.right - 1, TRUE);
//make_charpos_visible (hWnd, sled, sled->selEnd, NULL);
//goto quit;
}
if (sled->selEnd == sled->content.txtlen)
return 0;
shift_one_char_r (selEnd);
refresh = make_charpos_visible (hWnd, sled, sled->selEnd, NULL);
}
quit:
check_caret();
if (refresh)
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}
static int
sleInsertText (HWND hWnd, PSLEDITDATA sled, const char *newtext, int inserting)
{
int deleted;
unsigned char *pIns, *content = sled->content.string;
//delete the seleted
if(sled->selStart != sled->selEnd) {
deleted = sled->selEnd - sled->selStart;
memmove (content + sled->selStart, content + sled->selEnd,
sled->content.txtlen - sled->selEnd);
sled->content.txtlen -= deleted;
sled->editPos = sled->selStart;
sled->selEnd = sled->selStart;
ShowCaret(hWnd);
if (!newtext)
inserting = 0;
}
if ( !(sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0 &&
((sled->content.txtlen + inserting) > sled->hardLimit)) {
Ping ();
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);
inserting = sled->hardLimit - sled->content.txtlen;
//return 0;
}
else if ( (sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0
&& (sled->editPos + inserting > sled->hardLimit) ) {
Ping ();
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);
inserting = sled->hardLimit - sled->editPos;
}
if (inserting > 0) {
content = testr_realloc (&sled->content, sled->content.txtlen +
inserting);
pIns = content + sled->editPos;
if ( !(sled->status & EST_REPLACE) )
memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos);
memcpy (pIns, newtext, inserting);
}
else if (inserting < 0) {
pIns = content + sled->editPos;
memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos);
content = testr_realloc (&sled->content, sled->content.txtlen +
inserting);
}
if (inserting <= 0 || !(sled->status & EST_REPLACE))
sled->content.txtlen += inserting;
else {
int add_len = inserting - sled->content.txtlen + sled->editPos;
if (add_len > 0) {
sled->content.txtlen += add_len;
sled->content.string[sled->content.txtlen] = '\0';
}
}
sled->editPos += inserting;
sled->selStart = sled->selEnd = sled->editPos;
if (!edtSetCaretPos (hWnd, sled))
InvalidateRect (hWnd, NULL, TRUE);
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
return 0;
}
static int sleInsertCbText (HWND hWnd, PSLEDITDATA sled)
{
int inserting;
unsigned char *txtBuffer;
if (GetWindowStyle(hWnd) & ES_READONLY) {
return 0;
}
inserting = GetClipBoardDataLen (CBNAME_TEXT);
txtBuffer = ALLOCATE_LOCAL (inserting);
GetClipBoardData (CBNAME_TEXT, txtBuffer, inserting);
sleInsertText (hWnd, sled, txtBuffer, inserting);
DEALLOCATE_LOCAL(txtBuffer);
return 0;
}
static int sleKeyDown (HWND hWnd, WPARAM wParam, LPARAM lParam)
{
BOOL bChange = FALSE;
DWORD dwStyle = GetWindowStyle (hWnd);
PCONTROL pCtrl = Control(hWnd);
PSLEDITDATA sled = (PSLEDITDATA) (pCtrl->dwAddData2);
switch (LOWORD (wParam)) {
case SCANCODE_ENTER:
NotifyParent (hWnd, pCtrl->id, EN_ENTER);
return 0;
case SCANCODE_HOME:
{
BOOL refresh = FALSE;
if(lParam & KS_SHIFT) {
make_pos_visible (hWnd, sled, 0);
sled->selStart = 0;
sled->selEnd = sled->editPos;
check_caret();
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
if (sled->selStart != sled->selEnd) {
ShowCaret(hWnd);
refresh = TRUE;
}
sled->editPos = 0;
sled->selStart = sled->selEnd = 0;
if (!edtSetCaretPos (hWnd, sled) && refresh)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case SCANCODE_END:
{
BOOL refresh = FALSE;
if(lParam & KS_SHIFT) {
sled->selStart = sled->editPos;
sled->selEnd = sled->content.txtlen;
check_caret();
if (make_charpos_visible (hWnd, sled, sled->selEnd, NULL))
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}
if (sled->selStart != sled->selEnd) {
ShowCaret(hWnd);
refresh = TRUE;
}
sled->editPos = sled->content.txtlen;
sled->selStart = sled->selEnd = sled->editPos;
if (!edtSetCaretPos (hWnd, sled) && refresh)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case SCANCODE_CURSORBLOCKLEFT:
{
BOOL refresh = FALSE;
if(lParam & KS_SHIFT) {
if (sled->selStart == sled->selEnd) {
sled->selStart = sled->selEnd = sled->editPos;
}
if (sled->selStart < sled->editPos ||
sled->selStart == sled->selEnd) {
if (sled->selStart > 0)
shift_one_char_l(selStart);
}
else {
shift_one_char_l(selEnd);
}
check_caret ();
make_charpos_visible (hWnd, sled, sled->selStart, NULL);
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
if (sled->editPos > 0) {
shift_one_char_l (editPos);
}
if (sled->selStart != sled->selEnd) {
ShowCaret (hWnd);
ActiveCaret (hWnd);
refresh = TRUE;
}
sled->selStart = sled->selEnd = sled->editPos;
if (!edtSetCaretPos (hWnd, sled) && refresh)
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case SCANCODE_CURSORBLOCKRIGHT:
{
BOOL refresh = FALSE;
if(lParam & KS_SHIFT) {
if(sled->selStart == sled->selEnd)
sled->selStart = sled->selEnd = sled->editPos;
if (sled->selStart == sled->selEnd ||
sled->selEnd > sled->editPos) {
if (sled->selEnd < sled->content.txtlen)
shift_one_char_r (selEnd);
}
else {
shift_one_char_r (selStart);
}
check_caret ();
make_charpos_visible (hWnd, sled, sled->selStart, NULL);
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
if (sled->editPos < sled->content.txtlen) {
shift_one_char_r (editPos);
}
if (sled->selStart != sled->selEnd) {
ShowCaret (hWnd);
ActiveCaret (hWnd);
refresh = TRUE;
}
sled->selStart = sled->selEnd = sled->editPos;
if (!edtSetCaretPos (hWnd, sled) && refresh)
InvalidateRect (hWnd, NULL, TRUE);
}
return 0;
case SCANCODE_REMOVE:
{
int oldpos = sled->editPos;
if ((dwStyle & ES_READONLY))
return 0;
if (sled->editPos == sled->content.txtlen && sled->selStart == sled->selEnd)
return 0;
if (sled->selStart == sled->selEnd &&
sled->editPos < sled->content.txtlen) {
shift_one_char_r(editPos);
}
sleInsertText (hWnd, sled, NULL, oldpos - sled->editPos);
}
break;
case SCANCODE_BACKSPACE:
{
int del;
if (dwStyle & ES_READONLY)
return 0;
if (sled->editPos == 0 && sled->selStart == sled->selEnd)
return 0;
del = - CHLENPREV( sled->content.string, (sled->content.string + sled->editPos) ); \
sleInsertText (hWnd, sled, NULL, del);
}
break;
case SCANCODE_A:
{
if (lParam & KS_CTRL) {
sleSetSel (hWnd, sled, 0, sled->content.txtlen);
}
return 0;
}
#ifdef _CLIPBOARD_SUPPORT
case SCANCODE_C:
case SCANCODE_X:
{
if (lParam & KS_CTRL && sled->selEnd - sled->selStart > 0) {
SetClipBoardData (CBNAME_TEXT, sled->content.string + sled->selStart,
sled->selEnd - sled->selStart, CBOP_NORMAL);
if (wParam == SCANCODE_X && !(GetWindowStyle(hWnd) & ES_READONLY)) {
sleInsertText (hWnd, sled, NULL, 0);
}
}
return 0;
}
case SCANCODE_V:
{
if (!(lParam & KS_CTRL))
return 0;
return sleInsertCbText (hWnd, sled);
}
#endif /* _CLIPBOARD_SUPPORT */
case SCANCODE_INSERT:
sled->status ^= EST_REPLACE;
break;
default:
break;
} //end switch
if (bChange)
NotifyParent (hWnd, pCtrl->id, EN_CHANGE);
return 0;
}
static int SLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
DWORD dwStyle;
HDC hdc;
PSLEDITDATA sled = NULL;
dwStyle = GetWindowStyle(hWnd);
if (message != MSG_CREATE)
sled = (PSLEDITDATA) GetWindowAdditionalData2 (hWnd);
switch (message) {
case MSG_CREATE:
if ( !(sled = calloc (1, sizeof (SLEDITDATA))) )
return -1;
if (sledit_init (hWnd, sled) < 0)
return -1;
break;
case MSG_DESTROY:
sledit_destroy (hWnd, sled);
free (sled);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -